From 722085229140c55370cf8967913c6d34233dbe59 Mon Sep 17 00:00:00 2001 From: GeoffreyCoulaud Date: Wed, 24 May 2023 17:08:34 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Reorganized=20game=20loading=20f?= =?UTF-8?q?rom=20disk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/game.py | 9 +-------- src/importer/sources/lutris_source.py | 1 + src/importer/sources/steam_source.py | 2 ++ src/main.py | 4 +++- src/store/managers/display_manager.py | 5 ++--- src/store/managers/file_manager.py | 3 ++- src/store/managers/format_update_manager.py | 20 ++++++++++++++++++++ src/store/store.py | 2 +- 8 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 src/store/managers/format_update_manager.py diff --git a/src/game.py b/src/game.py index 2ca2f7d..a7845ba 100644 --- a/src/game.py +++ b/src/game.py @@ -59,13 +59,13 @@ class Game(Gtk.Box): removed = None blacklisted = None game_cover = None + version = None def __init__(self, data, allow_side_effects=True, **kwargs): super().__init__(**kwargs) self.win = shared.win self.app = self.win.get_application() - self.version = shared.spec_version self.update_values(data) @@ -145,13 +145,6 @@ class Game(Gtk.Box): "version", ) - # TODO: remove for 2.0 - attrs = list(attrs) - if not self.removed: - attrs.remove("removed") - if not self.blacklisted: - attrs.remove("blacklisted") - json.dump( {attr: getattr(self, attr) for attr in attrs if attr}, (shared.games_dir / f"{self.game_id}.json").open("w"), diff --git a/src/importer/sources/lutris_source.py b/src/importer/sources/lutris_source.py index e245b95..e80b278 100644 --- a/src/importer/sources/lutris_source.py +++ b/src/importer/sources/lutris_source.py @@ -68,6 +68,7 @@ class LutrisSourceIterator(SourceIterator): # Create game values = { + "version": shared.spec_version, "added": int(time()), "hidden": row[4], "name": row[1], diff --git a/src/importer/sources/steam_source.py b/src/importer/sources/steam_source.py index 69fc1b2..34abb42 100644 --- a/src/importer/sources/steam_source.py +++ b/src/importer/sources/steam_source.py @@ -4,6 +4,7 @@ from pathlib import Path from time import time from typing import Iterator +from src import shared from src.game import Game from src.importer.sources.source import Source, SourceIterator from src.utils.decorators import ( @@ -71,6 +72,7 @@ class SteamSourceIterator(SourceIterator): # Build game from local data appid = local_data["appid"] values = { + "version": shared.spec_version, "added": int(time()), "name": local_data["name"], "source": self.source.id, diff --git a/src/main.py b/src/main.py index 8a87446..16f7362 100644 --- a/src/main.py +++ b/src/main.py @@ -43,6 +43,7 @@ from src.importer.sources.steam_source import ( from src.preferences import PreferencesWindow from src.store.managers.display_manager import DisplayManager from src.store.managers.file_manager import FileManager +from store.managers.format_update_manager import FormatUpdateManager from src.store.managers.sgdb_manager import SGDBManager from src.store.managers.steam_api_manager import SteamAPIManager from src.store.store import Store @@ -76,9 +77,10 @@ class CartridgesApplication(Adw.Application): "is-maximized", self.win, "maximized", Gio.SettingsBindFlags.DEFAULT ) - # Create the games store with bare minimum managers + # Create the games store ready to load games from disk if not shared.store: shared.store = Store() + shared.store.add_manager(FormatUpdateManager()) shared.store.add_manager(DisplayManager()) # Load games from disk diff --git a/src/store/managers/display_manager.py b/src/store/managers/display_manager.py index 2fdfda9..ba7ca39 100644 --- a/src/store/managers/display_manager.py +++ b/src/store/managers/display_manager.py @@ -1,14 +1,13 @@ from src import shared from src.game import Game +from src.store.managers.file_manager import FileManager from src.store.managers.manager import Manager -from src.store.managers.sgdb_manager import SGDBManager -from src.store.managers.steam_api_manager import SteamAPIManager class DisplayManager(Manager): """Manager in charge of adding a game to the UI""" - run_after = set((SteamAPIManager, SGDBManager)) + run_after = set((FileManager,)) def run(self, game: Game) -> None: # TODO decouple a game from its widget diff --git a/src/store/managers/file_manager.py b/src/store/managers/file_manager.py index 2a7b67e..936e305 100644 --- a/src/store/managers/file_manager.py +++ b/src/store/managers/file_manager.py @@ -1,4 +1,5 @@ from src.game import Game +from src.store.managers.format_update_manager import FormatUpdateManager from src.store.managers.manager import Manager from src.store.managers.sgdb_manager import SGDBManager from src.store.managers.steam_api_manager import SteamAPIManager @@ -7,7 +8,7 @@ from src.store.managers.steam_api_manager import SteamAPIManager class FileManager(Manager): """Manager in charge of saving a game to a file""" - run_after = set((SteamAPIManager, SGDBManager)) + run_after = set((SteamAPIManager, SGDBManager, FormatUpdateManager)) def run(self, game: Game) -> None: # TODO make game.save (disk) not trigger game.update (UI) diff --git a/src/store/managers/format_update_manager.py b/src/store/managers/format_update_manager.py new file mode 100644 index 0000000..e4521b5 --- /dev/null +++ b/src/store/managers/format_update_manager.py @@ -0,0 +1,20 @@ +from src.store.managers.manager import Manager +from src.game import Game + + +class FormatUpdateManager(Manager): + """Class in charge of migrating a game from an older format""" + + def v1_5_to_v2_0(self, game: Game) -> None: + """Convert a game from v1.5 format to v2.0 format""" + if game.blacklisted is None: + game.blacklisted = False + if game.removed is None: + game.removed = False + game.version = 2.0 + + def run(self, game: Game) -> None: + if game.version is None: + self.v1_5_to_v2_0(game) + # TODO make game.save (disk) not trigger game.update (UI) + game.save() diff --git a/src/store/store.py b/src/store/store.py index c24ec66..dee2716 100644 --- a/src/store/store.py +++ b/src/store/store.py @@ -103,7 +103,7 @@ class Store: """ # Ignore games from a newer spec version - if (version := game.get("version")) and version > shared.spec_version: + if game.version > shared.spec_version: return None # Ignore games that are already there