From ab21e8b38bd501d8b05177dcfcd8fd87b28aceb2 Mon Sep 17 00:00:00 2001 From: Geoffrey Coulaud Date: Sun, 21 May 2023 16:34:22 +0200 Subject: [PATCH] Moved schemas to shared module (#94) --- src/game.py | 7 ++++--- src/importers/bottles_importer.py | 5 +++-- src/importers/heroic_importer.py | 11 ++++++----- src/importers/itch_importer.py | 7 +++++-- src/importers/lutris_importer.py | 13 ++++++++----- src/importers/steam_importer.py | 7 +++++-- src/main.py | 10 +++++----- src/meson.build | 1 + src/preferences.py | 16 +++++++++------- src/shared.py | 4 ++++ src/utils/save_cover.py | 4 +++- src/utils/steamgriddb.py | 9 +++++---- 12 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 src/shared.py diff --git a/src/game.py b/src/game.py index f0ae5e4..7be109c 100644 --- a/src/game.py +++ b/src/game.py @@ -26,6 +26,7 @@ from time import time from gi.repository import Adw, Gio, Gtk +from . import shared from .game_cover import GameCover @@ -78,7 +79,7 @@ class Game(Gtk.Box): self.cover_button.connect("clicked", self.main_button_clicked, False) self.play_button.connect("clicked", self.main_button_clicked, True) - self.win.schema.connect("changed", self.schema_changed) + shared.schema.connect("changed", self.schema_changed) def update(self): if self.get_parent(): @@ -253,7 +254,7 @@ class Game(Gtk.Box): self.play_revealer.set_reveal_child(not state) def main_button_clicked(self, _widget, button): - if self.win.schema.get_boolean("cover-launches-game") ^ button: + if shared.schema.get_boolean("cover-launches-game") ^ button: self.launch() else: self.win.show_details_view(self) @@ -261,7 +262,7 @@ class Game(Gtk.Box): def set_play_icon(self): self.play_button.set_icon_name( "help-about-symbolic" - if self.win.schema.get_boolean("cover-launches-game") + if shared.schema.get_boolean("cover-launches-game") else "media-playback-start-symbolic" ) diff --git a/src/importers/bottles_importer.py b/src/importers/bottles_importer.py index a4d9508..ffcaa53 100644 --- a/src/importers/bottles_importer.py +++ b/src/importers/bottles_importer.py @@ -22,13 +22,14 @@ from time import time import yaml +from . import shared from .check_install import check_install def bottles_installed(win, path=None): location_key = "bottles-location" bottles_dir = ( - path if path else Path(win.schema.get_string(location_key)).expanduser() + path if path else Path(shared.schema.get_string(location_key)).expanduser() ) check = "library.yml" @@ -42,7 +43,7 @@ def bottles_installed(win, path=None): ) ) - bottles_dir = check_install(check, locations, (win.schema, location_key)) + bottles_dir = check_install(check, locations, (shared.schema, location_key)) return bottles_dir diff --git a/src/importers/heroic_importer.py b/src/importers/heroic_importer.py index c176cc6..165cfd5 100644 --- a/src/importers/heroic_importer.py +++ b/src/importers/heroic_importer.py @@ -23,13 +23,14 @@ from hashlib import sha256 from pathlib import Path from time import time +from . import shared from .check_install import check_install def heroic_installed(win, path=None): location_key = "heroic-location" heroic_dir = ( - path if path else Path(win.schema.get_string(location_key)).expanduser() + path if path else Path(shared.schema.get_string(location_key)).expanduser() ) check = "config.json" @@ -46,7 +47,7 @@ def heroic_installed(win, path=None): if os.name == "nt" and not path: locations += (Path(os.getenv("appdata")) / "heroic",) - heroic_dir = check_install(check, locations, (win.schema, location_key)) + heroic_dir = check_install(check, locations, (shared.schema, location_key)) return heroic_dir @@ -60,7 +61,7 @@ def heroic_importer(win): importer = win.importer # Import Epic games - if not win.schema.get_boolean("heroic-import-epic"): + if not shared.schema.get_boolean("heroic-import-epic"): pass elif (heroic_dir / "store_cache" / "legendary_library.json").exists(): library = json.load( @@ -113,7 +114,7 @@ def heroic_importer(win): pass # Import GOG games - if not win.schema.get_boolean("heroic-import-gog"): + if not shared.schema.get_boolean("heroic-import-gog"): pass elif (heroic_dir / "gog_store" / "installed.json").exists() and ( heroic_dir / "store_cache" / "gog_library.json" @@ -163,7 +164,7 @@ def heroic_importer(win): importer.save_game(values, image_path if image_path.exists() else None) # Import sideloaded games - if not win.schema.get_boolean("heroic-import-sideload"): + if not shared.schema.get_boolean("heroic-import-sideload"): pass elif (heroic_dir / "sideload_apps" / "library.json").exists(): library = json.load((heroic_dir / "sideload_apps" / "library.json").open()) diff --git a/src/importers/itch_importer.py b/src/importers/itch_importer.py index 0a3e209..53f5544 100644 --- a/src/importers/itch_importer.py +++ b/src/importers/itch_importer.py @@ -26,6 +26,7 @@ from time import time import requests from gi.repository import GdkPixbuf, Gio +from . import shared from .check_install import check_install from .save_cover import resize_cover @@ -120,7 +121,9 @@ def get_games_async(win, rows, importer): def itch_installed(win, path=None): location_key = "itch-location" - itch_dir = path if path else Path(win.schema.get_string(location_key)).expanduser() + itch_dir = ( + path if path else Path(shared.schema.get_string(location_key)).expanduser() + ) check = Path("db") / "butler.db" if not (itch_dir / check).is_file(): @@ -136,7 +139,7 @@ def itch_installed(win, path=None): if os.name == "nt" and not path: locations += (Path(os.getenv("appdata")) / "itch",) - itch_dir = check_install(check, locations, (win.schema, location_key)) + itch_dir = check_install(check, locations, (shared.schema, location_key)) return itch_dir diff --git a/src/importers/lutris_importer.py b/src/importers/lutris_importer.py index 205967f..5ad4610 100644 --- a/src/importers/lutris_importer.py +++ b/src/importers/lutris_importer.py @@ -22,13 +22,14 @@ from shutil import copyfile from sqlite3 import connect from time import time +from . import shared from .check_install import check_install def lutris_installed(win, path=None): location_key = "lutris-location" lutris_dir = ( - path if path else Path(win.schema.get_string(location_key)).expanduser() + path if path else Path(shared.schema.get_string(location_key)).expanduser() ) check = "pga.db" @@ -42,14 +43,14 @@ def lutris_installed(win, path=None): ) ) - lutris_dir = check_install(check, locations, (win.schema, location_key)) + lutris_dir = check_install(check, locations, (shared.schema, location_key)) return lutris_dir def lutris_cache_exists(win, path=None): cache_key = "lutris-cache-location" - cache_dir = path if path else Path(win.schema.get_string(cache_key)).expanduser() + cache_dir = path if path else Path(shared.schema.get_string(cache_key)).expanduser() cache_check = "coverart" if not (cache_dir / cache_check).exists(): @@ -62,7 +63,9 @@ def lutris_cache_exists(win, path=None): ) ) - cache_dir = check_install(cache_check, cache_locations, (win.schema, cache_key)) + cache_dir = check_install( + cache_check, cache_locations, (shared.schema, cache_key) + ) return cache_dir @@ -105,7 +108,7 @@ def lutris_importer(win): # No need to unlink temp files as they disappear when the connection is closed database_tmp_path.unlink(missing_ok=True) - if not win.schema.get_boolean("lutris-import-steam"): + if not shared.schema.get_boolean("lutris-import-steam"): rows = [row for row in rows if not row[3] == "steam"] current_time = int(time()) diff --git a/src/importers/steam_importer.py b/src/importers/steam_importer.py index fff952b..0aa6f25 100644 --- a/src/importers/steam_importer.py +++ b/src/importers/steam_importer.py @@ -25,6 +25,7 @@ from time import time import requests from gi.repository import Gio +from . import shared from .check_install import check_install @@ -124,7 +125,7 @@ def get_games_async(win, appmanifests, steam_dir, importer): def steam_installed(win, path=None): location_key = "steam-location" - steam_dir = Path(win.schema.get_string(location_key)).expanduser() + steam_dir = Path(shared.schema.get_string(location_key)).expanduser() check = "steamapps" if not (steam_dir / check).is_file(): @@ -143,7 +144,9 @@ def steam_installed(win, path=None): if os.name == "nt": locations += (Path(os.getenv("programfiles(x86)")) / "Steam",) - steam_dir = check_install(check, locations, (win.schema, location_key), subdirs) + steam_dir = check_install( + check, locations, (shared.schema, location_key), subdirs + ) return steam_dir diff --git a/src/main.py b/src/main.py index 8bbfff0..f621d3d 100644 --- a/src/main.py +++ b/src/main.py @@ -27,6 +27,7 @@ gi.require_version("Adw", "1") # pylint: disable=wrong-import-position from gi.repository import Adw, Gio, GLib, Gtk +from . import shared from .bottles_importer import bottles_importer from .details_window import DetailsWindow from .heroic_importer import heroic_importer @@ -53,14 +54,13 @@ class CartridgesApplication(Adw.Application): self.win = CartridgesWindow(application=self) # Save window geometry - state_settings = Gio.Settings(schema_id="hu.kramo.Cartridges.State") - state_settings.bind( + shared.state_schema.bind( "width", self.win, "default-width", Gio.SettingsBindFlags.DEFAULT ) - state_settings.bind( + shared.state_schema.bind( "height", self.win, "default-height", Gio.SettingsBindFlags.DEFAULT ) - state_settings.bind( + shared.state_schema.bind( "is-maximized", self.win, "maximized", Gio.SettingsBindFlags.DEFAULT ) @@ -98,7 +98,7 @@ class CartridgesApplication(Adw.Application): ) sort_action.connect("activate", self.win.on_sort_action) self.win.add_action(sort_action) - self.win.on_sort_action(sort_action, state_settings.get_value("sort-mode")) + self.win.on_sort_action(sort_action, shared.state_schema.get_value("sort-mode")) self.win.present() diff --git a/src/meson.build b/src/meson.build index cfb6769..87099ba 100644 --- a/src/meson.build +++ b/src/meson.build @@ -24,6 +24,7 @@ cartridges_sources = [ 'details_window.py', 'game.py', 'game_cover.py', + 'shared.py', 'importers/steam_importer.py', 'importers/lutris_importer.py', 'importers/heroic_importer.py', diff --git a/src/preferences.py b/src/preferences.py index c55ee7d..0ba5bea 100644 --- a/src/preferences.py +++ b/src/preferences.py @@ -24,6 +24,7 @@ from pathlib import Path from gi.repository import Adw, Gio, GLib, Gtk # pylint: disable=unused-import +from . import shared from .bottles_importer import bottles_installed from .create_dialog import create_dialog from .heroic_importer import heroic_installed @@ -89,7 +90,6 @@ class PreferencesWindow(Adw.PreferencesWindow): def __init__(self, win, **kwargs): super().__init__(**kwargs) - self.schema = win.schema self.win = win self.file_chooser = Gtk.FileDialog() self.set_transient_for(win) @@ -156,9 +156,9 @@ class PreferencesWindow(Adw.PreferencesWindow): # SteamGridDB def sgdb_key_changed(*_args): - self.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text()) + shared.schema.set_string("sgdb-key", self.sgdb_key_entry_row.get_text()) - self.sgdb_key_entry_row.set_text(self.schema.get_string("sgdb-key")) + self.sgdb_key_entry_row.set_text(shared.schema.get_string("sgdb-key")) self.sgdb_key_entry_row.connect("changed", sgdb_key_changed) self.sgdb_key_group.set_description( @@ -171,7 +171,7 @@ class PreferencesWindow(Adw.PreferencesWindow): def set_sgdb_sensitive(widget): if not widget.get_text(): - self.win.schema.set_boolean("sgdb", False) + shared.schema.set_boolean("sgdb", False) self.sgdb_switch_row.set_sensitive(widget.get_text()) @@ -218,7 +218,7 @@ class PreferencesWindow(Adw.PreferencesWindow): def bind_switches(self, settings): for setting in settings: - self.schema.bind( + shared.schema.bind( setting, self.get_switch(setting), "active", @@ -259,7 +259,9 @@ class PreferencesWindow(Adw.PreferencesWindow): re.sub( "/run/user/\\d*/doc/......../", "", - str(Path(win.schema.get_string(f"{source_id}-location")).expanduser()), + str( + Path(shared.schema.get_string(f"{source_id}-location")).expanduser() + ), ) ) @@ -292,7 +294,7 @@ class PreferencesWindow(Adw.PreferencesWindow): self.set_subtitle(win, source_id) - win.schema.bind( + shared.schema.bind( source_id, getattr(win, f"{source_id}_expander_row"), "enable-expansion", diff --git a/src/shared.py b/src/shared.py new file mode 100644 index 0000000..68beedd --- /dev/null +++ b/src/shared.py @@ -0,0 +1,4 @@ +from gi.repository import Gio + +schema = Gio.Settings.new("hu.kramo.Cartridges") +state_schema = Gio.Settings.new("hu.kramo.Cartridges.State") diff --git a/src/utils/save_cover.py b/src/utils/save_cover.py index 7122c29..2c3798d 100644 --- a/src/utils/save_cover.py +++ b/src/utils/save_cover.py @@ -24,6 +24,8 @@ from shutil import copyfile from gi.repository import Gio from PIL import Image, ImageSequence +from . import shared + def resize_cover(win, cover_path=None, pixbuf=None): if not cover_path and not pixbuf: @@ -56,7 +58,7 @@ def resize_cover(win, cover_path=None, pixbuf=None): image.resize(win.image_size).save( tmp_path, compression="tiff_adobe_deflate" - if win.schema.get_boolean("high-quality-images") + if shared.schema.get_boolean("high-quality-images") else "webp", ) diff --git a/src/utils/steamgriddb.py b/src/utils/steamgriddb.py index 4099996..82fb236 100644 --- a/src/utils/steamgriddb.py +++ b/src/utils/steamgriddb.py @@ -3,6 +3,7 @@ from pathlib import Path import requests from gi.repository import Gio +from . import shared from .create_dialog import create_dialog from .save_cover import save_cover, resize_cover @@ -31,9 +32,9 @@ class SGDBSave: if ( not ( - self.win.schema.get_boolean("sgdb") + shared.schema.get_boolean("sgdb") and ( - (self.win.schema.get_boolean("sgdb-prefer")) + (shared.schema.get_boolean("sgdb-prefer")) or not ( (self.win.covers_dir / f"{game.game_id}.gif").is_file() or (self.win.covers_dir / f"{game.game_id}.tiff").is_file() @@ -46,7 +47,7 @@ class SGDBSave: return url = "https://www.steamgriddb.com/api/v2/" - headers = {"Authorization": f'Bearer {self.win.schema.get_string("sgdb-key")}'} + headers = {"Authorization": f'Bearer {shared.schema.get_string("sgdb-key")}'} try: search_result = requests.get( @@ -68,7 +69,7 @@ class SGDBSave: response = None try: - if self.win.schema.get_boolean("sgdb-animated"): + if shared.schema.get_boolean("sgdb-animated"): try: grid = requests.get( f'{url}grids/game/{search_result.json()["data"][0]["id"]}?dimensions=600x900&types=animated',