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.
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
Apresses, 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, pressA, 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 secondAis 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.tscngives the card a two-level focus model:plugin_store_card.gd::_gui_inputemitspressed/button_uponui_accept).FocusGroupSetteron the card (on_signal = "button_up", targetMarginContainer/HBoxContainer/FocusGroup) moves focus into the card on the first press, landing onActionButton(FocusGroup.current_focus = ../ActionButton).A— now withActionButtonfocused — reachesCardIconButton._gui_inputand fires_on_install_button, which does the install/uninstall.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
Aappears to target it directly.Aproduces 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.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)
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
ogui-steamsessionHappy to help test any change on the device.