WIP: draggable divider
This commit is contained in:
parent
ffdef8d92d
commit
a1255b237b
|
|
@ -16,7 +16,8 @@ def get_file_at_commit(commit_hash, filename):
|
||||||
|
|
||||||
def main(stdscr, filename):
|
def main(stdscr, filename):
|
||||||
curses.curs_set(0)
|
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)
|
stdscr.keypad(True)
|
||||||
|
|
||||||
commits = get_commits(filename)
|
commits = get_commits(filename)
|
||||||
|
|
@ -25,6 +26,8 @@ def main(stdscr, filename):
|
||||||
focus = "left"
|
focus = "left"
|
||||||
scroll_offset = 0
|
scroll_offset = 0
|
||||||
|
|
||||||
|
dragging_divider = False
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
stdscr.clear()
|
stdscr.clear()
|
||||||
height, width = stdscr.getmaxyx()
|
height, width = stdscr.getmaxyx()
|
||||||
|
|
@ -46,8 +49,9 @@ def main(stdscr, filename):
|
||||||
stdscr.attroff(curses.A_REVERSE)
|
stdscr.attroff(curses.A_REVERSE)
|
||||||
|
|
||||||
# Vertical divider
|
# Vertical divider
|
||||||
|
divider_char = "║" if dragging_divider else "│"
|
||||||
for y in range(height):
|
for y in range(height):
|
||||||
stdscr.addch(y, divider_col, '│')
|
stdscr.addch(y, divider_col, divider_char)
|
||||||
|
|
||||||
# Draw file content (right pane)
|
# Draw file content (right pane)
|
||||||
for i, line in enumerate(visible_lines):
|
for i, line in enumerate(visible_lines):
|
||||||
|
|
@ -67,20 +71,70 @@ def main(stdscr, filename):
|
||||||
x = width - len(status) - 1
|
x = width - len(status) - 1
|
||||||
stdscr.addnstr(height - 1, x, status, len(status), curses.A_REVERSE)
|
stdscr.addnstr(height - 1, x, status, len(status), curses.A_REVERSE)
|
||||||
|
|
||||||
stdscr.refresh()
|
|
||||||
key = stdscr.getch()
|
key = stdscr.getch()
|
||||||
|
|
||||||
# Mouse click changes focus
|
# Mouse interaction
|
||||||
if key == curses.KEY_MOUSE:
|
if key == curses.KEY_MOUSE:
|
||||||
try:
|
try:
|
||||||
_, mx, my, _, bstate = curses.getmouse()
|
_, 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:
|
except curses.error:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
elif key in [ord('q'), 27]:
|
elif dragging_divider:
|
||||||
break
|
# 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
|
# Left pane movement
|
||||||
elif focus == "left":
|
elif focus == "left":
|
||||||
|
|
@ -112,6 +166,8 @@ def main(stdscr, filename):
|
||||||
elif key in [curses.KEY_RIGHT, ord('l')]:
|
elif key in [curses.KEY_RIGHT, ord('l')]:
|
||||||
focus = "right"
|
focus = "right"
|
||||||
|
|
||||||
|
stdscr.refresh()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if len(sys.argv) != 2:
|
if len(sys.argv) != 2:
|
||||||
print("Usage: python git_time_machine.py path/to/file")
|
print("Usage: python git_time_machine.py path/to/file")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue