From a1255b237bd3a7ab6844f86653532cba9afff864 Mon Sep 17 00:00:00 2001 From: n loewen Date: Wed, 23 Apr 2025 22:55:17 +0100 Subject: [PATCH] WIP: draggable divider --- git_time_machine.py | 72 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/git_time_machine.py b/git_time_machine.py index e833023..00d74ee 100644 --- a/git_time_machine.py +++ b/git_time_machine.py @@ -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")