mirror of
https://github.com/rr-/pq-cli.git
synced 2026-09-29 06:44:00 -06:00
ui: fix timers firing multiple times
This commit is contained in:
+14
-1
@@ -12,6 +12,8 @@ from pqcli.ui.new_game_view import NewGameView
|
|||||||
from pqcli.ui.roster_view import RosterView
|
from pqcli.ui.roster_view import RosterView
|
||||||
|
|
||||||
|
|
||||||
|
TICK_FREQ = 0.1
|
||||||
|
SAVE_FREQ = 60.0
|
||||||
PALETTE: T.List[T.Tuple[str, ...]] = [
|
PALETTE: T.List[T.Tuple[str, ...]] = [
|
||||||
("button", "", ""),
|
("button", "", ""),
|
||||||
("button-focus", "light red", "black"),
|
("button-focus", "light red", "black"),
|
||||||
@@ -57,6 +59,8 @@ class Ui:
|
|||||||
self.switch_to_roster_view()
|
self.switch_to_roster_view()
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
|
self.loop.set_alarm_in(TICK_FREQ, self.on_tick)
|
||||||
|
self.loop.set_alarm_in(SAVE_FREQ, self.on_save)
|
||||||
self.loop.run()
|
self.loop.run()
|
||||||
|
|
||||||
def unhandled_input(self, key: str) -> bool:
|
def unhandled_input(self, key: str) -> bool:
|
||||||
@@ -100,7 +104,7 @@ class Ui:
|
|||||||
|
|
||||||
def switch_to_game_view(self, player_idx: int) -> None:
|
def switch_to_game_view(self, player_idx: int) -> None:
|
||||||
player = self.roster.players[player_idx]
|
player = self.roster.players[player_idx]
|
||||||
self.loop.widget = GameView(self.loop, self.roster, player, self.args)
|
self.loop.widget = GameView(self.loop, player, self.args)
|
||||||
self._connect("cancel", self.switch_to_roster_view)
|
self._connect("cancel", self.switch_to_roster_view)
|
||||||
|
|
||||||
def switch_to_delete_player_view(self, player_idx: int) -> None:
|
def switch_to_delete_player_view(self, player_idx: int) -> None:
|
||||||
@@ -127,3 +131,12 @@ class Ui:
|
|||||||
signal_name,
|
signal_name,
|
||||||
lambda _sender, *args: callback(*args),
|
lambda _sender, *args: callback(*args),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def on_tick(self, _loop: urwid.MainLoop, _user_data: T.Any) -> None:
|
||||||
|
if hasattr(self.loop.widget, "tick"):
|
||||||
|
self.loop.widget.tick()
|
||||||
|
self.loop.set_alarm_in(TICK_FREQ, self.on_tick)
|
||||||
|
|
||||||
|
def on_save(self, _loop: urwid.MainLoop, _user_data: T.Any) -> None:
|
||||||
|
self.roster.save()
|
||||||
|
self.loop.set_alarm_in(SAVE_FREQ, self.on_save)
|
||||||
|
|||||||
+1
-15
@@ -14,7 +14,6 @@ from pqcli.mechanic import (
|
|||||||
Simulation,
|
Simulation,
|
||||||
Spell,
|
Spell,
|
||||||
)
|
)
|
||||||
from pqcli.roster import Roster
|
|
||||||
from pqcli.ui.custom_line_box import CustomLineBox
|
from pqcli.ui.custom_line_box import CustomLineBox
|
||||||
from pqcli.ui.custom_list_box import CustomListBox
|
from pqcli.ui.custom_list_box import CustomListBox
|
||||||
from pqcli.ui.custom_progress_bar import CustomProgressBar
|
from pqcli.ui.custom_progress_bar import CustomProgressBar
|
||||||
@@ -360,14 +359,9 @@ class GameView(urwid.Pile):
|
|||||||
signals = ["cancel"]
|
signals = ["cancel"]
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self, loop: urwid.MainLoop, player: Player, args: argparse.Namespace
|
||||||
loop: urwid.MainLoop,
|
|
||||||
roster: Roster,
|
|
||||||
player: Player,
|
|
||||||
args: argparse.Namespace,
|
|
||||||
) -> None:
|
) -> None:
|
||||||
self.loop = loop
|
self.loop = loop
|
||||||
self.roster = roster
|
|
||||||
self.player = player
|
self.player = player
|
||||||
self.args = args
|
self.args = args
|
||||||
self.simulation = Simulation(player)
|
self.simulation = Simulation(player)
|
||||||
@@ -418,9 +412,6 @@ class GameView(urwid.Pile):
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
self.tick()
|
|
||||||
self.save()
|
|
||||||
|
|
||||||
def cancel(self) -> None:
|
def cancel(self) -> None:
|
||||||
self._emit("cancel")
|
self._emit("cancel")
|
||||||
|
|
||||||
@@ -428,13 +419,8 @@ class GameView(urwid.Pile):
|
|||||||
now = datetime.datetime.now()
|
now = datetime.datetime.now()
|
||||||
elapsed = (now - self.last_tick).total_seconds()
|
elapsed = (now - self.last_tick).total_seconds()
|
||||||
self.simulation.tick(elapsed * 1000)
|
self.simulation.tick(elapsed * 1000)
|
||||||
self.loop.set_alarm_in(0.1, lambda _loop, _user_data: self.tick())
|
|
||||||
self.last_tick = datetime.datetime.now()
|
self.last_tick = datetime.datetime.now()
|
||||||
|
|
||||||
def save(self) -> None:
|
|
||||||
self.roster.save()
|
|
||||||
self.loop.set_alarm_in(60.0, lambda _loop, _user_data: self.save())
|
|
||||||
|
|
||||||
def unhandled_input(self, key: str) -> bool:
|
def unhandled_input(self, key: str) -> bool:
|
||||||
if key == "esc":
|
if key == "esc":
|
||||||
self.cancel()
|
self.cancel()
|
||||||
|
|||||||
Reference in New Issue
Block a user