From 3d8034b28536f311ac59291be36d5b91a412e319 Mon Sep 17 00:00:00 2001 From: rr- Date: Fri, 4 Jan 2019 19:52:04 +0100 Subject: [PATCH] ui/curses: cancel char creation one step at a time --- pqcli/ui/curses/__init__.py | 28 +++++++++++++------ pqcli/ui/curses/views/confirm_view.py | 1 + .../ui/curses/views/create_character_view.py | 26 ++++++++++++----- pqcli/ui/curses/views/menu_view.py | 6 +++- pqcli/ui/curses/views/roster_view.py | 1 + pqcli/ui/curses/widgets/menu.py | 3 +- 6 files changed, 47 insertions(+), 18 deletions(-) diff --git a/pqcli/ui/curses/__init__.py b/pqcli/ui/curses/__init__.py index 80d59e6..51285e9 100644 --- a/pqcli/ui/curses/__init__.py +++ b/pqcli/ui/curses/__init__.py @@ -81,25 +81,33 @@ class CursesUserInterface(BaseUserInterface): def _switch_to_roster_view(self) -> None: self._switch_view(self._roster_view) - def _switch_to_create_char_name_view(self) -> None: - view = ChooseCharacterNameView(self._screen) + def _switch_to_create_char_name_view( + self, player_name: T.Optional[str] = None + ) -> None: + view = ChooseCharacterNameView(self._screen, player_name) view.on_cancel += self._switch_to_roster_view view.on_confirm += self._switch_to_create_char_race_view self._switch_view(view) - def _switch_to_create_char_race_view(self, player_name: str) -> None: - view = ChooseCharacterRaceView(self._screen) - view.on_cancel += self._switch_to_roster_view + def _switch_to_create_char_race_view( + self, player_name: str, race: T.Optional[Race] = None + ) -> None: + view = ChooseCharacterRaceView(self._screen, race) + view.on_cancel += lambda: self._switch_to_create_char_name_view( + player_name + ) view.on_confirm += lambda race: self._switch_to_create_char_class_view( player_name, race ) self._switch_view(view) def _switch_to_create_char_class_view( - self, player_name: str, race: Race + self, player_name: str, race: Race, class_: T.Optional[Class] = None ) -> None: - view = ChooseCharacterClassView(self._screen) - view.on_cancel += self._switch_to_roster_view + view = ChooseCharacterClassView(self._screen, class_) + view.on_cancel += lambda: self._switch_to_create_char_race_view( + player_name, race + ) view.on_confirm += lambda class_: self._switch_to_create_char_stats_view( player_name, race, class_ ) @@ -109,7 +117,9 @@ class CursesUserInterface(BaseUserInterface): self, player_name: str, race: Race, class_: Class ) -> None: view = ChooseCharacterStatsView(self._screen) - view.on_cancel += self._switch_to_roster_view + view.on_cancel += lambda: self._switch_to_create_char_class_view( + player_name, race, class_ + ) view.on_confirm += lambda stats: self._create_character( player_name, race, class_, stats ) diff --git a/pqcli/ui/curses/views/confirm_view.py b/pqcli/ui/curses/views/confirm_view.py index 97c5714..713e245 100644 --- a/pqcli/ui/curses/views/confirm_view.py +++ b/pqcli/ui/curses/views/confirm_view.py @@ -35,6 +35,7 @@ class ConfirmView(BaseView): self.main_menu = Menu( header=self.title, choices=self.choices, + active_choice=0, scr_height=scr_height, scr_width=scr_width, ) diff --git a/pqcli/ui/curses/views/create_character_view.py b/pqcli/ui/curses/views/create_character_view.py index 2c868ec..6cb63cf 100644 --- a/pqcli/ui/curses/views/create_character_view.py +++ b/pqcli/ui/curses/views/create_character_view.py @@ -3,7 +3,7 @@ import curses.ascii import functools import typing as T -from pqcli.config import CLASSES, PRIME_STATS, RACES +from pqcli.config import CLASSES, PRIME_STATS, RACES, Class, Race from pqcli.mechanic import StatsBuilder, generate_name from pqcli.ui.curses.event_handler import EventHandler from pqcli.ui.curses.util import Choice @@ -12,13 +12,15 @@ from pqcli.ui.curses.views.menu_view import MenuView class ChooseCharacterNameView(BaseView): - def __init__(self, screen: T.Any) -> None: + def __init__( + self, screen: T.Any, character_name: T.Optional[str] = None + ) -> None: super().__init__(screen) self.on_cancel = EventHandler() self.on_confirm = EventHandler() - self._text = generate_name() + self._text = character_name or generate_name() def start(self) -> None: self.screen.erase() @@ -79,8 +81,12 @@ class ChooseCharacterNameView(BaseView): class ChooseCharacterRaceView(MenuView): - def __init__(self, screen: T.Any) -> None: - super().__init__(screen, "Choose character race") + def __init__(self, screen: T.Any, race: T.Optional[Race] = None) -> None: + super().__init__( + screen, + "Choose character race", + RACES.index(race) if race is not None else 0, + ) for y, race in enumerate(RACES, 1): key: T.Optional[str] = str(y % 10) if y <= 10 else None @@ -102,8 +108,14 @@ class ChooseCharacterRaceView(MenuView): class ChooseCharacterClassView(MenuView): - def __init__(self, screen: T.Any) -> None: - super().__init__(screen, "Choose character class") + def __init__( + self, screen: T.Any, class_: T.Optional[Class] = None + ) -> None: + super().__init__( + screen, + "Choose character class", + CLASSES.index(class_) if class_ is not None else 0, + ) for y, class_ in enumerate(CLASSES, 1): key: T.Optional[str] = str(y % 10) if y <= 10 else None diff --git a/pqcli/ui/curses/views/menu_view.py b/pqcli/ui/curses/views/menu_view.py index 0e9b605..960b8ad 100644 --- a/pqcli/ui/curses/views/menu_view.py +++ b/pqcli/ui/curses/views/menu_view.py @@ -8,7 +8,9 @@ from pqcli.ui.curses.widgets import Menu class MenuView(BaseView): - def __init__(self, screen: T.Any, title: str) -> None: + def __init__( + self, screen: T.Any, title: str, active_choice: int = 0 + ) -> None: super().__init__(screen) self.on_cancel = EventHandler() @@ -16,6 +18,7 @@ class MenuView(BaseView): self._title = f"{title}:" self._choices: T.List[Choice] = [] + self._active_choice = active_choice def start(self) -> None: scr_height, scr_width = self.screen.getmaxyx() @@ -25,6 +28,7 @@ class MenuView(BaseView): self.main_menu = Menu( header=self._title, choices=self._choices, + active_choice=self._active_choice, scr_height=scr_height, scr_width=scr_width, ) diff --git a/pqcli/ui/curses/views/roster_view.py b/pqcli/ui/curses/views/roster_view.py index ad94562..519025a 100644 --- a/pqcli/ui/curses/views/roster_view.py +++ b/pqcli/ui/curses/views/roster_view.py @@ -53,6 +53,7 @@ class RosterView(BaseView): self.main_menu = Menu( header=LOGO, choices=self.choices, + active_choice=0, scr_height=scr_height, scr_width=scr_width, ) diff --git a/pqcli/ui/curses/widgets/menu.py b/pqcli/ui/curses/widgets/menu.py index ede0b88..68beb63 100644 --- a/pqcli/ui/curses/widgets/menu.py +++ b/pqcli/ui/curses/widgets/menu.py @@ -12,6 +12,7 @@ class Menu(Widget): self, header: str, choices: T.List[Choice], + active_choice: int, scr_height: int, scr_width: int, ) -> None: @@ -28,7 +29,7 @@ class Menu(Widget): self._pad.move(y, 0) self._pad.addstr(line) - self._active_choice = 0 + self._active_choice = active_choice def stop(self) -> None: del self._pad