diff --git a/src/game.py b/src/game.py index 5bd547d..9db8506 100644 --- a/src/game.py +++ b/src/game.py @@ -60,6 +60,10 @@ class Game(Gtk.Box): self.win = win self.app = win.get_application() + self.update_values(data) + + self.win.games[self.game_id] = self + self.set_play_label() self.overlay.set_measure_overlay(self.play_revealer, True) @@ -73,25 +77,12 @@ class Game(Gtk.Box): self.win.schema.connect("changed", self.schema_changed) - self.update_values(data) - def update(self): - if self.win.stack.get_visible_child() == self.win.details_view: - self.win.show_details_view(None, self.game_id) - - self.win.games[self.game_id] = self - if self.get_parent(): self.get_parent().get_parent().remove(self) if self.get_parent(): self.get_parent().set_child() - if self.game_id in self.win.game_covers: - self.win.game_covers[self.game_id].add_picture(self.cover) - else: - game_cover = GameCover({self.cover}, self.get_cover_path()) - self.win.game_covers[self.game_id] = game_cover - self.menu_button.set_menu_model( self.hidden_game_options if self.hidden else self.game_options ) @@ -103,19 +94,28 @@ class Game(Gtk.Box): "notify::visible", self.win.set_active_game, self.game_id ) - if not self.removed or self.blacklisted: + if self.game_id in self.win.game_covers: + self.win.game_covers[self.game_id].add_picture(self.cover) + else: + game_cover = GameCover({self.cover}, self.get_cover_path()) + self.win.game_covers[self.game_id] = game_cover + + if self.win.stack.get_visible_child() == self.win.details_view: + self.win.show_details_view(None, self.game_id) + + if not self.removed and not self.blacklisted: if self.hidden: self.win.hidden_library.append(self) else: self.win.library.append(self) self.get_parent().set_focusable(False) + self.win.set_library_child() + def update_values(self, data): for key, value in data.items(): setattr(self, key, value) - self.save() - def save(self): self.win.games_dir.mkdir(parents=True, exist_ok=True) @@ -140,18 +140,6 @@ class Game(Gtk.Box): self.update() - self.win.library_bin.set_child( - self.win.scrolledwindow - if any(not game.hidden for game in self.win.games.values()) - else self.win.notice_empty - ) - - self.win.hidden_library_bin.set_child( - self.win.hidden_scrolledwindow - if any(game.hidden for game in self.win.games.values()) - else self.win.hidden_notice_empty - ) - def launch(self): # Generate launch arguments, either list (no shell) or a string (for shell). argv = ( diff --git a/src/preferences.py b/src/preferences.py index 2363225..9aa6a45 100644 --- a/src/preferences.py +++ b/src/preferences.py @@ -340,7 +340,7 @@ class PreferencesWindow(Adw.PreferencesWindow): self.toast.dismiss() def remove_all_games(self, _widget): - for game in self.win.games: + for game in self.win.games.values(): if not game.removed: self.removed_games.add(game.game_id) diff --git a/src/utils/create_details_window.py b/src/utils/create_details_window.py index 2e961ff..59f251a 100644 --- a/src/utils/create_details_window.py +++ b/src/utils/create_details_window.py @@ -17,7 +17,6 @@ # # SPDX-License-Identifier: GPL-3.0-or-later -import json import os import shlex import time @@ -90,7 +89,7 @@ def create_details_window(win, game_id=None): apply_button = Gtk.Button.new_with_label(_("Apply")) game_cover.new_cover(win.games[game_id].get_cover_path()) - if game_cover.get_pixbuf(): + if game_cover.pixbuf: cover_button_delete_revealer.set_reveal_child(True) else: window.set_title(_("Add New Game")) @@ -328,7 +327,7 @@ def create_details_window(win, game_id=None): else: Game(win, values).save() - if not game_cover.get_pixbuf(): + if not game_cover.pixbuf: SGDBSave(win, {(game_id, values["name"])}) win.game_covers[game_id].pictures.remove(cover) diff --git a/src/utils/get_games.py b/src/utils/get_games.py index c20b35a..c1f794b 100644 --- a/src/utils/get_games.py +++ b/src/utils/get_games.py @@ -23,9 +23,11 @@ import json def get_games(win): games = {} + if not win.games_dir.exists(): + return games + for open_file in win.games_dir.iterdir(): - if open_file.exists(): - data = json.load(open_file.open()) - games[data["game_id"]] = data + data = json.load(open_file.open()) + games[data["game_id"]] = data return games diff --git a/src/utils/importer.py b/src/utils/importer.py index 030d200..7dc247b 100644 --- a/src/utils/importer.py +++ b/src/utils/importer.py @@ -56,7 +56,7 @@ class Importer: def save_game(self, values=None, cover_path=None): if values: - Game(self.win, values).save() + Game(self.win, values) if cover_path: save_cover( diff --git a/src/utils/steamgriddb.py b/src/utils/steamgriddb.py index ac808be..632096d 100644 --- a/src/utils/steamgriddb.py +++ b/src/utils/steamgriddb.py @@ -111,10 +111,14 @@ class SGDBSave: _("Preferences"), ).connect("response", self.response) - if not self.importer: - game = self.win.games[result.propagate_value()[1]] - game.set_loading(-1) - game.update() + game = self.win.games.get(result.propagate_value()[1]) + game.set_loading(-1) + + if game: + if self.importer: + game.save() + else: + game.update() def response(self, _widget, response): if response == "open_preferences": diff --git a/src/window.py b/src/window.py index a793138..9344209 100644 --- a/src/window.py +++ b/src/window.py @@ -115,8 +115,8 @@ class CartridgesWindow(Adw.ApplicationWindow): self.details_view.set_measure_overlay(self.details_view_box, True) self.details_view.set_clip_overlay(self.details_view_box, False) - self.library.set_filter_func(self.search_filter) - self.hidden_library.set_filter_func(self.search_filter) + self.library.set_filter_func(self.filter_func) + self.hidden_library.set_filter_func(self.filter_func) self.library.set_sort_func(self.sort_func) self.hidden_library.set_sort_func(self.sort_func) @@ -124,6 +124,8 @@ class CartridgesWindow(Adw.ApplicationWindow): for game in get_games(self).values(): Game(self, game).update() + self.set_library_child() + # Connect signals self.search_entry.connect("search-changed", self.search_changed, False) self.hidden_search_entry.connect("search-changed", self.search_changed, True) @@ -146,7 +148,27 @@ class CartridgesWindow(Adw.ApplicationWindow): else: self.library.invalidate_filter() - def search_filter(self, child): + def set_library_child(self): + child, hidden_child = self.notice_empty, self.hidden_notice_empty + + for game in self.games.values(): + if game.removed or game.blacklisted: + continue + if game.hidden: + if game.filtered and hidden_child != self.hidden_scrolledwindow: + hidden_child = self.notice_no_results + continue + hidden_child = self.hidden_scrolledwindow + else: + if game.filtered and child != self.scrolledwindow: + child = self.notice_no_results + continue + child = self.scrolledwindow + + self.library_bin.set_child(child) + self.hidden_library_bin.set_child(hidden_child) + + def filter_func(self, child): hidden = self.stack.get_visible_child() == self.hidden_library_view text = ( (self.hidden_search_entry if hidden else self.search_entry) @@ -164,19 +186,7 @@ class CartridgesWindow(Adw.ApplicationWindow): game.filtered = filtered - (self.hidden_library_bin if hidden else self.library_bin).set_child( - (self.hidden_scrolledwindow if hidden else self.scrolledwindow) - if any( - not game.filtered - for game in self.games.values() - if not ( - game.removed - or game.blacklisted - or (not game.hidden if hidden else game.hidden) - ) - ) - else self.notice_no_results - ) + self.set_library_child() return not filtered @@ -223,7 +233,7 @@ class CartridgesWindow(Adw.ApplicationWindow): self.details_view_game_cover.add_picture(self.details_view_cover) self.scaled_pixbuf = ( - self.details_view_game_cover.get_pixbuf() + self.details_view_game_cover.pixbuf or self.details_view_game_cover.placeholder_pixbuf ).scale_simple(2, 3, GdkPixbuf.InterpType.BILINEAR) self.details_view_blurred_cover.set_pixbuf(self.scaled_pixbuf)