From d1b65c5c54d96e5fc33f8f609c674ad5027e411e Mon Sep 17 00:00:00 2001 From: lohhiiccc <96543753+lohhiiccc@users.noreply.github.com> Date: Wed, 1 Jul 2026 00:37:07 +0200 Subject: [PATCH] feat: add keyboard navigation with Cursor and Input classes --- src/IO/Input.py | 25 +++++++++++++++++++++++++ src/IO/UI.py | 4 ++-- src/{ => core}/App.py | 17 ++++++++++++----- src/core/Cursor.py | 14 ++++++++++++++ src/main.py | 2 +- 5 files changed, 54 insertions(+), 8 deletions(-) rename src/{ => core}/App.py (82%) create mode 100644 src/core/Cursor.py diff --git a/src/IO/Input.py b/src/IO/Input.py index e69de29..c304058 100644 --- a/src/IO/Input.py +++ b/src/IO/Input.py @@ -0,0 +1,25 @@ +from __future__ import annotations +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .App import App + + +class Input: + def __init__(self, app: App) -> None: + self._app = app + + def handle(self, key: str) -> bool: + if 'q' == key: + return False + elif key in ('j', 'KEY_DOWN'): + self.app.cursor.down(len(self.app.items)) + elif key in ('k', 'KEY_UP'): + self.app.cursor.up() + return True + + @property + def app(self) -> App: + return self._app + + diff --git a/src/IO/UI.py b/src/IO/UI.py index d9e1111..7076e05 100644 --- a/src/IO/UI.py +++ b/src/IO/UI.py @@ -15,7 +15,7 @@ class UI: def _get_attr(self, item: any, i: int) -> str: attr = curses.color_pair(item.color_pair) - if i == self.app.cursor: + if i == self.app.cursor.pos: attr |= curses.A_REVERSE return attr @@ -38,7 +38,7 @@ class UI: if type(item) is Symlink: attr_arrow = curses.color_pair(0) attr_target = curses.color_pair(Symlink.target_color(item.point_to)) - if i == self.app.cursor: + if i == self.app.cursor.pos: attr_arrow |= curses.A_REVERSE attr_target |= curses.A_REVERSE stdscr.addstr(i, name_len, self.ARROW, attr_arrow) diff --git a/src/App.py b/src/core/App.py similarity index 82% rename from src/App.py rename to src/core/App.py index 3035cc5..7e63a17 100644 --- a/src/App.py +++ b/src/core/App.py @@ -1,6 +1,8 @@ -from .items.Folder import Folder +from ..items.Folder import Folder from pathlib import Path -from .IO.UI import UI +from ..IO.UI import UI +from ..IO.Input import Input +from .Cursor import Cursor import curses @@ -16,7 +18,8 @@ class App(): self._current = Folder(path) self._items = self.current.children() self._UI = UI(self) - self._cursor = 2 + self._input = Input(self) + self._cursor = Cursor() def _run(self, stdscr: curses.window) -> None: curses.curs_set(0) @@ -37,7 +40,7 @@ class App(): stdscr.refresh() key = stdscr.getkey() self._items = self.current.children() - if 'q' == key: + if False == self.input.handle(key): break def run(self) -> None: @@ -60,5 +63,9 @@ class App(): return self._UI @property - def cursor(self) -> int: + def input(self) -> Input: + return self._input + + @property + def cursor(self) -> Cursor: return self._cursor diff --git a/src/core/Cursor.py b/src/core/Cursor.py new file mode 100644 index 0000000..7b81139 --- /dev/null +++ b/src/core/Cursor.py @@ -0,0 +1,14 @@ + +class Cursor: + def __init__(self) -> None: + self._pos = 0 + + def up(self) -> None: + self._pos -= 1 if self.pos >= 1 else 0 + + def down(self, max: int) -> None: + self._pos = min(self.pos + 1, max - 1) + + @property + def pos(self) -> int: + return self._pos diff --git a/src/main.py b/src/main.py index 07f7c1e..a22acef 100644 --- a/src/main.py +++ b/src/main.py @@ -1,4 +1,4 @@ -from .App import App +from .core.App import App from pathlib import Path import sys