1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""Scrollable help page backed by a bundled markdown file."""
from __future__ import annotations
from importlib.resources import files
from pyratatui import Frame, List, ListItem, ListState, Rect
from pygittools.tui.keys import KeyLike, is_down, is_esc, is_quit, is_up
from pygittools.tui.types import PageAction, PageContext, PageResult
def _load_help_lines() -> list[str]:
text = files("pygittools").joinpath("help.md").read_text(encoding="utf-8")
return text.splitlines()
class HelpPage:
title = "help"
def __init__(self) -> None:
self._lines = _load_help_lines()
self._state = ListState()
if self._lines:
self._state.select(0)
def on_enter(self, ctx: PageContext) -> None:
del ctx
def status_text(self) -> str:
total = len(self._lines)
if total == 0:
return "Help"
selected = self._state.selected
visible = (selected + 1) if selected is not None else 1
return f"Help {visible}/{total} — J/K or arrows to scroll, Q or Esc to go back"
def draw(self, frame: Frame, area: Rect) -> None:
if area.height <= 0 or area.width <= 0:
return
items = [ListItem(line if line else " ") for line in self._lines]
frame.render_stateful_list(List(items), area, self._state)
def handle_key(self, key: KeyLike) -> PageResult:
if is_quit(key) or is_esc(key):
return PageResult(action=PageAction.POP)
if is_up(key):
selected = self._state.selected or 0
self._state.select(max(0, selected - 1))
return PageResult()
if is_down(key):
selected = self._state.selected or 0
self._state.select(min(max(0, len(self._lines) - 1), selected + 1))
return PageResult()
return PageResult()
def help_page() -> HelpPage:
return HelpPage()