mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-28 22:33:59 -06:00
ui: add shortcuts
This commit is contained in:
+12
-1
@@ -4,10 +4,21 @@ import urwid
|
|||||||
|
|
||||||
|
|
||||||
class MenuButton(urwid.Button):
|
class MenuButton(urwid.Button):
|
||||||
def __init__(self, label: str, *args: T.Any, **kwargs: T.Any) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
label: str,
|
||||||
|
*args: T.Any,
|
||||||
|
hint: T.Optional[str] = None,
|
||||||
|
**kwargs: T.Any
|
||||||
|
) -> None:
|
||||||
super().__init__("", *args, **kwargs)
|
super().__init__("", *args, **kwargs)
|
||||||
self._w = urwid.AttrMap(
|
self._w = urwid.AttrMap(
|
||||||
|
urwid.Columns(
|
||||||
|
[
|
||||||
urwid.SelectableIcon(["\N{BULLET} ", label], 2),
|
urwid.SelectableIcon(["\N{BULLET} ", label], 2),
|
||||||
|
("pack", urwid.Text(hint or "", align="right")),
|
||||||
|
]
|
||||||
|
),
|
||||||
"button",
|
"button",
|
||||||
"button-focus",
|
"button-focus",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -10,8 +10,12 @@ class ExitView(urwid.Overlay):
|
|||||||
|
|
||||||
def __init__(self, parent: urwid.Widget) -> None:
|
def __init__(self, parent: urwid.Widget) -> None:
|
||||||
question = urwid.Text(("bold", "Really quit?"), "center")
|
question = urwid.Text(("bold", "Really quit?"), "center")
|
||||||
yes_btn = MenuButton("Yes", lambda _user_data: self.exit())
|
yes_btn = MenuButton(
|
||||||
no_btn = MenuButton("No", lambda _user_data: self.cancel())
|
"Yes", hint="Y", on_press=lambda _user_data: self.exit()
|
||||||
|
)
|
||||||
|
no_btn = MenuButton(
|
||||||
|
"No", hint="N", on_press=lambda _user_data: self.cancel()
|
||||||
|
)
|
||||||
|
|
||||||
line_box = urwid.LineBox(
|
line_box = urwid.LineBox(
|
||||||
urwid.ListBox(
|
urwid.ListBox(
|
||||||
|
|||||||
+51
-13
@@ -18,8 +18,12 @@ class StatsBox(LineBox):
|
|||||||
self.total_label = urwid.Text("0")
|
self.total_label = urwid.Text("0")
|
||||||
self.update_values()
|
self.update_values()
|
||||||
|
|
||||||
roll_button = MenuButton("Roll", on_press=self.on_roll_press)
|
roll_button = MenuButton(
|
||||||
unroll_button = MenuButton("Unroll", on_press=self.on_unroll_press)
|
"Roll", hint="F5", on_press=self.on_roll_press
|
||||||
|
)
|
||||||
|
unroll_button = MenuButton(
|
||||||
|
"Unroll", hint="F6", on_press=self.on_unroll_press
|
||||||
|
)
|
||||||
|
|
||||||
value_texts = list(self.stat_labels.values())
|
value_texts = list(self.stat_labels.values())
|
||||||
label_texts = [urwid.Text(f"{stat.value}: ") for stat in PRIME_STATS]
|
label_texts = [urwid.Text(f"{stat.value}: ") for stat in PRIME_STATS]
|
||||||
@@ -40,17 +44,23 @@ class StatsBox(LineBox):
|
|||||||
title="Stats",
|
title="Stats",
|
||||||
)
|
)
|
||||||
|
|
||||||
def on_roll_press(self, _user_data: T.Any) -> None:
|
def roll(self) -> None:
|
||||||
self.stats = self.stats_builder.roll()
|
self.stats = self.stats_builder.roll()
|
||||||
self.update_values()
|
self.update_values()
|
||||||
|
|
||||||
def on_unroll_press(self, _user_data: T.Any) -> None:
|
def unroll(self) -> None:
|
||||||
try:
|
try:
|
||||||
self.stats = self.stats_builder.unroll()
|
self.stats = self.stats_builder.unroll()
|
||||||
except IndexError:
|
except IndexError:
|
||||||
return
|
return
|
||||||
self.update_values()
|
self.update_values()
|
||||||
|
|
||||||
|
def on_roll_press(self, _user_data: T.Any) -> None:
|
||||||
|
self.roll()
|
||||||
|
|
||||||
|
def on_unroll_press(self, _user_data: T.Any) -> None:
|
||||||
|
self.unroll()
|
||||||
|
|
||||||
def update_values(self) -> None:
|
def update_values(self) -> None:
|
||||||
for stat, edit in self.stat_labels.items():
|
for stat, edit in self.stat_labels.items():
|
||||||
edit.set_text(str(self.stats[stat]))
|
edit.set_text(str(self.stats[stat]))
|
||||||
@@ -117,15 +127,21 @@ class NewGameView(urwid.Pile):
|
|||||||
"Name: ", generate_name()
|
"Name: ", generate_name()
|
||||||
)
|
)
|
||||||
generate_char_name_btn = MenuButton(
|
generate_char_name_btn = MenuButton(
|
||||||
"Generate random name", on_press=self.on_generate_char_name_press
|
"Generate random name",
|
||||||
|
hint="F7",
|
||||||
|
on_press=self.on_generate_char_name_press,
|
||||||
)
|
)
|
||||||
|
|
||||||
buttons_box = urwid.Filler(
|
buttons_box = urwid.Filler(
|
||||||
urwid.Padding(
|
urwid.Padding(
|
||||||
urwid.Pile(
|
urwid.Pile(
|
||||||
[
|
[
|
||||||
MenuButton("Sold!", self.on_confirm_press),
|
MenuButton(
|
||||||
MenuButton("Cancel", self.on_cancel_press),
|
"Sold!", hint="F10", on_press=self.on_confirm_press
|
||||||
|
),
|
||||||
|
MenuButton(
|
||||||
|
"Cancel", hint="Esc", on_press=self.on_cancel_press
|
||||||
|
),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
width=20,
|
width=20,
|
||||||
@@ -159,10 +175,7 @@ class NewGameView(urwid.Pile):
|
|||||||
self.char_name_edit.edit_text = generate_name()
|
self.char_name_edit.edit_text = generate_name()
|
||||||
self.char_name_edit.edit_pos = len(self.char_name_edit.edit_text)
|
self.char_name_edit.edit_pos = len(self.char_name_edit.edit_text)
|
||||||
|
|
||||||
def on_generate_char_name_press(self, _user_data: T.Any) -> None:
|
def confirm(self) -> None:
|
||||||
self.generate_random_char_name()
|
|
||||||
|
|
||||||
def on_confirm_press(self, _user_data: T.Any) -> None:
|
|
||||||
player = create_player(
|
player = create_player(
|
||||||
name=self.char_name_edit.edit_text,
|
name=self.char_name_edit.edit_text,
|
||||||
race=self.race_box.race,
|
race=self.race_box.race,
|
||||||
@@ -171,12 +184,37 @@ class NewGameView(urwid.Pile):
|
|||||||
)
|
)
|
||||||
self._emit("confirm", player)
|
self._emit("confirm", player)
|
||||||
|
|
||||||
def on_cancel_press(self, _user_data: T.Any) -> None:
|
def cancel(self) -> None:
|
||||||
self._emit("cancel")
|
self._emit("cancel")
|
||||||
|
|
||||||
|
def on_generate_char_name_press(self, _user_data: T.Any) -> None:
|
||||||
|
self.generate_random_char_name()
|
||||||
|
|
||||||
|
def on_confirm_press(self, _user_data: T.Any) -> None:
|
||||||
|
self.confirm()
|
||||||
|
|
||||||
|
def on_cancel_press(self, _user_data: T.Any) -> None:
|
||||||
|
self.cancel()
|
||||||
|
|
||||||
def unhandled_input(self, key: str) -> bool:
|
def unhandled_input(self, key: str) -> bool:
|
||||||
if key == "esc":
|
if key == "esc":
|
||||||
self._emit("cancel")
|
self.cancel()
|
||||||
|
return True
|
||||||
|
|
||||||
|
if key == "f7":
|
||||||
|
self.generate_random_char_name()
|
||||||
|
return True
|
||||||
|
|
||||||
|
if key == "f5":
|
||||||
|
self.stats_box.roll()
|
||||||
|
return True
|
||||||
|
|
||||||
|
if key == "f6":
|
||||||
|
self.stats_box.unroll()
|
||||||
|
return True
|
||||||
|
|
||||||
|
if key == "f10":
|
||||||
|
self.confirm()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|||||||
+10
-2
@@ -26,11 +26,15 @@ class RosterView(urwid.Filler):
|
|||||||
|
|
||||||
buttons.append(
|
buttons.append(
|
||||||
MenuButton(
|
MenuButton(
|
||||||
label="Create a new character", on_press=self.on_new_game_press
|
label="Create a new character",
|
||||||
|
hint="F1",
|
||||||
|
on_press=self.on_new_game_press,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
buttons.append(MenuButton(label="Exit", on_press=self.on_exit_press))
|
buttons.append(
|
||||||
|
MenuButton(label="Exit", hint="Esc", on_press=self.on_exit_press)
|
||||||
|
)
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
urwid.Padding(
|
urwid.Padding(
|
||||||
@@ -62,4 +66,8 @@ class RosterView(urwid.Filler):
|
|||||||
self._emit("exit")
|
self._emit("exit")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
if key == "f1":
|
||||||
|
self._emit("new_game")
|
||||||
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|||||||
Reference in New Issue
Block a user