From bd0386bcba83590d8fa825a9898c44501fa2e80b Mon Sep 17 00:00:00 2001 From: kramo <93832451+kra-mo@users.noreply.github.com> Date: Sat, 6 May 2023 10:07:35 +0200 Subject: [PATCH] Resize images asynchronously in the edit dialog --- data/gtk/details_window.blp | 64 +++++++++++++++++++++---------------- src/details_window.py | 14 +++++++- src/utils/save_cover.py | 3 +- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/data/gtk/details_window.blp b/data/gtk/details_window.blp index 3efd2df..51d9497 100644 --- a/data/gtk/details_window.blp +++ b/data/gtk/details_window.blp @@ -40,30 +40,20 @@ template DetailsWindow : Adw.Window { Adw.PreferencesGroup cover_group { Adw.Clamp cover_clamp { maximum-size: 200; - Overlay cover_overlay { - halign: center; - valign: center; - + Overlay { [overlay] - Button cover_button_edit { - icon-name: "document-edit-symbolic"; - halign: end; - valign: end; - margin-bottom: 6; - margin-end: 6; - - styles [ - "circular", "osd" - ] + Spinner spinner { + margin-start: 72; + margin-end: 72; } - [overlay] - Revealer cover_button_delete_revealer { - transition-type: crossfade; - margin-end: 40; + Overlay cover_overlay { + halign: center; + valign: center; - Button cover_button_delete { - icon-name: "user-trash-symbolic"; + [overlay] + Button cover_button_edit { + icon-name: "document-edit-symbolic"; halign: end; valign: end; margin-bottom: 6; @@ -73,15 +63,33 @@ template DetailsWindow : Adw.Window { "circular", "osd" ] } - } - Picture cover { - width-request: 200; - height-request: 300; - - styles [ - "card" - ] + [overlay] + Revealer cover_button_delete_revealer { + transition-type: crossfade; + margin-end: 40; + + Button cover_button_delete { + icon-name: "user-trash-symbolic"; + halign: end; + valign: end; + margin-bottom: 6; + margin-end: 6; + + styles [ + "circular", "osd" + ] + } + } + + Picture cover { + width-request: 200; + height-request: 300; + + styles [ + "card" + ] + } } } } diff --git a/src/details_window.py b/src/details_window.py index 20891ea..6ba9eb8 100644 --- a/src/details_window.py +++ b/src/details_window.py @@ -35,10 +35,12 @@ from .steamgriddb import SGDBSave class DetailsWindow(Adw.Window): __gtype_name__ = "DetailsWindow" + cover_overlay = Gtk.Template.Child() cover = Gtk.Template.Child() cover_button_edit = Gtk.Template.Child() cover_button_delete_revealer = Gtk.Template.Child() cover_button_delete = Gtk.Template.Child() + spinner = Gtk.Template.Child() name = Gtk.Template.Child() developer = Gtk.Template.Child() @@ -222,6 +224,11 @@ class DetailsWindow(Adw.Window): def focus_executable(self, *_args): self.set_focus(self.executable) + def toggle_loading(self): + self.apply_button.set_sensitive(not self.apply_button.get_sensitive()) + self.spinner.set_spinning(not self.spinner.get_spinning()) + self.cover_overlay.set_opacity(not self.cover_overlay.get_opacity()) + def set_cover(self, _source, result, *_args): try: path = self.file_dialog.open_finish(result).get_path() @@ -231,7 +238,12 @@ class DetailsWindow(Adw.Window): self.cover_button_delete_revealer.set_reveal_child(True) self.cover_changed = True - self.game_cover.new_cover(resize_cover(self.win, path)) + def resize(): + self.game_cover.new_cover(resize_cover(self.win, path)) + self.toggle_loading() + + self.toggle_loading() + GLib.Thread.new(None, resize) def choose_cover(self, *_args): self.file_dialog.open(self, None, self.set_cover) diff --git a/src/utils/save_cover.py b/src/utils/save_cover.py index 15e67fe..7122c29 100644 --- a/src/utils/save_cover.py +++ b/src/utils/save_cover.py @@ -36,8 +36,7 @@ def resize_cover(win, cover_path=None, pixbuf=None): with Image.open(cover_path) as image: if getattr(image, "is_animated", False): frames = tuple( - frame.copy().resize((200, 300)) - for frame in ImageSequence.Iterator(image) + frame.resize((200, 300)) for frame in ImageSequence.Iterator(image) ) tmp_path = Path(Gio.File.new_tmp("XXXXXX.gif")[0].get_path())