Skip to content

UX foundation: universal Options, contextual Select and active-game multitasking #167

Description

@EriArk

Product decision (9 October 2026)

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.

Experience

  • Options uses most of the viewport (approximately 85–95% of the safe screen area) with the origin dimly visible, not the existing narrow HomeMenuCard list. 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).
  • 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

Implementation boundaries and review

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.

Related existing work: #25, #49, #79, #88, #101, #111, #112, #127, #130–#135, #156–#160.

Acceptance

  • A user can predict A / Select / Home-Options / Start across shell and gameplay.
  • Shell Options is universal, rather than quietly varying based on the current TrainerOS screen; local Select is contextual.
  • Game Options is a full-featured large session surface with preserved global notifications.
  • Live game → Options → minimize → Social/respond → return to same process is proven on supported devices/runtimes without accidental exit/save rewrite.
  • Invite and notification actions from multiple entry points resolve to the same authorized identities and existing services.
  • Controller, touch, handheld, TV, privacy, DND, reduced motion, loss/recovery and protected-save checks cover the reconciled experience.
  • Updated active docs/help distinguish accepted behavior from older compact-menu/historical screenshots and behavior.

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions