From 1789e2050e19aefe3dea67452533417edbf6df4c Mon Sep 17 00:00:00 2001 From: rr- Date: Mon, 5 Nov 2018 23:45:18 +0100 Subject: [PATCH] ui: fix timers firing multiple times --- pqcli/ui/__init__.py | 15 ++++++++++++++- pqcli/ui/game_view.py | 16 +--------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/pqcli/ui/__init__.py b/pqcli/ui/__init__.py index 14dc6c6..16f04b0 100644 --- a/pqcli/ui/__init__.py +++ b/pqcli/ui/__init__.py @@ -12,6 +12,8 @@ from pqcli.ui.new_game_view import NewGameView from pqcli.ui.roster_view import RosterView +TICK_FREQ = 0.1 +SAVE_FREQ = 60.0 PALETTE: T.List[T.Tuple[str, ...]] = [ ("button", "", ""), ("button-focus", "light red", "black"), @@ -57,6 +59,8 @@ class Ui: self.switch_to_roster_view() 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() def unhandled_input(self, key: str) -> bool: @@ -100,7 +104,7 @@ class Ui: def switch_to_game_view(self, player_idx: int) -> None: 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) def switch_to_delete_player_view(self, player_idx: int) -> None: @@ -127,3 +131,12 @@ class Ui: signal_name, 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) diff --git a/pqcli/ui/game_view.py b/pqcli/ui/game_view.py index 32a59e5..8dec083 100644 --- a/pqcli/ui/game_view.py +++ b/pqcli/ui/game_view.py @@ -14,7 +14,6 @@ from pqcli.mechanic import ( Simulation, Spell, ) -from pqcli.roster import Roster from pqcli.ui.custom_line_box import CustomLineBox from pqcli.ui.custom_list_box import CustomListBox from pqcli.ui.custom_progress_bar import CustomProgressBar @@ -360,14 +359,9 @@ class GameView(urwid.Pile): signals = ["cancel"] def __init__( - self, - loop: urwid.MainLoop, - roster: Roster, - player: Player, - args: argparse.Namespace, + self, loop: urwid.MainLoop, player: Player, args: argparse.Namespace ) -> None: self.loop = loop - self.roster = roster self.player = player self.args = args self.simulation = Simulation(player) @@ -418,9 +412,6 @@ class GameView(urwid.Pile): ] ) - self.tick() - self.save() - def cancel(self) -> None: self._emit("cancel") @@ -428,13 +419,8 @@ class GameView(urwid.Pile): now = datetime.datetime.now() elapsed = (now - self.last_tick).total_seconds() self.simulation.tick(elapsed * 1000) - self.loop.set_alarm_in(0.1, lambda _loop, _user_data: self.tick()) 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: if key == "esc": self.cancel()