mirror of
https://github.com/rr-/pq-cli.git
synced 2026-11-12 22:40:36 -07:00
ty reported 20 diagnostics, and 0.0.89 adds a few more; this clears them all without suppressions. - The quest monster is held in a local before being stored on the quest book, so its name no longer reads from an Optional. - PgUp/PgDn narrow the focused window with isinstance against a runtime-checkable PageScrollable protocol instead of hasattr. - The ^t cheat used to monkeypatch SignalMixin.emit. SignalMixin now has a muted() context manager that emit() checks, and it restores emission even if a tick raises. - GameView keeps its children as GameWindow, a protocol declaring stop() and sync(), so the cheat's resync type-checks. - curses.ascii is imported explicitly where it is used. - ProgressBarWindow is now Focusable itself, instead of calling Focusable.focus_standout() on a class that is not Focusable. Its four subclasses drop the duplicate Focusable base; the MRO and initialisation order are unchanged. - MainMenu narrows the Optional pad before colouring the logo. - The tests that record tasks assert player.task is set. - Context managers are annotated as Generator rather than Iterator, which ty flags as deprecated for @contextmanager. - The redundant cast() around getch() is gone. - The frozen GameData test assigns through setattr(), since the direct assignment is an error by design. Bug fixes: - ListBox.select(None) crashed on `None < 0`; it now clears the selection, as DataTable.select(None) already does. - ListBox.get() caught ValueError, which indexing never raises; it now catches IndexError, so an out-of-range index returns None as intended.
69 lines
2.1 KiB
Python
69 lines
2.1 KiB
Python
from typing import Any
|
|
|
|
from pqcli.lingo import act_name
|
|
from pqcli.mechanic import Player
|
|
|
|
from .progress_bar_window import ListBoxProgressBarWindow
|
|
|
|
|
|
class PlotWindow(ListBoxProgressBarWindow):
|
|
cutoff = 100
|
|
|
|
def __init__(
|
|
self, player: Player, parent: Any, h: int, w: int, y: int, x: int
|
|
) -> None:
|
|
super().__init__(
|
|
parent, h, w, y, x, " Plot Development ", show_time=True
|
|
)
|
|
self._on_focus_change += self._render
|
|
|
|
self._player = player
|
|
self._player.quest_book.connect("start_act", self._sync_act_add)
|
|
self._player.quest_book.plot_bar.connect("change", self._sync_position)
|
|
|
|
self.sync()
|
|
|
|
def stop(self) -> None:
|
|
super().stop()
|
|
self._list_box.stop()
|
|
|
|
self._player.quest_book.disconnect("start_act", self._sync_act_add)
|
|
self._player.quest_book.plot_bar.disconnect(
|
|
"change", self._sync_position
|
|
)
|
|
|
|
def scroll_page_up(self) -> None:
|
|
self._list_box.scroll_page_up()
|
|
self._render()
|
|
|
|
def scroll_page_down(self) -> None:
|
|
self._list_box.scroll_page_down()
|
|
self._render()
|
|
|
|
def sync(self) -> None:
|
|
self._sync_acts()
|
|
self._sync_position()
|
|
|
|
def _sync_acts(self) -> None:
|
|
self._list_box.clear()
|
|
for act_number in range(
|
|
max(0, self._player.quest_book.act - self.cutoff),
|
|
self._player.quest_book.act + 1,
|
|
):
|
|
self._sync_act_add(act_number)
|
|
self._render_list_box()
|
|
|
|
def _sync_act_add(self, act_number: int) -> None:
|
|
self._list_box.delete(0, max(0, len(self._list_box) - self.cutoff))
|
|
prev = self._list_box.get(-1)
|
|
if prev is not None:
|
|
self._list_box.set(-1, "[X] " + prev[4:])
|
|
self._list_box.add("[ ] " + act_name(act_number))
|
|
self._list_box.select(-1)
|
|
self._render_list_box()
|
|
|
|
def _sync_position(self) -> None:
|
|
self._cur_pos = self._player.quest_book.plot_bar.position
|
|
self._max_pos = self._player.quest_book.plot_bar.max_
|
|
self._render_progress_bar()
|