Merge pull request #36 from rfschmid/convert-messages-window-to-pad

Convert messages window to pad
This commit is contained in:
pdxlocations
2025-01-22 17:47:04 -08:00
committed by GitHub
3 changed files with 52 additions and 81 deletions
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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):
+50 -79
View File
@@ -80,70 +80,46 @@ 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_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
msg_line_count = 0
# Set the initial scroll position to the bottom of the list
max_scroll_position = max(0, num_messages - max_messages)
# 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):
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
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)
wrapped_lines = textwrap.wrap(full_message, messages_box.getmaxyx()[1] - 2)
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.A_REVERSE # Highlighted row color
else:
color = curses.color_pair(4) if prefix.startswith(globals.sent_message_prefix) else curses.color_pair(3)
messages_win.addstr(row, 1, line, color)
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
messages_win.box()
messages_win.refresh()
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] + get_msg_window_lines(), 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
@@ -158,7 +134,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
@@ -168,22 +143,18 @@ 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):
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
msg_line_count = messages_pad.getmaxyx()[0]
globals.selected_message = max(0, min(globals.selected_message, msg_line_count - get_msg_window_lines()))
draw_messages_window()
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)
@@ -242,7 +213,7 @@ def draw_packetlog_win():
def main_ui(stdscr):
global messages_win, nodes_win, channel_win, function_win, packetlog_win
global messages_pad, messages_box, nodes_win, channel_win, function_win, packetlog_win
stdscr.keypad(True)
get_channels()
@@ -256,41 +227,39 @@ 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)
# 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)
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()
# 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()
nodes_win.refresh()
channel_win.refresh()
function_win.refresh()
messages_box.refresh()
input_text = ""
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[-(width - 10):]}")
@@ -302,7 +271,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:
@@ -311,7 +279,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:
@@ -354,12 +321,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 = ""
@@ -384,14 +351,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