WIP: draggable divider

This commit is contained in:
n loewen 2025-04-23 22:55:17 +01:00
parent ffdef8d92d
commit a1255b237b
1 changed files with 64 additions and 8 deletions

View File

@ -16,7 +16,8 @@ def get_file_at_commit(commit_hash, filename):
def main(stdscr, filename):
curses.curs_set(0)
curses.mousemask(curses.ALL_MOUSE_EVENTS)
curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION)
curses.mouseinterval(0)
stdscr.keypad(True)
commits = get_commits(filename)
@ -25,6 +26,8 @@ def main(stdscr, filename):
focus = "left"
scroll_offset = 0
dragging_divider = False
while True:
stdscr.clear()
height, width = stdscr.getmaxyx()
@ -46,8 +49,9 @@ def main(stdscr, filename):
stdscr.attroff(curses.A_REVERSE)
# Vertical divider
divider_char = "" if dragging_divider else ""
for y in range(height):
stdscr.addch(y, divider_col, '')
stdscr.addch(y, divider_col, divider_char)
# Draw file content (right pane)
for i, line in enumerate(visible_lines):
@ -67,20 +71,70 @@ def main(stdscr, filename):
x = width - len(status) - 1
stdscr.addnstr(height - 1, x, status, len(status), curses.A_REVERSE)
stdscr.refresh()
key = stdscr.getch()
# Mouse click changes focus
# Mouse interaction
if key == curses.KEY_MOUSE:
try:
_, mx, my, _, bstate = curses.getmouse()
if bstate & curses.BUTTON1_CLICKED:
focus = "left" if mx <= divider_col else "right"
if bstate & curses.BUTTON1_PRESSED:
if mx == divider_col:
dragging_divider = True
elif 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 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
elif dragging_divider:
# Force a mouse event check while dragging
try:
_, mx, my, _, bstate = curses.getmouse()
if bstate & curses.BUTTON1_PRESSED:
min_col = 10
max_col = width - 20 # leave space for right pane
divider_col = max(min_col, min(mx, max_col))
elif bstate & curses.BUTTON1_RELEASED:
dragging_divider = False
except curses.error:
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
# Left pane movement
elif focus == "left":
@ -112,6 +166,8 @@ def main(stdscr, filename):
elif key in [curses.KEY_RIGHT, ord('l')]:
focus = "right"
stdscr.refresh()
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python git_time_machine.py path/to/file")