Skip to content

Launcher UI overhaul: the accepted UI and UX issues and PRs in one change - #1097

Merged
v0lumehi merged 38 commits into
mainfrom
v0lumehi/ui-overhaul
Nov 10, 2026
Merged

v0lumehi merged 38 commits into
mainfrom
v0lumehi/ui-overhaul

Conversation

@v0lumehi

Copy link
Copy Markdown
Collaborator

Fix or feature

  • Fix
  • Feature

Feature agreed between the maintainers. It takes the accepted UI and UX issues and PRs in one change.

What and why

Problem. About 90 open launcher issues and PRs overlapped and pulled the UI in different directions. Many PRs needed a rebase.
Change. One coherent pass over the Mac launcher, its console mode and the iOS shell, in the existing design. Contributor code is taken over with credit as co-author.

Main points: Light and System appearance, settings in four sections, game options in four groups, a build queue, game data transfers, save import and export, players, cloud save conflicts, stick deadzones, a supported games list, Spanish, Korean and Brazilian Portuguese, and a console mode you can use from the couch: home rows, game pages, search, and a Home menu that pauses a game in the background.

Details

Issues and PRs in this change

Library and artwork: #301 #688 #784 #827 #895 #937 #953 #992 #1012 #1057 #661 #849 #868 #871 #896 #958 #959 #1013

Game options and performance: #544 #675 #680 #1043 #282 #670 #1044 #453

Settings and setup: #678 #683 #686 #696 #735 #996 #1017 #1062 #820 #839 #1009

Builds, queue and status: #676 #934 #943 #944 #951 #966 #997 #1004 #1005 #1010 #1030 #1059 #969 #1007 #1028 #1051 #232

Controllers and console mode: #454 #591 #797 #987 #1025 #1033 #624 #874 #901 #816 #952

iOS shell: #622 #637 #664 #697 #991 #1026 #1067 #658

Saves and players: #411 #553 #864 #907 #957 #1041 #920 #931 #961

Shared app and transfers: #270 #271 #899 #994 #1036 #1049 #884 #886 #900 #1027

Languages: #547 #885 #988

Credit

Code from: @thehobbit85, @Haseenesss, @zatteogit, @Koshindai, @loki-inu, @rborkow, @LNPANDY, @ZhaowTao, @MartinMajewski, @mbanusic, @TeeJayBaker. Each one is a co-author (last commit).
Console mode: the interaction comes from #901 by @Haseenesss, the structure from #816 by @Koshindai, the Home menu idea from #952 by @Haseenesss. All three are drawn in the existing console look.
Ideas: @IUMonster (#658, Hold or Toggle per touch key), @zatteogit (#453, settings that differ from the tested value).

Engine patches

0107 to 0122 in patches/ (renumbered after main's 0106). New ones: 0115 console in the game manifest (#696), 0116 stand-in icon (#784), 0117 BC6H as RGB9E5 (#544), 0118 touch rows for a game's own app (#991), 0119 stick deadzones (#1025), 0120 and 0121 touch keys that toggle (#658), 0122 Home menu and background pause (#952). They are Upstream-Status: pending. The seedds/nxnative PRs follow.

Behavior changes worth knowing

  • Console mode: A on a tile opens the game page, X plays at once. + opens the menu, − the quick menu. Buttons follow the letters on the controller (Swap A and B for Switch players).
  • A short press of Home in a game started from console mode opens the Home menu. Holding Home still asks to quit.
  • Stop in the build queue pauses the queue.
  • "Free space…" moved from the Manage menu to Settings > Tools > Build files.
  • Console mode stays dark in every appearance.

Not taken from the source PRs

#901: the battery appearance page and the notch screen fill. #816: phase 2 lives in #952. #1009: Skip no longer forgets saved keys.

Checked

Screenshots

Before (main) and after, English:

Library before Library after

Library in Light

Library in Dark

Build page in Light

Settings General in Light

Game options in Light

Supported games

Console mode home rows

Console mode game page

Home menu over a game

Console prompt over the desktop in Light

v0lumehi and others added 30 commits November 9, 2026 21:03
…texture size, touch rows and stick deadzones
…kept by the launcher, test and translation fixes
The scan kept the name an entry had, so a raw title ID or a name read from a file like 'Batman Arkham Knight [ID][v0] (0.01 GB).nsz' stayed. The name now drops a size like a tag, falls back to the package name instead of a title ID, and the scan replaces such a name on an entry without a Mac app.
…e top bar

Light no longer reuses the cream roles of Dark. New LauncherPalette tokens give
Light a near-black primary action with white text, light gray secondary buttons
and pop-ups, white segment pills on a gray track, gray or near-black switch
tracks with a white knob and white selectable cards with a near-black border
and radio. The page is F2F1EE with white cards. Every new token resolves to the
value Dark drew before, so Dark is unchanged.

The Switch 2 badge uses the attention color in Light. Sheets, onboarding and the
controllers sheet use the tokens. The console mode resolves Dark tokens in every
appearance and its window is Dark while it shows.

The top bar has the page color and sits above the scrolled page. ScrollMemory
puts a page top below the scroll view's top inset instead of at 0, which hid
the first rows under the top bar.
The catalogue banner was saved at 1600 pixels, half of what a 1440 to 1920 pt
hero needs on a Retina screen. The store now downloads the original without a
size suffix (2000 x 1000) and falls back to the 1600 pixel size when it is
missing. A banner saved at 1600 before is replaced once, and a missing
original is recorded so it is not asked for again.

The hero never draws the 640 pixel card thumbnail while its own decode is not
ready, and draws with high quality interpolation. LauncherView+Library also
takes the Light primary button style and the Switch 2 badge color.
Buttons go by the letters printed on the controller (A confirms, B goes
back, Y opens a game's options, + and - open the menu), with Swap A and
B in menus on the mapping page. B on the home screen and Leave console
mode ask first, with Cancel focused. The menu holds Library, Controllers
and General, as the desktop's Settings groups them. A game's options
show the common ones first, the rest under Advanced, mods, cheats, the
cloud save state and Reset (asked first). A game without a build offers
Open on the desktop. Button mapping is a full page with the controller
drawing ported from the iOS shell and applies only on Save. Controller
settings have rumble strength and a rumble test. Sliders take left and
right only after A. The focused game's art is sharp at the top right
and darker bottom left. A panel over a full page keeps that page drawn,
and changing an option no longer re-reads the save log.

Left out: the battery appearance page, the notch screen fill, the
build chip (ours stays), the light panes and the menu button in the
top bar, and #901's other visual changes.

Co-authored-by: Haseenesss <Haseenesss@gmail.com>
A selected key in the touch layout editor gets a Hold / Toggle choice
beside its reset button. Toggle keys are kept with the layout and passed
to every game as DM_TOUCH_TOGGLE. Patch 0119 makes the engine turn such a
key on with one tap and off with the next, drawn pressed while on.
VoiceOver reads each key's mode and offers an action to switch it.
In the Mac game options sheet and the iOS game settings, a setting whose
value differs from the game profile's tested default gets a small amber
dot before its label, read by VoiceOver as Changed from the tested value.
The Mac sheet shows Use tested values at its top while one differs. It
asks first, says how many settings change, and keeps the focus on Cancel.
It runs the existing per-setting reset and replaces the footer's Reset to
tested defaults. LauncherConfirmSheet is the 560 pt question it uses.
Nothing is removed on its own. A game with a build folder gets Remove
build files with the size a removal frees in its Manage menu, and
Settings > Tools gets a Build files card: every game with build files,
largest first, its size, Remove, and the total. Both ask first in a
560 pt sheet with Cancel focused, and neither works while that game
builds. Sizes are measured off the main thread. The removal reuses the
Free space code: every part of the folder goes, the logs, the profile,
saves, converted NSPs and the protected paths stay, so the game keeps
working.
The top bar gets a menu button in the controller chips' style. A game
starts with console mode still full screen, as the host now enters its
own full screen on the active Space (seedds/nxnative#665). The update
question starts on Cancel, as Leave and Reset do. The Joy-Con split
switch shows only while a Joy-Con is connected. A list that scrolls
fades over 24 pt into the page colour at its bottom. Console tiles
decode the cover at 1024 pixels instead of the desktop card's 640.

Co-authored-by: Haseenesss <Haseenesss@gmail.com>
A game's own app has no touch layout editor. Patch 0120 adds Keys that
toggle to its in-game menu: one checkmark per single key, applied at once
and saved for the next start as the same DM_TOUCH_TOGGLE value the
shell's editor writes. The shared app shows no entry and keeps its editor.
The Manage menu loses Free space. Its per-part sheet now opens from
Details next to Remove on each row of Settings > Tools > Build files, and
the card measures again when it closes. The removal question says what it
frees and what stays: logs, saves of development builds and converted
game files.
This was referenced Nov 10, 2026
@v0lumehi
v0lumehi merged commit 4ff8fee into main Nov 10, 2026
18 checks passed
MartinMajewski added a commit to MartinMajewski/NX2Apple that referenced this pull request Nov 10, 2026
…or the drive is HFS+

Patch 0112 (from LNPANDY#920, merged through LNPANDY#1097) keeps a game's save in
~/Library when its game library is on a drive that can't hold saves.
The review of LNPANDY#920 found three cases where it still loses progress, and
the fixes never reached main. Patch 0124 adds them:

- The launcher records which folder it last started the game from and
  brings that whole save along when the folder changes, so an older
  copy no longer wins after a library moves between drives.
- The copy is all or nothing. An older save in the destination is kept
  aside, and a failed copy stops the launch with an alert and is tried
  again on the next start.
- HFS+, which doesn't report the clone and swap bits, now falls back
  as the README says.

The device save (<save>_device) moves with the save, and a save folder
the launcher passes in DM_SAVE is used as it is and recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MartinMajewski added a commit to MartinMajewski/NX2Apple that referenced this pull request Nov 11, 2026
…or the drive is HFS+

Patch 0112 (from LNPANDY#920, merged through LNPANDY#1097) keeps a game's save in
~/Library when its game library is on a drive that can't hold saves.
The review of LNPANDY#920 found three cases where it still loses progress, and
the fixes never reached main. Patch 0133 adds them:

- The launcher records which folder it last started the game from and
  brings that whole save along when the folder changes, so an older
  copy no longer wins after a library moves between drives.
- The copy is all or nothing. An older save in the destination is kept
  aside, and a failed copy stops the launch with an alert and is tried
  again on the next start.
- HFS+, which doesn't report the clone and swap bits, now falls back
  as the README says.

The device save (<save>_device) moves with the save, and a save folder
the launcher passes in DM_SAVE is used as it is and recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MartinMajewski added a commit to MartinMajewski/NX2Apple that referenced this pull request Nov 13, 2026
…or the drive is HFS+

Patch 0031-mac-library-folder (0010 and 0112 from LNPANDY#920 and LNPANDY#1097, squashed) keeps a game's save in
~/Library when its game library is on a drive that can't hold saves.
The review of LNPANDY#920 found three cases where it still loses progress, and
the fixes never reached main. Patch 0046 adds them:

- The launcher records which folder it last started the game from and
  brings that whole save along when the folder changes, so an older
  copy no longer wins after a library moves between drives.
- The copy is all or nothing. An older save in the destination is kept
  aside, and a failed copy stops the launch with an alert and is tried
  again on the next start.
- HFS+, which doesn't report the clone and swap bits, now falls back
  as the README says.

The device save (<save>_device) moves with the save, and a save folder
the launcher passes in DM_SAVE is used as it is and recorded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

accessibility Barrier affecting people with disabilities ci Workflows and repository tooling documentation Improvements or additions to documentation enhancement New feature or request ios iPhone or iPad launcher The NX2Apple launcher app mac Mac patch-queue Changes the patch queue or the upstream pin windows Windows (the Qt front end)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant