From ee5f2fa4d441c5324950ce67930a771204d4423f Mon Sep 17 00:00:00 2001 From: pdxlocations <117498748+pdxlocations@users.noreply.github.com> Date: Mon, 10 Mar 2025 18:19:10 -0700 Subject: [PATCH] scroll arrows (#137) --- ui/control_ui.py | 35 +++++++++++++++++++++++++++++++---- utilities/input_handlers.py | 28 +++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/ui/control_ui.py b/ui/control_ui.py index e502838..5c52fd8 100644 --- a/ui/control_ui.py +++ b/ui/control_ui.py @@ -100,8 +100,14 @@ def display_menu(current_menu, menu_path, selected_index, show_save_option, help menu_win.getbegyx()[1] + menu_win.getmaxyx()[1] - 8 ) + max_index = num_items + (1 if show_save_option else 0) - 1 + visible_height = menu_win.getmaxyx()[0] - 5 - (2 if show_save_option else 0) + + draw_arrows(menu_win, visible_height, max_index, start_index, show_save_option) + return menu_win, menu_pad + def draw_help_window(menu_start_y, menu_start_x, menu_height, max_help_lines, current_menu, selected_index, transformed_path): global help_win @@ -151,7 +157,6 @@ def update_help_window(help_win, help_text, transformed_path, selected_option, m return help_win - def get_wrapped_help_text(help_text, transformed_path, selected_option, width, max_lines): """Fetches and formats help text for display, ensuring it fits within the allowed lines.""" @@ -252,10 +257,13 @@ def move_highlight(old_idx, new_idx, options, show_save_option, menu_win, menu_p visible_height = menu_win.getmaxyx()[0] - 5 - (2 if show_save_option else 0) # Adjust start_index only when moving out of visible range - if new_idx < start_index[-1]: # Moving above the visible area + if new_idx == max_index and show_save_option: + pass + elif new_idx < start_index[-1]: # Moving above the visible area start_index[-1] = new_idx elif new_idx >= start_index[-1] + visible_height: # Moving below the visible area - start_index[-1] = new_idx - visible_height + start_index[-1] = new_idx - visible_height + pass # Ensure start_index is within bounds start_index[-1] = max(0, min(start_index[-1], max_index - visible_height + 1)) @@ -278,7 +286,7 @@ def move_highlight(old_idx, new_idx, options, show_save_option, menu_win, menu_p menu_pad.refresh(start_index[-1], 0, menu_win.getbegyx()[0] + 3, menu_win.getbegyx()[1] + 4, menu_win.getbegyx()[0] + 3 + visible_height, - menu_win.getbegyx()[1] + menu_win.getmaxyx()[1] - 8) + menu_win.getbegyx()[1] + menu_win.getmaxyx()[1] - 4) # Update help window transformed_path = transform_menu_path(menu_path) @@ -286,6 +294,25 @@ def move_highlight(old_idx, new_idx, options, show_save_option, menu_win, menu_p help_y = menu_win.getbegyx()[0] + menu_win.getmaxyx()[0] help_win = update_help_window(help_win, help_text, transformed_path, selected_option, max_help_lines, width, help_y, menu_win.getbegyx()[1]) + draw_arrows(menu_win, visible_height, max_index, start_index, show_save_option) + + +def draw_arrows(win, visible_height, max_index, start_index, show_save_option): + + # vh = visible_height + (1 if show_save_option else 0) + mi = max_index - (2 if show_save_option else 0) + + if visible_height < mi: + if start_index[-1] > 0: + win.addstr(3, 2, "▲", get_color("settings_default")) + else: + win.addstr(3, 2, " ", get_color("settings_default")) + + if mi - start_index[-1] >= visible_height + (0 if show_save_option else 1) : + win.addstr(visible_height + 3, 2, "▼", get_color("settings_default")) + else: + win.addstr(visible_height + 3, 2, " ", get_color("settings_default")) + def settings_menu(stdscr, interface): curses.update_lines_cols() diff --git a/utilities/input_handlers.py b/utilities/input_handlers.py index 1aac5da..34b41ae 100644 --- a/utilities/input_handlers.py +++ b/utilities/input_handlers.py @@ -372,6 +372,11 @@ def get_list_input(prompt, current_option, list_options): list_pad.refresh(0, 0, list_win.getbegyx()[0] + 3, list_win.getbegyx()[1] + 4, list_win.getbegyx()[0] + list_win.getmaxyx()[0] - 2, list_win.getbegyx()[1] + list_win.getmaxyx()[1] - 4) + + max_index = len(list_options) - 1 + visible_height = list_win.getmaxyx()[0] - 5 + + draw_arrows(list_win, visible_height, max_index, 0) while True: key = list_win.getch() @@ -385,8 +390,12 @@ def get_list_input(prompt, current_option, list_options): selected_index = min(len(list_options) - 1, selected_index + 1) move_highlight(old_selected_index, selected_index, list_options, list_win, list_pad) elif key == ord('\n'): # Enter key + list_win.clear() + list_win.refresh() return list_options[selected_index] elif key == 27 or key == curses.KEY_LEFT: # ESC or Left Arrow + list_win.clear() + list_win.refresh() return current_option @@ -424,5 +433,22 @@ def move_highlight(old_idx, new_idx, options, list_win, list_pad): list_win.getbegyx()[0] + 3, list_win.getbegyx()[1] + 4, list_win.getbegyx()[0] + 3 + visible_height, list_win.getbegyx()[1] + list_win.getmaxyx()[1] - 4) + + draw_arrows(list_win, visible_height, max_index, scroll_offset) - return scroll_offset # Return updated scroll_offset to be stored externally \ No newline at end of file + return scroll_offset # Return updated scroll_offset to be stored externally + + +def draw_arrows(win, visible_height, max_index, start_index): + + if visible_height < max_index: + if start_index > 0: + win.addstr(3, 2, "▲", get_color("settings_default")) + else: + win.addstr(3, 2, " ", get_color("settings_default")) + + if max_index - start_index > visible_height: + win.addstr(visible_height + 3, 2, "▼", get_color("settings_default")) + else: + win.addstr(visible_height + 3, 2, " ", get_color("settings_default")) + \ No newline at end of file