Resize images asynchronously in the edit dialog

This commit is contained in:
kramo
2023-05-06 10:07:35 +02:00
parent f8c06a9e4d
commit bd0386bcba
3 changed files with 50 additions and 31 deletions

View File

@@ -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"
]
}
}
}
}

View File

@@ -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)

View File

@@ -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())