From 494d25bf1bd359d90b95031ec8e586705fa11aad Mon Sep 17 00:00:00 2001 From: "n loewen (aider)" Date: Mon, 5 May 2025 08:56:39 +0100 Subject: [PATCH] feat: improve divider dragging with real-time mouse tracking --- git_time_machine.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/git_time_machine.py b/git_time_machine.py index ea1f503..8c5121c 100644 --- a/git_time_machine.py +++ b/git_time_machine.py @@ -51,7 +51,11 @@ def main(stdscr, filename): # Vertical divider divider_char = "║" if dragging_divider else "│" for y in range(height): - stdscr.addch(y, divider_col, divider_char) + try: + stdscr.addch(y, divider_col, divider_char) + except curses.error: + # Avoid errors when drawing at the last column + pass # Draw file content (right pane) for i, line in enumerate(visible_lines): @@ -79,10 +83,10 @@ def main(stdscr, filename): _, mx, my, _, bstate = curses.getmouse() if bstate & curses.BUTTON1_PRESSED: - if mx == divider_col: + if mx == divider_col or (mx >= divider_col-1 and mx <= divider_col+1): dragging_divider = True - # Update divider position while dragging + # Always update divider position if dragging, regardless of button state if dragging_divider: min_col = 10 max_col = width - 20 # leave space for right pane @@ -95,12 +99,14 @@ def main(stdscr, filename): except curses.error: pass - # Continue updating divider position even without explicit mouse events - elif dragging_divider: + # Force a mouse position check every loop iteration while dragging + if dragging_divider: + # Set a very short timeout to make the UI responsive + stdscr.timeout(1) try: _, mx, my, _, bstate = curses.getmouse() - # Update divider position + # Always update divider position while dragging min_col = 10 max_col = width - 20 # leave space for right pane divider_col = max(min_col, min(mx, max_col)) @@ -108,8 +114,9 @@ def main(stdscr, filename): # Check for mouse button release if bstate & curses.BUTTON1_RELEASED or not (bstate & curses.BUTTON1_PRESSED): dragging_divider = False + stdscr.timeout(-1) # Reset to blocking mode when done dragging except curses.error: - # If we can't get mouse state, keep the divider where it is + # If we can't get mouse state, try again on next iteration pass #