diff --git a/src/seedsigner/gui/screens/screen.py b/src/seedsigner/gui/screens/screen.py index e8e6ad27..36a54c5a 100644 --- a/src/seedsigner/gui/screens/screen.py +++ b/src/seedsigner/gui/screens/screen.py @@ -1,3 +1,4 @@ +import math import logging import time @@ -296,7 +297,8 @@ class ButtonListScreen(BaseTopNavScreen): Button_cls = Button checked_buttons: List[int] = None - # Enables returning w/buttons rendered at the same place + # Enables returning w/buttons rendered at the same place; default behavior will + # ensure the screen is at least scrolled to reveal the `selected_button`. scroll_y_initial_offset: int = None @@ -324,6 +326,15 @@ class ButtonListScreen(BaseTopNavScreen): button_list_y = self.top_nav.height self.has_scroll_arrows = True + # How many buttons fit on the screen before we need to start scrolling? + num_buttons_pre_scroll = math.floor((self.canvas_height - button_list_y - GUIConstants.EDGE_PADDING) / (button_height + GUIConstants.LIST_ITEM_PADDING)) + + # Force a scroll offset when necessary if none was provided + if self.selected_button + 1 > num_buttons_pre_scroll and not self.scroll_y_initial_offset: + # Scroll far enough to expose the selected button; +1 to account for the + # height of the target button itself! + self.scroll_y_initial_offset = (button_height + GUIConstants.LIST_ITEM_PADDING) * (self.selected_button - num_buttons_pre_scroll + 1) + self.buttons: List[Button] = [] for i, button_option in enumerate(self.button_data): if type(button_option) != ButtonOption: diff --git a/src/seedsigner/gui/screens/settings_screens.py b/src/seedsigner/gui/screens/settings_screens.py index c41eadfc..10e8bd06 100644 --- a/src/seedsigner/gui/screens/settings_screens.py +++ b/src/seedsigner/gui/screens/settings_screens.py @@ -21,7 +21,6 @@ class SettingsEntryUpdateSelectionScreen(ButtonListScreen): help_text: str = None checked_buttons: List[int] = None settings_entry_type: str = SettingsConstants.TYPE__ENABLED_DISABLED - selected_button: int = 0 def __post_init__(self): self.title = _("Settings") diff --git a/src/seedsigner/views/settings_views.py b/src/seedsigner/views/settings_views.py index da870cca..17db700e 100644 --- a/src/seedsigner/views/settings_views.py +++ b/src/seedsigner/views/settings_views.py @@ -99,8 +99,11 @@ class SettingsMenuView(View): class LocaleSelectionView(View): def run(self): + cur_language_code = self.settings.get_value(SettingsConstants.SETTING__LOCALE) + + selected_button = 0 button_data: list[ButtonOption] = [] - for language_code, display_name in SettingsConstants.get_detected_languages(): + for i, (language_code, display_name) in enumerate(SettingsConstants.get_detected_languages()): button_data.append( # Unique to this View: override each button's font so we can display each # language name in its native script. @@ -112,11 +115,16 @@ class LocaleSelectionView(View): ) ) + if language_code == cur_language_code: + # Highlight the current selection + selected_button = i + selected_menu_num = self.run_screen( - ButtonListScreen, + settings_screens.SettingsEntryUpdateSelectionScreen, + display_name=_(SettingsDefinition.get_settings_entry(attr_name=SettingsConstants.SETTING__LOCALE).display_name), button_data=button_data, - title=_(SettingsDefinition.get_settings_entry(attr_name=SettingsConstants.SETTING__LOCALE).display_name), - is_button_text_centered=False, + selected_button=selected_button, + checked_buttons=[selected_button], ) if selected_menu_num == RET_CODE__BACK_BUTTON: