98 lines
2.7 KiB
Python
98 lines
2.7 KiB
Python
from pathlib import Path
|
|
from ..items.AItems import AItem
|
|
from ..items.Folder import Folder
|
|
from ..items.Symlink import Symlink
|
|
from . import Sort
|
|
from .Config import Config
|
|
from .Cursor import Cursor
|
|
|
|
|
|
class Navigator:
|
|
|
|
def __init__(self, path: Path, config: Config) -> None:
|
|
self._config = config
|
|
self._sort_mode = config.sort_mode
|
|
self._history = [path]
|
|
self._cursor = Cursor()
|
|
self._current: Folder | None = None
|
|
self._items: list[AItem] = []
|
|
self._error: str | None = None
|
|
self._action_error: str | None = None
|
|
self._load()
|
|
|
|
def _load(self) -> None:
|
|
self._error = None
|
|
try:
|
|
self._current = Folder(self._history[-1])
|
|
self._items = Sort.sort_items(self._current.children(),
|
|
self._sort_mode)
|
|
except FileNotFoundError:
|
|
self._items = []
|
|
except PermissionError:
|
|
self._items = []
|
|
self._error = f"Permission denied: {self._history[-1]}"
|
|
|
|
def refresh(self) -> None:
|
|
self._load()
|
|
|
|
def cycle_sort(self) -> None:
|
|
self._sort_mode = Sort.next_mode(self._sort_mode)
|
|
self._items = Sort.sort_items(self._items, self._sort_mode)
|
|
|
|
def _reset_cursor(self) -> None:
|
|
if self._config.cursor_reset == "keep":
|
|
self._cursor.clamp(len(self._items))
|
|
else:
|
|
self._cursor.resete()
|
|
|
|
def set_action_error(self, message: str) -> None:
|
|
self._action_error = message
|
|
|
|
def _navigate_to(self, path: Path) -> None:
|
|
self._history.append(path)
|
|
self._action_error = None
|
|
self._load()
|
|
self._reset_cursor()
|
|
|
|
def enter(self, item: AItem) -> bool:
|
|
if not item.is_navigable():
|
|
return False
|
|
path = item.point_to if isinstance(item, Symlink) else item.path
|
|
self._navigate_to(path)
|
|
return True
|
|
|
|
def up(self) -> bool:
|
|
parent = self._history[-1].parent
|
|
if parent == self._history[-1]:
|
|
return False
|
|
self._navigate_to(parent)
|
|
return True
|
|
|
|
def back(self) -> bool:
|
|
if len(self._history) <= 1:
|
|
return False
|
|
self._history.pop()
|
|
self._action_error = None
|
|
self._load()
|
|
self._reset_cursor()
|
|
return True
|
|
|
|
@property
|
|
def current(self) -> Folder:
|
|
return self._current
|
|
|
|
@property
|
|
def items(self) -> list[AItem]:
|
|
return self._items
|
|
|
|
@property
|
|
def history(self) -> list[Path]:
|
|
return self._history
|
|
|
|
@property
|
|
def cursor(self) -> Cursor:
|
|
return self._cursor
|
|
|
|
@property
|
|
def error(self) -> str | None:
|
|
return self._action_error or self._error
|