feat: Improve divider dragging with real-time mouse tracking and responsive UI

This commit is contained in:
n loewen (aider) 2025-05-05 09:01:23 +01:00
parent f58ae2783f
commit bca2255f58
1 changed files with 22 additions and 34 deletions

View File

@ -19,6 +19,8 @@ def main(stdscr, filename):
curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION) curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION)
curses.mouseinterval(0) curses.mouseinterval(0)
stdscr.keypad(True) stdscr.keypad(True)
# Default to blocking mode (-1)
stdscr.timeout(-1)
commits = get_commits(filename) commits = get_commits(filename)
selected_commit = 0 selected_commit = 0
@ -78,9 +80,12 @@ def main(stdscr, filename):
try: try:
_, mx, my, _, bstate = curses.getmouse() _, mx, my, _, bstate = curses.getmouse()
# Start dragging when mouse is pressed on or near divider
if bstate & curses.BUTTON1_PRESSED: 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 dragging_divider = True
# Set short timeout for responsive updates during dragging
stdscr.timeout(1)
# Update divider position while dragging # Update divider position while dragging
if dragging_divider: if dragging_divider:
@ -88,57 +93,40 @@ def main(stdscr, filename):
max_col = width - 20 # leave space for right pane max_col = width - 20 # leave space for right pane
divider_col = max(min_col, min(mx, max_col)) divider_col = max(min_col, min(mx, max_col))
# Stop dragging when mouse is released
if bstate & curses.BUTTON1_RELEASED: if bstate & curses.BUTTON1_RELEASED:
if dragging_divider:
dragging_divider = False dragging_divider = False
# Reset to blocking mode when done dragging
stdscr.timeout(-1)
elif bstate & curses.BUTTON1_CLICKED and not dragging_divider: elif bstate & curses.BUTTON1_CLICKED and not dragging_divider:
focus = "left" if mx < divider_col else "right" focus = "left" if mx < divider_col else "right"
except curses.error: except curses.error:
pass pass
# Continue updating divider position even without explicit mouse events # When no key is pressed but we're in dragging mode (timeout returns -1)
elif dragging_divider: elif key == -1 and dragging_divider:
try: try:
# Get current mouse position and update divider
_, mx, my, _, bstate = curses.getmouse() _, mx, my, _, bstate = curses.getmouse()
# Update divider position # Update divider position based on current mouse position
min_col = 10 min_col = 10
max_col = width - 20 # leave space for right pane max_col = width - 20 # leave space for right pane
divider_col = max(min_col, min(mx, max_col)) divider_col = max(min_col, min(mx, max_col))
# Check for mouse button release # 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 dragging_divider = False
# Reset to blocking mode when done dragging
stdscr.timeout(-1)
except curses.error: 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 pass
# # Exit on 'q' or ESC
# # Mouse click changes focus elif key in [ord('q'), 27]:
# if key == curses.KEY_MOUSE: break
# 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
# Left pane movement # Left pane movement
elif focus == "left": elif focus == "left":