feat: Improve divider dragging with real-time mouse tracking and responsive UI
This commit is contained in:
parent
f58ae2783f
commit
bca2255f58
|
|
@ -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:
|
||||||
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:
|
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":
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue