diff --git a/cheuph/cursor_tree_widget.py b/cheuph/cursor_tree_widget.py index 98544a2..7ca8368 100644 --- a/cheuph/cursor_tree_widget.py +++ b/cheuph/cursor_tree_widget.py @@ -1,14 +1,10 @@ -# TODO remove testing code and clean up - -import datetime -import time from typing import Optional, Tuple, TypeVar import urwid from .attributed_lines_widget import AttributedLinesWidget from .cursor_rendering import CursorTreeRenderer -from .element import Element, Message +from .element import Element __all__ = ["CursorTreeWidget"] @@ -19,11 +15,27 @@ class CursorTreeWidget(urwid.WidgetWrap): This widget draws a CursorTree and moves the cursor around. """ - def __init__(self, tree: CursorTreeRenderer[E]) -> None: + def __init__(self, + tree: CursorTreeRenderer[E], + vertical_scroll_step: int = 1, + horizontal_scroll_step: int = 4, + half_page_scroll: bool = False, + ) -> None: + self._tree = tree self._lines = AttributedLinesWidget() + super().__init__(self._lines) + # Configurable variables + if vertical_scroll_step < 1: + raise ValueError("vertical scroll step must be at least 1") + if horizontal_scroll_step < 1: + raise ValueError("horizontal scroll step must be at least 1") + self._vertical_scroll_step = vertical_scroll_step + self._horizontal_scroll_step = horizontal_scroll_step + self._half_page_scroll = half_page_scroll + def render(self, size: Tuple[int, int], focus: bool) -> None: width, height = size @@ -38,41 +50,39 @@ class CursorTreeWidget(urwid.WidgetWrap): def keypress(self, size: Tuple[int, int], key: str) -> Optional[str]: width, height = size - if key == "up": + if key in {"up", "k"}: self._tree.move_cursor_up() self._invalidate() - elif key == "down": + elif key in {"down", "j"}: self._tree.move_cursor_down() self._invalidate() - elif key == "shift up": - self._tree.scroll(1) + elif key in {"shift up", "K"}: + self._tree.scroll(self._vertical_scroll_step) self._invalidate() - elif key == "shift down": - self._tree.scroll(-1) + elif key in {"shift down", "J"}: + self._tree.scroll(-self._vertical_scroll_step) self._invalidate() - elif key == "shift right": - self.scroll_horizontally(1) - elif key == "shift left": - self.scroll_horizontally(-1) - elif key in {"home", "shift home"}: + elif key in {"shift right", "L"}: + self.scroll_horizontally(self._horizontal_scroll_step) + elif key in {"shift left", "H"}: + self.scroll_horizontally(-self._horizontal_scroll_step) + elif key == "shift home": self._lines.horizontal_offset = 0 self._invalidate() elif key == "shift page up": - self._tree.scroll(height - 1) + if self._half_page_scroll: + self._tree.scroll(height // 2) + else: + self._tree.scroll(height - 1) self._invalidate() elif key == "shift page down": - self._tree.scroll(-(height - 1)) + if self._half_page_scroll: + self._tree.scroll(-(height // 2)) + else: + self._tree.scroll(-(height - 1)) self._invalidate() else: - t = datetime.datetime(2019,5,7,13,25,6) - self._tree._supply.add(Message( - str(time.time()), - self._tree._cursor_id, - t, - "key", - key, - )) - self._invalidate() + return key return None