From e008fc6048908d1ff503e515d72443d5e455acc0 Mon Sep 17 00:00:00 2001 From: rr- Date: Thu, 3 Jan 2019 21:44:23 +0100 Subject: [PATCH] ui: save periodically in every frontend --- pqcli/roster.py | 9 +++++++++ pqcli/ui/basic/__init__.py | 9 ++------- pqcli/ui/curses/__init__.py | 4 ++-- pqcli/ui/curses/views/game_view/__init__.py | 15 ++++++++++++++- pqcli/ui/urwid/__init__.py | 2 +- pqcli/ui/urwid/game_view.py | 11 ++++++++++- 6 files changed, 38 insertions(+), 12 deletions(-) diff --git a/pqcli/roster.py b/pqcli/roster.py index ec1039d..eecceee 100644 --- a/pqcli/roster.py +++ b/pqcli/roster.py @@ -1,5 +1,7 @@ +import logging import pickle import typing as T +from datetime import datetime from pathlib import Path from pqcli.mechanic import Player @@ -9,6 +11,7 @@ class Roster: def __init__(self, path: Path, players: T.List[Player]) -> None: self.path = path self.players = players + self._last_save = datetime.now() @staticmethod def load(path: T.Union[str, Path]) -> "Roster": @@ -20,6 +23,7 @@ class Roster: return Roster(real_path, players=[]) def save(self) -> None: + self._last_save = datetime.now() old_path = self.path.with_name(self.path.name + ".old") tmp_path = self.path.with_name(self.path.name + ".new") tmp_path.parent.mkdir(parents=True, exist_ok=True) @@ -27,3 +31,8 @@ class Roster: if self.path.exists(): self.path.rename(old_path) tmp_path.rename(self.path) + + def save_periodically(self): + if (datetime.now() - self._last_save).total_seconds() >= 300: + logging.info("Saving...") + self.save() diff --git a/pqcli/ui/basic/__init__.py b/pqcli/ui/basic/__init__.py index 93a938e..bb13daa 100644 --- a/pqcli/ui/basic/__init__.py +++ b/pqcli/ui/basic/__init__.py @@ -136,13 +136,8 @@ class BasicUserInterface(BaseUserInterface): if player.level != last_level: last_level = player.level self.print_player_info(player) - if ( - self.args.use_saves - and (last_tick - last_save).total_seconds() >= 300 - ): - logging.info("Saving...") - last_save = last_tick - self.roster.save() + if self.args.use_saves: + self.roster.save_periodically() def print_player_info(self, player: Player) -> None: print("--- Character Sheet ---") diff --git a/pqcli/ui/curses/__init__.py b/pqcli/ui/curses/__init__.py index 1d2dc47..4287621 100644 --- a/pqcli/ui/curses/__init__.py +++ b/pqcli/ui/curses/__init__.py @@ -1,7 +1,7 @@ import argparse -import signal import curses import os +import signal import time import typing as T @@ -107,7 +107,7 @@ class CursesUserInterface(BaseUserInterface): self.switch_view(view) def switch_to_game_view(self, player: Player) -> None: - view = GameView(self.screen, player) + view = GameView(self.screen, self.roster, player, self.args) view.on_exit += self.switch_to_roster_view self.switch_view(view) diff --git a/pqcli/ui/curses/views/game_view/__init__.py b/pqcli/ui/curses/views/game_view/__init__.py index 5ec750c..9a4640c 100644 --- a/pqcli/ui/curses/views/game_view/__init__.py +++ b/pqcli/ui/curses/views/game_view/__init__.py @@ -1,8 +1,10 @@ +import argparse import curses import datetime import typing as T from pqcli.mechanic import Player, Simulation +from pqcli.roster import Roster from pqcli.ui.curses.event_handler import EventHandler from ..base_view import BaseView @@ -16,11 +18,20 @@ from .task_progress_window import TaskProgressWindow class GameView(BaseView): - def __init__(self, screen: T.Any, player: Player) -> None: + def __init__( + self, + screen: T.Any, + roster: Roster, + player: Player, + args: argparse.Namespace, + ) -> None: super().__init__(screen) self.on_exit = EventHandler() + self._roster = roster self._player = player + self._args = args + self._simulation = Simulation(player) self._last_tick = datetime.datetime.now() @@ -141,3 +152,5 @@ class GameView(BaseView): elapsed = datetime.datetime.now() - self._last_tick self._simulation.tick(elapsed.total_seconds() * 1000) self._last_tick = datetime.datetime.now() + if self._args.use_saves: + self._roster.save_periodically() diff --git a/pqcli/ui/urwid/__init__.py b/pqcli/ui/urwid/__init__.py index 45d8b5d..60dd550 100644 --- a/pqcli/ui/urwid/__init__.py +++ b/pqcli/ui/urwid/__init__.py @@ -129,7 +129,7 @@ class UrwidUserInterface(BaseUserInterface): def switch_to_game_view(self, player_idx: int) -> None: player = self.roster.players[player_idx] - self.loop.widget = GameView(self.loop, player, self.args) + self.loop.widget = GameView(self.loop, self.roster, player, self.args) self._connect("cancel", self.switch_to_roster_view) def switch_to_delete_player_view(self, player_idx: int) -> None: diff --git a/pqcli/ui/urwid/game_view.py b/pqcli/ui/urwid/game_view.py index 7403e1e..550807d 100644 --- a/pqcli/ui/urwid/game_view.py +++ b/pqcli/ui/urwid/game_view.py @@ -14,6 +14,7 @@ from pqcli.mechanic import ( Simulation, Spell, ) +from pqcli.roster import Roster from pqcli.ui.urwid.custom_line_box import CustomLineBox from pqcli.ui.urwid.custom_progress_bar import CustomProgressBar from pqcli.ui.urwid.data_table import DataTable @@ -337,11 +338,17 @@ class GameView(NPile): signals = ["cancel"] def __init__( - self, loop: urwid.MainLoop, player: Player, args: argparse.Namespace + self, + loop: urwid.MainLoop, + roster: Roster, + player: Player, + args: argparse.Namespace, ) -> None: self.loop = loop + self.roster = roster self.player = player self.args = args + self.simulation = Simulation(player) self.last_tick = datetime.datetime.now() @@ -387,6 +394,8 @@ class GameView(NPile): elapsed = (now - self.last_tick).total_seconds() self.simulation.tick(elapsed * 1000) self.last_tick = datetime.datetime.now() + if self.args.use_saves: + self.roster.save_periodically() def keypress(self, size: T.Tuple[int, int], key: str) -> bool: if key == "esc":