You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
UX foundation: universal Options, contextual Select and active-game multitasking #167
Give TrainerOS one coherent controller-first interaction philosophy, rather than accumulating unrelated small menus.
Control / context
Contract
A
Primary action on the focused item; a playable game launches directly.
Select (inside TrainerOS)
Contextual actions for the current focus/screen (game card, person, conversation, collection, companion, etc.).
Physical Home/Guide (inside TrainerOS)
A large universal overlay, working title Options, for cross-system activity, communication and notifications. Not a menu whose content is rebuilt for each page.
Physical Home/Guide (inside a running game)
A large Game Options page for the current owned session, because normal controller buttons belong to the game.
Start (inside TrainerOS)
Device/system operations (settings, radios, power, switch Trainer). Remains separate; do not hijack a game's Start.
B
Back / close / cancel; no implicit Exit.
The existing Home primary page retains its name; Options is the tentative user-facing name for the overlay opened by the physical Home button, not a new sixth primary tab. Keep L1/R1 and L2/R2 routing (#111) and the existing warm material/chassis identity.
In the shell, the same universal capabilities are reachable regardless of which primary/face is underneath. Context-specific operations belong to Select and other local controls, not a different Options menu per shell page.
During a game, Game Options shows real title/art/session identity, Continue, Minimize / return to TrainerOS, multiplayer/game-party, supported per-game graphics/actions, Exit game, active communications and notifications.
A minimized session remains running and can be brought back without relaunch or ordinary-save/savestate substitution. Pausing while minimized is runtime/capability-aware; multiplayer must not be frozen.
Starting a multiplayer invitation from Home's selected game, a library card, a conversation or the running game reuses the same GameParty/Play Together machinery, prefilled with the already-known game, person/group or actual live session.
Notifications and confirmed achievement toasts can appear over live play without stealing game input. The notification inbox remains accessible through Options during play as well as in the shell.
Hard constraints
One implementation of actions/providers/parties/calls/notifications; different entry points only supply context.
Preserve active-session identity, current Trainer, per-collection selection, focus, B/Home dismissal and protected operations. Async events must not retarget actions or move A onto Exit.
Reuse the current ShellController, AdventureExitPresentation, AdventureOverlayService, HomeMenuCard, Main.qml and the live session/launch controllers where appropriate; replace their presentation/dispatch contracts deliberately rather than adding another independent menu. Keep service operations behind controllers, not QML file writes or emulator commands.
Separate issues will cover the shell Options surface, Select grammar, Game Options presentation, safe minimize/resume, Play Together entry contexts and passive notification surfaces. This issue captures the cross-cutting policy and final product review; it does not itself claim delivery.
Existing work retained, not duplicated:#25 owns verified achievement popups and jingle; #49 owns explicit safe Exit; #112 owns Home interception and existing game appearance controls; #127–#135 own the party, invitation/consent and incoming-activity semantics; #79 owns system sleep; #156–#160 own TV profile adaptation.
Suggested delivery dependency: #168/#169 and compositor/input contracts → #170/#171 → #172/#173 integration → end-to-end handheld/TV acceptance. The UX can be iterated without waiting on unrelated netplay providers.
Game-specific experience encapsulation (owner decision, 9 October 2026)
Beyond Options/Select, the two existing game-facing shell slots Companions and Trainer are adapter/experience-driven in labels, secondary faces and real contents. Do not bake Pokémon screens/badges into the shell. The current selected Home Adventure chooses the shell experience; a live minimized/running game binds its Game Options extensions to the actual session independently. Persistent local TrainerOS user identity and generic Social, Options and system services remain global.
Reconcile existing #89/#90/#92/#111 rather than building a parallel adapter or save framework. Do not change #168's universal shell Options by current page/game; only Select and in-game Game Options accept game-specific extensions.
Product decision (9 October 2026)
Give TrainerOS one coherent controller-first interaction philosophy, rather than accumulating unrelated small menus.
The existing Home primary page retains its name; Options is the tentative user-facing name for the overlay opened by the physical Home button, not a new sixth primary tab. Keep L1/R1 and L2/R2 routing (#111) and the existing warm material/chassis identity.
Experience
HomeMenuCardlist. Real handheld and TV profiles recompose separately (TV UI foundation: introduce a real ten-foot responsive layout system, not 960x540 stretching #156–Acceptance: independent image/software updates and true handheld/TV parity across install modes #160).Hard constraints
Implementation boundaries and review
Reuse the current
ShellController,AdventureExitPresentation,AdventureOverlayService,HomeMenuCard,Main.qmland the live session/launch controllers where appropriate; replace their presentation/dispatch contracts deliberately rather than adding another independent menu. Keep service operations behind controllers, not QML file writes or emulator commands.Separate issues will cover the shell Options surface, Select grammar, Game Options presentation, safe minimize/resume, Play Together entry contexts and passive notification surfaces. This issue captures the cross-cutting policy and final product review; it does not itself claim delivery.
Related existing work: #25, #49, #79, #88, #101, #111, #112, #127, #130–#135, #156–#160.
Acceptance
Child issue tracker (created 9 October 2026)
Existing work retained, not duplicated: #25 owns verified achievement popups and jingle; #49 owns explicit safe Exit; #112 owns Home interception and existing game appearance controls; #127–#135 own the party, invitation/consent and incoming-activity semantics; #79 owns system sleep; #156–#160 own TV profile adaptation.
Suggested delivery dependency: #168/#169 and compositor/input contracts → #170/#171 → #172/#173 integration → end-to-end handheld/TV acceptance. The UX can be iterated without waiting on unrelated netplay providers.
Game-specific experience encapsulation (owner decision, 9 October 2026)
Beyond Options/Select, the two existing game-facing shell slots Companions and Trainer are adapter/experience-driven in labels, secondary faces and real contents. Do not bake Pokémon screens/badges into the shell. The current selected Home Adventure chooses the shell experience; a live minimized/running game binds its Game Options extensions to the actual session independently. Persistent local TrainerOS user identity and generic Social, Options and system services remain global.
Reconcile existing #89/#90/#92/#111 rather than building a parallel adapter or save framework. Do not change #168's universal shell Options by current page/game; only Select and in-game Game Options accept game-specific extensions.