# 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 __all__ = ["CursorTreeWidget"] E = TypeVar("E", bound=Element) class CursorTreeWidget(urwid.WidgetWrap): """ This widget draws a CursorTree and moves the cursor around. """ def __init__(self, tree: CursorTreeRenderer[E]) -> None: self._tree = tree self._lines = AttributedLinesWidget() super().__init__(self._lines) def render(self, size: Tuple[int, int], focus: bool) -> None: width, height = size self._tree.render(width, height) self._lines.set_lines(self._tree.lines) return super().render(size, focus) def selectable(self) -> bool: return True def keypress(self, size: Tuple[int, int], key: str) -> Optional[str]: width, height = size if key == "up": self._tree.move_cursor_up() self._invalidate() elif key == "down": self._tree.move_cursor_down() self._invalidate() elif key == "shift up": self._tree.scroll(1) self._invalidate() elif key == "shift down": self._tree.scroll(-1) self._invalidate() elif key == "shift right": self.scroll_horizontally(1) elif key == "shift left": self.scroll_horizontally(-1) elif key in {"home", "shift home"}: self._lines.horizontal_offset = 0 self._invalidate() elif key == "shift page up": self._tree.scroll(height - 1) self._invalidate() elif key == "shift page down": 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 None def scroll_horizontally(self, offset: int) -> None: self._lines.horizontal_offset = max(0, self._lines.horizontal_offset + offset) self._invalidate()