From bca2255f5844170bd2faaf005ac90a2a4c7e2d15 Mon Sep 17 00:00:00 2001 From: "n loewen (aider)" Date: Mon, 5 May 2025 09:01:23 +0100 Subject: [PATCH] feat: Improve divider dragging with real-time mouse tracking and responsive UI --- git_time_machine.py | 56 ++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/git_time_machine.py b/git_time_machine.py index ea1f503..f9d773e 100644 --- a/git_time_machine.py +++ b/git_time_machine.py @@ -19,6 +19,8 @@ def main(stdscr, filename): curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION) curses.mouseinterval(0) stdscr.keypad(True) + # Default to blocking mode (-1) + stdscr.timeout(-1) commits = get_commits(filename) selected_commit = 0 @@ -78,9 +80,12 @@ def main(stdscr, filename): try: _, mx, my, _, bstate = curses.getmouse() + # Start dragging when mouse is pressed on or near divider if bstate & curses.BUTTON1_PRESSED: - if mx == divider_col: + if abs(mx - divider_col) <= 1: # Allow clicking within 1 column of divider dragging_divider = True + # Set short timeout for responsive updates during dragging + stdscr.timeout(1) # Update divider position while dragging if dragging_divider: @@ -88,57 +93,40 @@ def main(stdscr, filename): max_col = width - 20 # leave space for right pane divider_col = max(min_col, min(mx, max_col)) + # Stop dragging when mouse is released if bstate & curses.BUTTON1_RELEASED: - dragging_divider = False + if dragging_divider: + dragging_divider = False + # Reset to blocking mode when done dragging + stdscr.timeout(-1) elif bstate & curses.BUTTON1_CLICKED and not dragging_divider: focus = "left" if mx < divider_col else "right" except curses.error: pass - # Continue updating divider position even without explicit mouse events - elif dragging_divider: + # When no key is pressed but we're in dragging mode (timeout returns -1) + elif key == -1 and dragging_divider: try: + # Get current mouse position and update divider _, mx, my, _, bstate = curses.getmouse() - # Update divider position + # Update divider position based on current mouse position min_col = 10 max_col = width - 20 # leave space for right pane divider_col = max(min_col, min(mx, max_col)) # Check for mouse button release - if bstate & curses.BUTTON1_RELEASED or not (bstate & curses.BUTTON1_PRESSED): + if not (bstate & curses.BUTTON1_PRESSED): dragging_divider = False + # Reset to blocking mode when done dragging + stdscr.timeout(-1) except curses.error: - # If we can't get mouse state, keep the divider where it is + # If we can't get mouse state, continue pass -# -# # Mouse click changes focus -# if key == curses.KEY_MOUSE: -# try: -# _, mx, my, _, bstate = curses.getmouse() -# -# if bstate & curses.BUTTON1_PRESSED: -# if dragging_divider: -# # Update divider while dragging -# min_col = 10 -# max_col = width - 20 # leave space for right pane -# divider_col = max(min_col, min(mx, max_col)) -# elif mx == divider_col: -# dragging_divider = True -# -# elif bstate & curses.BUTTON1_RELEASED: -# dragging_divider = False -# -# elif bstate & curses.BUTTON1_CLICKED: -# focus = "left" if mx < divider_col else "right" -# -# except curses.error: -# pass -# -# -# elif key in [ord('q'), 27]: -# break + # Exit on 'q' or ESC + elif key in [ord('q'), 27]: + break # Left pane movement elif focus == "left":