From 7e85085b981ac44c3a0ffe5baa0ae9687e4023bd Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Fri, 17 Jan 2025 18:59:37 -0600 Subject: [PATCH 1/7] WIP - Convert messages window to pad Change to use a curses "pad" so we can scroll better --- ui/curses_ui.py | 81 +++++++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 47 deletions(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index 53356f8..c311800 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -103,47 +103,30 @@ def draw_messages_window(): if max_messages < 1: max_messages = 1 - # Set the initial scroll position to the bottom of the list - max_scroll_position = max(0, num_messages - max_messages) + # Calculate the scroll position based on the current selection + # max_scroll_position = max(0, num_messages - max_messages) + # start_index = max(0, min(globals.selected_message, max_scroll_position)) - # if globals.selected_message is None or globals.selected_message == 0 or globals.selected_message >= num_messages: - # globals.selected_message = num_messages - 1 # Default to the last message - - start_index = max(0, min(globals.selected_message, max_scroll_position)) - - # Dynamically calculate max_messages based on visible messages and wraps - row = 1 - visible_message_count = 0 - for index, (prefix, message) in enumerate(messages[start_index:], start=start_index): + # Display messages starting from the calculated start index + # row = 1 + row = 0 + for (prefix, message) in messages: full_message = f"{prefix}{message}" - wrapped_lines = textwrap.wrap(full_message, messages_win.getmaxyx()[1] - 2) - - if row + len(wrapped_lines) - 1 > messages_win.getmaxyx()[0] - 2: # Check if it fits in the window - break + wrapped_lines = textwrap.wrap(full_message, messages_width - 2) - visible_message_count += 1 - row += len(wrapped_lines) - - # Adjust max_messages to match visible messages - max_messages = visible_message_count - - # Re-render the visible messages - row = 1 - for index, (prefix, message) in enumerate(messages[start_index:start_index + max_messages], start=start_index): - full_message = f"{prefix}{message}" - wrapped_lines = textwrap.wrap(full_message, messages_win.getmaxyx()[1] - 2) for line in wrapped_lines: # Highlight the row if it's the selected message - if index == globals.selected_message and globals.current_window == 1: - color = curses.A_REVERSE # Highlighted row color - else: - color = curses.color_pair(4) if prefix.startswith(globals.sent_message_prefix) else curses.color_pair(3) + # if index == globals.selected_message and globals.current_window == 1: + # color = curses.color_pair(3) # Highlighted row color + # else: + color = curses.color_pair(1) if prefix.startswith(globals.sent_message_prefix) else curses.color_pair(2) messages_win.addstr(row, 1, line, color) row += 1 - messages_win.box() - messages_win.refresh() + # messages_win.box() + messages_win.refresh(0, 0, 3, channel_width, 3 + height - 6, channel_width + messages_width - 1) + draw_packetlog_win() def draw_node_list(): @@ -178,16 +161,18 @@ def select_channels(direction): draw_messages_window() def select_messages(direction): - messages_length = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) + # messages_length = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) globals.selected_message += direction - if globals.selected_message < 0: - globals.selected_message = messages_length - 1 - elif globals.selected_message >= messages_length: - globals.selected_message = 0 + # if globals.selected_message < 0: + # globals.selected_message = messages_length - 1 + # elif globals.selected_message >= messages_length: + # globals.selected_message = 0 - draw_messages_window() + # draw_messages_window() + + messages_win.refresh(globals.selected_message, 0, 3, channel_width, 3 + height - 6, channel_width + messages_width - 1) def select_nodes(direction): node_list_length = len(globals.node_list) @@ -246,7 +231,7 @@ def draw_packetlog_win(): def main_ui(stdscr): - global messages_win, nodes_win, channel_win, function_win, packetlog_win + global messages_win, nodes_win, channel_win, function_win, packetlog_win, channel_width, height, messages_width stdscr.keypad(True) get_channels() @@ -260,7 +245,9 @@ def main_ui(stdscr): messages_width = width - channel_width - nodes_width channel_win = curses.newwin(height - 6, channel_width, 3, 0) - messages_win = curses.newwin(height - 6, messages_width, 3, channel_width) + # messages_win = curses.newwin(height - 6, messages_width, 3, channel_width) + + messages_win = curses.newpad(1000, 1000) packetlog_win = curses.newwin(int(height / 3), messages_width, height - int(height / 3) - 3, channel_width) nodes_win = curses.newwin(height - 6, nodes_width, 3, channel_width + messages_width) function_win = curses.newwin(3, width, height - 3, 0) @@ -268,9 +255,9 @@ def main_ui(stdscr): draw_centered_text_field(function_win, f"↑→↓← = Select ENTER = Send ` = Settings ^P = Packet Log ESC = Quit") # Enable scrolling for messages and nodes windows - messages_win.scrollok(True) - nodes_win.scrollok(True) - channel_win.scrollok(True) + # messages_win.scrollok(True) + # nodes_win.scrollok(True) + # channel_win.scrollok(True) draw_channel_list() draw_node_list() @@ -279,13 +266,13 @@ def main_ui(stdscr): # Draw boxes around windows channel_win.box() entry_win.box() - messages_win.box() + # messages_win.box() nodes_win.box() function_win.box() # Refresh all windows entry_win.refresh() - messages_win.refresh() + messages_win.refresh(0, 0, 3, channel_width, 3 + height - 6, channel_width + messages_width - 1) nodes_win.refresh() channel_win.refresh() function_win.refresh() @@ -307,7 +294,7 @@ def main_ui(stdscr): if char == curses.KEY_UP: if globals.current_window == 0: select_channels(-1) - globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 + # globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 elif globals.current_window == 1: select_messages(-1) elif globals.current_window == 2: @@ -316,7 +303,7 @@ def main_ui(stdscr): elif char == curses.KEY_DOWN: if globals.current_window == 0: select_channels(1) - globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 + # globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 elif globals.current_window == 1: select_messages(1) elif globals.current_window == 2: From 35748d071e85c1a93852f04f67604b89efdf1bd7 Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Sun, 19 Jan 2025 14:52:11 -0600 Subject: [PATCH 2/7] Various tweaks, added back messages border --- ui/curses_ui.py | 46 ++++++++++++++++++---------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index c311800..1ed22a2 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -87,33 +87,22 @@ def draw_channel_list(): def draw_messages_window(): """Update the messages window based on the selected channel and scroll position.""" - messages_win.clear() + messages_pad.clear() channel = globals.channel_list[globals.selected_channel] if channel in globals.all_messages: messages = globals.all_messages[channel] - num_messages = len(messages) - max_messages = messages_win.getmaxyx()[0] - 2 # Max messages that fit in the window # Adjust for packetlog height if log is visible if globals.display_log: packetlog_height = packetlog_win.getmaxyx()[0] - max_messages -= packetlog_height - 1 - if max_messages < 1: - max_messages = 1 - - # Calculate the scroll position based on the current selection - # max_scroll_position = max(0, num_messages - max_messages) - # start_index = max(0, min(globals.selected_message, max_scroll_position)) # Display messages starting from the calculated start index - # row = 1 row = 0 for (prefix, message) in messages: full_message = f"{prefix}{message}" - wrapped_lines = textwrap.wrap(full_message, messages_width - 2) - + wrapped_lines = textwrap.wrap(full_message, messages_box.getmaxyx()[1] - 2) for line in wrapped_lines: # Highlight the row if it's the selected message @@ -121,11 +110,12 @@ def draw_messages_window(): # color = curses.color_pair(3) # Highlighted row color # else: color = curses.color_pair(1) if prefix.startswith(globals.sent_message_prefix) else curses.color_pair(2) - messages_win.addstr(row, 1, line, color) + messages_pad.addstr(row, 1, line, color) row += 1 - # messages_win.box() - messages_win.refresh(0, 0, 3, channel_width, 3 + height - 6, channel_width + messages_width - 1) + messages_pad.refresh(0, 0, + messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, + messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) draw_packetlog_win() @@ -172,7 +162,12 @@ def select_messages(direction): # draw_messages_window() - messages_win.refresh(globals.selected_message, 0, 3, channel_width, 3 + height - 6, channel_width + messages_width - 1) + # messages_win.refresh(globals.selected_message, 0, 4, channel_width + 1, 3 + height - 8, channel_width + messages_width - 2) + messages_pad.refresh(globals.selected_message, 0, + messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, + messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) + + def select_nodes(direction): node_list_length = len(globals.node_list) @@ -231,7 +226,7 @@ def draw_packetlog_win(): def main_ui(stdscr): - global messages_win, nodes_win, channel_win, function_win, packetlog_win, channel_width, height, messages_width + global messages_pad, messages_box, nodes_win, channel_win, function_win, packetlog_win stdscr.keypad(True) get_channels() @@ -245,20 +240,15 @@ def main_ui(stdscr): messages_width = width - channel_width - nodes_width channel_win = curses.newwin(height - 6, channel_width, 3, 0) - # messages_win = curses.newwin(height - 6, messages_width, 3, channel_width) + messages_box = curses.newwin(height - 6, messages_width, 3, channel_width) - messages_win = curses.newpad(1000, 1000) + messages_pad = curses.newpad(1000, 1000) packetlog_win = curses.newwin(int(height / 3), messages_width, height - int(height / 3) - 3, channel_width) nodes_win = curses.newwin(height - 6, nodes_width, 3, channel_width + messages_width) function_win = curses.newwin(3, width, height - 3, 0) draw_centered_text_field(function_win, f"↑→↓← = Select ENTER = Send ` = Settings ^P = Packet Log ESC = Quit") - # Enable scrolling for messages and nodes windows - # messages_win.scrollok(True) - # nodes_win.scrollok(True) - # channel_win.scrollok(True) - draw_channel_list() draw_node_list() draw_messages_window() @@ -266,17 +256,17 @@ def main_ui(stdscr): # Draw boxes around windows channel_win.box() entry_win.box() - # messages_win.box() nodes_win.box() + messages_box.box() function_win.box() # Refresh all windows entry_win.refresh() - messages_win.refresh(0, 0, 3, channel_width, 3 + height - 6, channel_width + messages_width - 1) + nodes_win.refresh() channel_win.refresh() function_win.refresh() - + messages_box.refresh() input_text = "" entry_win.keypad(True) From ccb46b855332c63bdf7f73d558577ff6c5732d00 Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Sun, 19 Jan 2025 17:54:43 -0600 Subject: [PATCH 3/7] Account for packet log window --- ui/curses_ui.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index 1ed22a2..be5b2a7 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -84,7 +84,6 @@ def draw_channel_list(): channel_win.box() channel_win.refresh() - def draw_messages_window(): """Update the messages window based on the selected channel and scroll position.""" messages_pad.clear() @@ -94,10 +93,6 @@ def draw_messages_window(): if channel in globals.all_messages: messages = globals.all_messages[channel] - # Adjust for packetlog height if log is visible - if globals.display_log: - packetlog_height = packetlog_win.getmaxyx()[0] - # Display messages starting from the calculated start index row = 0 for (prefix, message) in messages: @@ -113,14 +108,18 @@ def draw_messages_window(): messages_pad.addstr(row, 1, line, color) row += 1 - messages_pad.refresh(0, 0, + messages_box.box() + messages_box.refresh() + + # Adjust for packetlog height if log is visible + packetlog_height = packetlog_win.getmaxyx()[0] if globals.display_log else 0 + messages_pad.refresh(globals.selected_message, 0, messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, - messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) + messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2 - packetlog_height, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) draw_packetlog_win() def draw_node_list(): - nodes_win.clear() win_height = nodes_win.getmaxyx()[0] start_index = max(0, globals.selected_node - (win_height - 3)) # Calculate starting index based on selected node and window height @@ -151,22 +150,18 @@ def select_channels(direction): draw_messages_window() def select_messages(direction): - # messages_length = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - globals.selected_message += direction + globals.selected_message = max(globals.selected_message, 0) # if globals.selected_message < 0: # globals.selected_message = messages_length - 1 # elif globals.selected_message >= messages_length: # globals.selected_message = 0 - # draw_messages_window() - - # messages_win.refresh(globals.selected_message, 0, 4, channel_width + 1, 3 + height - 8, channel_width + messages_width - 2) + packetlog_height = packetlog_win.getmaxyx()[0] if globals.display_log else 0 messages_pad.refresh(globals.selected_message, 0, messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, - messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) - + messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2 - packetlog_height, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) def select_nodes(direction): From cb088c51d40cb21858cd3ed5f58cac408168f362 Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Mon, 20 Jan 2025 09:34:21 -0600 Subject: [PATCH 4/7] Count total lines of messages --- ui/curses_ui.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index be5b2a7..b9e73b8 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -93,11 +93,14 @@ def draw_messages_window(): if channel in globals.all_messages: messages = globals.all_messages[channel] + msg_lines = 0 + # Display messages starting from the calculated start index row = 0 for (prefix, message) in messages: full_message = f"{prefix}{message}" wrapped_lines = textwrap.wrap(full_message, messages_box.getmaxyx()[1] - 2) + msg_lines += len(wrapped_lines) for line in wrapped_lines: # Highlight the row if it's the selected message @@ -134,7 +137,6 @@ def draw_node_list(): nodes_win.box() nodes_win.refresh() - def select_channels(direction): channel_list_length = len(globals.channel_list) globals.selected_channel += direction From c090b3dd588de1429b212e13b3ae4a64f77c6941 Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Wed, 22 Jan 2025 17:11:32 -0600 Subject: [PATCH 5/7] Make messages pad actually work --- message_handlers/rx_handler.py | 2 +- message_handlers/tx_handler.py | 2 +- ui/curses_ui.py | 64 +++++++++++++++++----------------- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/message_handlers/rx_handler.py b/message_handlers/rx_handler.py index 4e7c1e6..6eabe17 100644 --- a/message_handlers/rx_handler.py +++ b/message_handlers/rx_handler.py @@ -70,7 +70,7 @@ def on_receive(packet, interface): if(refresh_channels): draw_channel_list() if(refresh_messages): - draw_messages_window() + draw_messages_window(True) save_message_to_db(globals.channel_list[channel_number], message_from_id, message_string) diff --git a/message_handlers/tx_handler.py b/message_handlers/tx_handler.py index 4b46b4c..5b697dd 100644 --- a/message_handlers/tx_handler.py +++ b/message_handlers/tx_handler.py @@ -109,7 +109,7 @@ def on_response_traceroute(packet): if(refresh_channels): draw_channel_list() if(refresh_messages): - draw_messages_window() + draw_messages_window(True) save_message_to_db(globals.channel_list[channel_number], packet['from'], msg_str) def send_message(message, destination=BROADCAST_NUM, channel=0): diff --git a/ui/curses_ui.py b/ui/curses_ui.py index b9e73b8..d5d7fc3 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -84,7 +84,7 @@ def draw_channel_list(): channel_win.box() channel_win.refresh() -def draw_messages_window(): +def draw_messages_window(scroll_to_bottom = False): """Update the messages window based on the selected channel and scroll position.""" messages_pad.clear() @@ -93,20 +93,16 @@ def draw_messages_window(): if channel in globals.all_messages: messages = globals.all_messages[channel] - msg_lines = 0 + msg_line_count = 0 - # Display messages starting from the calculated start index row = 0 for (prefix, message) in messages: full_message = f"{prefix}{message}" wrapped_lines = textwrap.wrap(full_message, messages_box.getmaxyx()[1] - 2) - msg_lines += len(wrapped_lines) + msg_line_count += len(wrapped_lines) + messages_pad.resize(msg_line_count, messages_box.getmaxyx()[1]) for line in wrapped_lines: - # Highlight the row if it's the selected message - # if index == globals.selected_message and globals.current_window == 1: - # color = curses.color_pair(3) # Highlighted row color - # else: color = curses.color_pair(1) if prefix.startswith(globals.sent_message_prefix) else curses.color_pair(2) messages_pad.addstr(row, 1, line, color) row += 1 @@ -114,11 +110,16 @@ def draw_messages_window(): messages_box.box() messages_box.refresh() + if(scroll_to_bottom): + globals.selected_message = max(msg_line_count - get_msg_window_lines(), 0) + else: + globals.selected_message = max(min(globals.selected_message, msg_line_count - get_msg_window_lines()), 0) + # Adjust for packetlog height if log is visible packetlog_height = packetlog_win.getmaxyx()[0] if globals.display_log else 0 - messages_pad.refresh(globals.selected_message, 0, - messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, - messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2 - packetlog_height, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) + messages_pad.refresh(globals.selected_message, 0, + messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, + messages_box.getbegyx()[0] + get_msg_window_lines(), messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) draw_packetlog_win() @@ -146,25 +147,21 @@ def select_channels(direction): elif globals.selected_channel >= channel_list_length: globals.selected_channel = 0 - globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 - draw_channel_list() - draw_messages_window() + draw_messages_window(True) def select_messages(direction): globals.selected_message += direction - globals.selected_message = max(globals.selected_message, 0) - # if globals.selected_message < 0: - # globals.selected_message = messages_length - 1 - # elif globals.selected_message >= messages_length: - # globals.selected_message = 0 - - packetlog_height = packetlog_win.getmaxyx()[0] if globals.display_log else 0 - messages_pad.refresh(globals.selected_message, 0, - messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, - messages_box.getbegyx()[0] + messages_box.getmaxyx()[0] - 2 - packetlog_height, messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) + msg_line_count = messages_pad.getmaxyx()[0] + if globals.selected_message < 0: + globals.selected_message = max(msg_line_count - get_msg_window_lines(), 0) + elif globals.selected_message > (msg_line_count - get_msg_window_lines()): + globals.selected_message = 0 + messages_pad.refresh(globals.selected_message, 0, + messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1, + messages_box.getbegyx()[0] + get_msg_window_lines(), messages_box.getbegyx()[1] + messages_box.getmaxyx()[1] - 2) def select_nodes(direction): node_list_length = len(globals.node_list) @@ -239,7 +236,8 @@ def main_ui(stdscr): channel_win = curses.newwin(height - 6, channel_width, 3, 0) messages_box = curses.newwin(height - 6, messages_width, 3, channel_width) - messages_pad = curses.newpad(1000, 1000) + # Will be resized to what we need when drawn + messages_pad = curses.newpad(1, 1) packetlog_win = curses.newwin(int(height / 3), messages_width, height - int(height / 3) - 3, channel_width) nodes_win = curses.newwin(height - 6, nodes_width, 3, channel_width + messages_width) function_win = curses.newwin(3, width, height - 3, 0) @@ -248,7 +246,7 @@ def main_ui(stdscr): draw_channel_list() draw_node_list() - draw_messages_window() + draw_messages_window(True) # Draw boxes around windows channel_win.box() @@ -281,7 +279,6 @@ def main_ui(stdscr): if char == curses.KEY_UP: if globals.current_window == 0: select_channels(-1) - # globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 elif globals.current_window == 1: select_messages(-1) elif globals.current_window == 2: @@ -290,7 +287,6 @@ def main_ui(stdscr): elif char == curses.KEY_DOWN: if globals.current_window == 0: select_channels(1) - # globals.selected_message = len(globals.all_messages[globals.channel_list[globals.selected_channel]]) - 1 elif globals.current_window == 1: select_messages(1) elif globals.current_window == 2: @@ -333,12 +329,12 @@ def main_ui(stdscr): draw_node_list() draw_channel_list() - draw_messages_window() + draw_messages_window(True) else: # Enter key pressed, send user input as message send_message(input_text, channel=globals.selected_channel) - draw_messages_window() + draw_messages_window(True) # Clear entry window and reset input text input_text = "" @@ -363,14 +359,18 @@ def main_ui(stdscr): # Display packet log if globals.display_log is False: globals.display_log = True - draw_messages_window() + draw_messages_window(True) else: globals.display_log = False packetlog_win.clear() - draw_messages_window() + draw_messages_window(True) else: # Append typed character to input text if(isinstance(char, str)): input_text += char else: input_text += chr(char) + +def get_msg_window_lines(): + packetlog_height = packetlog_win.getmaxyx()[0] if globals.display_log else 0 + return messages_box.getmaxyx()[0] - 2 - packetlog_height From e15f6257160452656b970a3eaa0685a5a861de0d Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Wed, 22 Jan 2025 17:14:49 -0600 Subject: [PATCH 6/7] Fix default channel messages not showing on start --- ui/curses_ui.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index d5d7fc3..5a4b584 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -244,10 +244,6 @@ def main_ui(stdscr): draw_centered_text_field(function_win, f"↑→↓← = Select ENTER = Send ` = Settings ^P = Packet Log ESC = Quit") - draw_channel_list() - draw_node_list() - draw_messages_window(True) - # Draw boxes around windows channel_win.box() entry_win.box() @@ -267,6 +263,10 @@ def main_ui(stdscr): entry_win.keypad(True) curses.curs_set(1) + draw_channel_list() + draw_node_list() + draw_messages_window(True) + while True: draw_text_field(entry_win, f"Input: {input_text}") From 039673bb180caef020a917a0ef71933a19380795 Mon Sep 17 00:00:00 2001 From: Russell Schmidt Date: Wed, 22 Jan 2025 19:41:30 -0600 Subject: [PATCH 7/7] Disable message window looping --- ui/curses_ui.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ui/curses_ui.py b/ui/curses_ui.py index 5a4b584..9a489ce 100644 --- a/ui/curses_ui.py +++ b/ui/curses_ui.py @@ -154,10 +154,7 @@ def select_messages(direction): globals.selected_message += direction msg_line_count = messages_pad.getmaxyx()[0] - if globals.selected_message < 0: - globals.selected_message = max(msg_line_count - get_msg_window_lines(), 0) - elif globals.selected_message > (msg_line_count - get_msg_window_lines()): - globals.selected_message = 0 + globals.selected_message = max(0, min(globals.selected_message, msg_line_count - get_msg_window_lines())) messages_pad.refresh(globals.selected_message, 0, messages_box.getbegyx()[0] + 1, messages_box.getbegyx()[1] + 1,