mirror of
https://github.com/rr-/pq-cli.git
synced 2026-11-12 22:40:36 -07:00
Python 3.10 is the minimum, so annotations use `X | None`, `list[X]` and friends, enforced by ruff's pyupgrade rules. The remaining typing names are imported directly, with abstract types coming from collections.abc. first() is now generic over the item and default.
44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
import contextlib
|
|
import curses
|
|
from collections.abc import Generator
|
|
from typing import Any
|
|
|
|
from pqcli.ui.curses.colors import COLOR_FOCUSED, has_colors
|
|
from pqcli.ui.curses.event_handler import EventHandler
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def focus_standout(focused: bool, win: Any) -> Generator:
|
|
if focused:
|
|
if has_colors():
|
|
win.attron(curses.color_pair(COLOR_FOCUSED))
|
|
else:
|
|
win.standout()
|
|
yield
|
|
if focused:
|
|
if has_colors():
|
|
win.attroff(curses.color_pair(COLOR_FOCUSED))
|
|
else:
|
|
win.standend()
|
|
|
|
|
|
class Focusable:
|
|
def __init__(self, *args: Any, **kwargs: Any) -> None:
|
|
self._focused = False
|
|
self._on_focus_change = EventHandler()
|
|
super().__init__(*args, **kwargs)
|
|
|
|
@property
|
|
def focused(self) -> bool:
|
|
return self._focused
|
|
|
|
@focused.setter
|
|
def focused(self, focused: bool) -> None:
|
|
self._focused = focused
|
|
self._on_focus_change()
|
|
|
|
@contextlib.contextmanager
|
|
def focus_standout(self, win: Any) -> Generator:
|
|
with focus_standout(self._focused, win):
|
|
yield
|