Skip to content

Plugin store: two-step focus on store cards reads as a broken install/uninstall button #555

Description

@matmartinez

Summary

First off — thanks for OpenGamepadUI, it's a joy to build for. I work in UI design, so please take this as a friendly two cents rather than a complaint; you know your constraints far better than I do.

On a plugin store card, activating install/uninstall takes two A presses, and the first press gives feedback that looks like the action already happened. The result is that the install/uninstall button reads as broken: you focus the card, press A, see the button visually react, and conclude nothing (or something wrong) happened — when in fact the first press only moved focus into the card, and a second A is required to actually trigger the button.

This is working as designed (see below), but from a usability angle it's hard to discover and easy to misread, especially on a handheld with gamepad-only navigation. I only figured it out after a fair bit of head-scratching.

How it currently works (intended, per the scene)

plugin_store_card.tscn gives the card a two-level focus model:

  • The card itself is focusable and pressable (plugin_store_card.gd::_gui_input emits pressed/button_up on ui_accept).
  • A FocusGroupSetter on the card (on_signal = "button_up", target MarginContainer/HBoxContainer/FocusGroup) moves focus into the card on the first press, landing on ActionButton (FocusGroup.current_focus = ../ActionButton).
  • Only a second A — now with ActionButton focused — reaches CardIconButton._gui_input and fires _on_install_button, which does the install/uninstall.
  • An InputWatcher/FocusSetter (on_signal = "input_released") backs focus out to the card again.

So the flow is: focus card → A (enter card, focus action button) → A (trigger). Functionally correct; the loader and handler work fine once the second press lands.

Why it reads as broken

  • After focusing the card, the action button already looks highlighted/active, so the first A appears to target it directly.
  • The first A produces visible feedback (focus/selection change on the card), which reads as "the button did something," so the user stops there and assumes it failed or hung.
  • There's no visible cue that you've "entered" the card or that a second press is needed, and no distinct state between "card focused" and "action button focused."

So I spent a good while convinced the button was flaky/broken before realizing the second press is what triggers it. (Filed and are closing a mistaken bug report to that effect.)

Suggestions (just ideas — any one might help, or none if they don't fit)

  • Make the card-focused vs. button-focused states visually distinct, so it's clear a press "entered" the card and which control is now armed.
  • Or, for a card whose primary action is a single button, let a press on the focused card trigger that action directly (skip the extra focus hop).
  • Or a small hint ("Press A to manage") when a card is focused.

All of these have trade-offs I'm sure you've already weighed — feel free to close this if it's a non-issue or already on your radar.

Environment

  • OpenGamepadUI 0.46.1 (Godot 4.7.2 export), overlay-mode ogui-steam session
  • Bazzite 44.20260921, AYANEO 3, gamepad navigation (touch passes through the overlay to the game beneath)

Happy to help test any change on the device.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions