ui: fix timers firing multiple times

This commit is contained in:
rr-
2018-11-05 23:45:18 +01:00
parent 7b07d60573
commit 1789e2050e
2 changed files with 15 additions and 16 deletions
+14 -1
View File
@@ -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
View File
@@ -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()