mirror of
https://github.com/SeedSigner/seedsigner.git
synced 2026-10-05 15:08:25 +00:00
Merge pull request #315 from kdmukai/settings_initial_scroll
[Enhancement] Preserve scroll position in long `ButtonListScreen`
This commit is contained in:
@@ -265,6 +265,9 @@ class ButtonListScreen(BaseTopNavScreen):
|
||||
Button_cls = Button
|
||||
checked_buttons: List[int] = None
|
||||
|
||||
# Enables returning w/buttons rendered at the same place
|
||||
scroll_y_initial_offset: int = None
|
||||
|
||||
|
||||
def __post_init__(self):
|
||||
super().__post_init__()
|
||||
@@ -315,6 +318,7 @@ class ButtonListScreen(BaseTopNavScreen):
|
||||
right_icon_name=right_icon_name,
|
||||
screen_x=GUIConstants.EDGE_PADDING,
|
||||
screen_y=button_list_y + i * (button_height + GUIConstants.LIST_ITEM_PADDING),
|
||||
scroll_y=self.scroll_y_initial_offset if self.scroll_y_initial_offset is not None else 0,
|
||||
width=self.canvas_width - (2 * GUIConstants.EDGE_PADDING),
|
||||
height=button_height,
|
||||
is_text_centered=self.is_button_text_centered,
|
||||
@@ -330,7 +334,7 @@ class ButtonListScreen(BaseTopNavScreen):
|
||||
|
||||
if self.has_scroll_arrows:
|
||||
self.arrow_half_width = 10
|
||||
self.cur_scroll_y = 0
|
||||
self.cur_scroll_y = self.scroll_y_initial_offset if self.scroll_y_initial_offset is not None else 0
|
||||
self.up_arrow_img = Image.new("RGBA", size=(2 * self.arrow_half_width, 8), color="black")
|
||||
self.up_arrow_img_y = self.top_nav.height - 12
|
||||
arrow_draw = ImageDraw.Draw(self.up_arrow_img)
|
||||
@@ -346,10 +350,6 @@ class ButtonListScreen(BaseTopNavScreen):
|
||||
|
||||
cur_selected_button = self.buttons[self.selected_button]
|
||||
cur_selected_button.is_selected = True
|
||||
if self.has_scroll_arrows:
|
||||
frame_scroll = self.buttons[0].screen_y - cur_selected_button.screen_y
|
||||
for button in self.buttons:
|
||||
button.scroll_y -= frame_scroll
|
||||
|
||||
|
||||
def _render(self):
|
||||
|
||||
@@ -9,11 +9,14 @@ from seedsigner.models.settings import SettingsConstants, SettingsDefinition
|
||||
|
||||
|
||||
class SettingsMenuView(View):
|
||||
def __init__(self, visibility: str = SettingsConstants.VISIBILITY__GENERAL, selected_attr: str = None):
|
||||
def __init__(self, visibility: str = SettingsConstants.VISIBILITY__GENERAL, selected_attr: str = None, initial_scroll: int = 0):
|
||||
super().__init__()
|
||||
self.visibility = visibility
|
||||
self.selected_attr = selected_attr
|
||||
|
||||
# Used to preserve the rendering position in the list
|
||||
self.initial_scroll = initial_scroll
|
||||
|
||||
|
||||
def run(self):
|
||||
IO_TEST = "I/O test"
|
||||
@@ -53,12 +56,17 @@ class SettingsMenuView(View):
|
||||
title = "Dev Options"
|
||||
next = None
|
||||
|
||||
selected_menu_num = ButtonListScreen(
|
||||
screen = ButtonListScreen(
|
||||
title=title,
|
||||
is_button_text_centered=False,
|
||||
button_data=button_data,
|
||||
selected_button=selected_button,
|
||||
).display()
|
||||
scroll_y_initial_offset=self.initial_scroll,
|
||||
)
|
||||
selected_menu_num = screen.display()
|
||||
|
||||
# Preserve our scroll position in this Screen so we can return
|
||||
initial_scroll = screen.buttons[0].scroll_y
|
||||
|
||||
if selected_menu_num == RET_CODE__BACK_BUTTON:
|
||||
if self.visibility == SettingsConstants.VISIBILITY__GENERAL:
|
||||
@@ -78,8 +86,7 @@ class SettingsMenuView(View):
|
||||
return Destination(DonateView)
|
||||
|
||||
else:
|
||||
# TODO: Free-entry types (are there any?) will need their own SettingsEntryUpdateFreeEntryView(?).
|
||||
return Destination(SettingsEntryUpdateSelectionView, view_args={"attr_name": settings_entries[selected_menu_num].attr_name})
|
||||
return Destination(SettingsEntryUpdateSelectionView, view_args=dict(attr_name=settings_entries[selected_menu_num].attr_name, parent_initial_scroll=initial_scroll))
|
||||
|
||||
|
||||
|
||||
@@ -88,10 +95,11 @@ class SettingsEntryUpdateSelectionView(View):
|
||||
Handles changes to all selection-type settings (Multiselect, SELECT_1,
|
||||
Enabled/Disabled, etc).
|
||||
"""
|
||||
def __init__(self, attr_name: str):
|
||||
def __init__(self, attr_name: str, parent_initial_scroll: int = 0):
|
||||
super().__init__()
|
||||
self.settings_entry = SettingsDefinition.get_settings_entry(attr_name)
|
||||
self.selected_button = None
|
||||
self.parent_initial_scroll = parent_initial_scroll
|
||||
|
||||
|
||||
def run(self):
|
||||
@@ -129,7 +137,8 @@ class SettingsEntryUpdateSelectionView(View):
|
||||
SettingsMenuView,
|
||||
view_args={
|
||||
"visibility": self.settings_entry.visibility,
|
||||
"selected_attr": self.settings_entry.attr_name
|
||||
"selected_attr": self.settings_entry.attr_name,
|
||||
"initial_scroll": self.parent_initial_scroll,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -559,11 +559,12 @@ class ToolsAddressExplorerAddressTypeView(View):
|
||||
|
||||
|
||||
class ToolsAddressExplorerAddressListView(View):
|
||||
def __init__(self, is_change: bool = False, start_index: int = 0, selected_button_index: int = 0):
|
||||
def __init__(self, is_change: bool = False, start_index: int = 0, selected_button_index: int = 0, initial_scroll: int = 0):
|
||||
super().__init__()
|
||||
self.is_change = is_change
|
||||
self.start_index = start_index
|
||||
self.selected_button_index = selected_button_index
|
||||
self.initial_scroll = initial_scroll
|
||||
|
||||
|
||||
def run(self):
|
||||
@@ -632,6 +633,7 @@ class ToolsAddressExplorerAddressListView(View):
|
||||
is_button_text_centered=False,
|
||||
is_bottom_list=True,
|
||||
selected_button=self.selected_button_index,
|
||||
scroll_y_initial_offset=self.initial_scroll,
|
||||
)
|
||||
finally:
|
||||
# Everything is set. Stop the loading screen
|
||||
@@ -647,20 +649,23 @@ class ToolsAddressExplorerAddressListView(View):
|
||||
# User clicked NEXT
|
||||
return Destination(ToolsAddressExplorerAddressListView, view_args=dict(is_change=self.is_change, start_index=self.start_index + addrs_per_screen))
|
||||
|
||||
# Preserve the list's current scroll so we can return to the same spot
|
||||
initial_scroll = screen.buttons[0].scroll_y
|
||||
|
||||
index = selected_menu_num + self.start_index
|
||||
return Destination(ToolsAddressExplorerAddressView, view_args=dict(index=index, address=addresses[selected_menu_num], is_change=self.is_change, start_index=self.start_index), skip_current_view=True)
|
||||
return Destination(ToolsAddressExplorerAddressView, view_args=dict(index=index, address=addresses[selected_menu_num], is_change=self.is_change, start_index=self.start_index, parent_initial_scroll=initial_scroll), skip_current_view=True)
|
||||
|
||||
|
||||
|
||||
class ToolsAddressExplorerAddressView(View):
|
||||
def __init__(self, index: int, address: str, is_change: bool, start_index: int):
|
||||
def __init__(self, index: int, address: str, is_change: bool, start_index: int, parent_initial_scroll: int = 0):
|
||||
super().__init__()
|
||||
self.index = index
|
||||
self.address = address
|
||||
self.is_change = is_change
|
||||
self.start_index = start_index
|
||||
self.parent_initial_scroll = parent_initial_scroll
|
||||
|
||||
data = self.controller.address_explorer_data
|
||||
|
||||
def run(self):
|
||||
qr_encoder = EncodeQR(qr_type=QRType.BITCOIN_ADDRESS, bitcoin_address=self.address)
|
||||
@@ -669,4 +674,4 @@ class ToolsAddressExplorerAddressView(View):
|
||||
).display()
|
||||
|
||||
# Exiting/Cancelling the QR display screen always returns to the list
|
||||
return Destination(ToolsAddressExplorerAddressListView, view_args=dict(is_change=self.is_change, start_index=self.start_index, selected_button_index=self.index - self.start_index), skip_current_view=True)
|
||||
return Destination(ToolsAddressExplorerAddressListView, view_args=dict(is_change=self.is_change, start_index=self.start_index, selected_button_index=self.index - self.start_index, initial_scroll=self.parent_initial_scroll), skip_current_view=True)
|
||||
|
||||
Reference in New Issue
Block a user