ui: save periodically in every frontend

This commit is contained in:
rr-
2019-01-03 21:44:23 +01:00
parent ca7ab192c5
commit e008fc6048
6 changed files with 38 additions and 12 deletions
+9
View File
@@ -1,5 +1,7 @@
import logging
import pickle import pickle
import typing as T import typing as T
from datetime import datetime
from pathlib import Path from pathlib import Path
from pqcli.mechanic import Player from pqcli.mechanic import Player
@@ -9,6 +11,7 @@ class Roster:
def __init__(self, path: Path, players: T.List[Player]) -> None: def __init__(self, path: Path, players: T.List[Player]) -> None:
self.path = path self.path = path
self.players = players self.players = players
self._last_save = datetime.now()
@staticmethod @staticmethod
def load(path: T.Union[str, Path]) -> "Roster": def load(path: T.Union[str, Path]) -> "Roster":
@@ -20,6 +23,7 @@ class Roster:
return Roster(real_path, players=[]) return Roster(real_path, players=[])
def save(self) -> None: def save(self) -> None:
self._last_save = datetime.now()
old_path = self.path.with_name(self.path.name + ".old") old_path = self.path.with_name(self.path.name + ".old")
tmp_path = self.path.with_name(self.path.name + ".new") tmp_path = self.path.with_name(self.path.name + ".new")
tmp_path.parent.mkdir(parents=True, exist_ok=True) tmp_path.parent.mkdir(parents=True, exist_ok=True)
@@ -27,3 +31,8 @@ class Roster:
if self.path.exists(): if self.path.exists():
self.path.rename(old_path) self.path.rename(old_path)
tmp_path.rename(self.path) tmp_path.rename(self.path)
def save_periodically(self):
if (datetime.now() - self._last_save).total_seconds() >= 300:
logging.info("Saving...")
self.save()
+2 -7
View File
@@ -136,13 +136,8 @@ class BasicUserInterface(BaseUserInterface):
if player.level != last_level: if player.level != last_level:
last_level = player.level last_level = player.level
self.print_player_info(player) self.print_player_info(player)
if ( if self.args.use_saves:
self.args.use_saves self.roster.save_periodically()
and (last_tick - last_save).total_seconds() >= 300
):
logging.info("Saving...")
last_save = last_tick
self.roster.save()
def print_player_info(self, player: Player) -> None: def print_player_info(self, player: Player) -> None:
print("--- Character Sheet ---") print("--- Character Sheet ---")
+2 -2
View File
@@ -1,7 +1,7 @@
import argparse import argparse
import signal
import curses import curses
import os import os
import signal
import time import time
import typing as T import typing as T
@@ -107,7 +107,7 @@ class CursesUserInterface(BaseUserInterface):
self.switch_view(view) self.switch_view(view)
def switch_to_game_view(self, player: Player) -> None: 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 view.on_exit += self.switch_to_roster_view
self.switch_view(view) self.switch_view(view)
+14 -1
View File
@@ -1,8 +1,10 @@
import argparse
import curses import curses
import datetime import datetime
import typing as T import typing as T
from pqcli.mechanic import Player, Simulation from pqcli.mechanic import Player, Simulation
from pqcli.roster import Roster
from pqcli.ui.curses.event_handler import EventHandler from pqcli.ui.curses.event_handler import EventHandler
from ..base_view import BaseView from ..base_view import BaseView
@@ -16,11 +18,20 @@ from .task_progress_window import TaskProgressWindow
class GameView(BaseView): 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) super().__init__(screen)
self.on_exit = EventHandler() self.on_exit = EventHandler()
self._roster = roster
self._player = player self._player = player
self._args = args
self._simulation = Simulation(player) self._simulation = Simulation(player)
self._last_tick = datetime.datetime.now() self._last_tick = datetime.datetime.now()
@@ -141,3 +152,5 @@ class GameView(BaseView):
elapsed = datetime.datetime.now() - self._last_tick elapsed = datetime.datetime.now() - self._last_tick
self._simulation.tick(elapsed.total_seconds() * 1000) self._simulation.tick(elapsed.total_seconds() * 1000)
self._last_tick = datetime.datetime.now() self._last_tick = datetime.datetime.now()
if self._args.use_saves:
self._roster.save_periodically()
+1 -1
View File
@@ -129,7 +129,7 @@ class UrwidUserInterface(BaseUserInterface):
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, player, self.args) self.loop.widget = GameView(self.loop, self.roster, 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:
+10 -1
View File
@@ -14,6 +14,7 @@ from pqcli.mechanic import (
Simulation, Simulation,
Spell, Spell,
) )
from pqcli.roster import Roster
from pqcli.ui.urwid.custom_line_box import CustomLineBox from pqcli.ui.urwid.custom_line_box import CustomLineBox
from pqcli.ui.urwid.custom_progress_bar import CustomProgressBar from pqcli.ui.urwid.custom_progress_bar import CustomProgressBar
from pqcli.ui.urwid.data_table import DataTable from pqcli.ui.urwid.data_table import DataTable
@@ -337,11 +338,17 @@ class GameView(NPile):
signals = ["cancel"] signals = ["cancel"]
def __init__( def __init__(
self, loop: urwid.MainLoop, player: Player, args: argparse.Namespace self,
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)
self.last_tick = datetime.datetime.now() self.last_tick = datetime.datetime.now()
@@ -387,6 +394,8 @@ class GameView(NPile):
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.last_tick = datetime.datetime.now() 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: def keypress(self, size: T.Tuple[int, int], key: str) -> bool:
if key == "esc": if key == "esc":