Resize images asynchronously in the edit dialog
This commit is contained in:
@@ -40,6 +40,13 @@ template DetailsWindow : Adw.Window {
|
|||||||
Adw.PreferencesGroup cover_group {
|
Adw.PreferencesGroup cover_group {
|
||||||
Adw.Clamp cover_clamp {
|
Adw.Clamp cover_clamp {
|
||||||
maximum-size: 200;
|
maximum-size: 200;
|
||||||
|
Overlay {
|
||||||
|
[overlay]
|
||||||
|
Spinner spinner {
|
||||||
|
margin-start: 72;
|
||||||
|
margin-end: 72;
|
||||||
|
}
|
||||||
|
|
||||||
Overlay cover_overlay {
|
Overlay cover_overlay {
|
||||||
halign: center;
|
halign: center;
|
||||||
valign: center;
|
valign: center;
|
||||||
@@ -86,6 +93,7 @@ template DetailsWindow : Adw.Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Adw.PreferencesGroup title_group {
|
Adw.PreferencesGroup title_group {
|
||||||
title: _("Title");
|
title: _("Title");
|
||||||
|
|||||||
@@ -35,10 +35,12 @@ from .steamgriddb import SGDBSave
|
|||||||
class DetailsWindow(Adw.Window):
|
class DetailsWindow(Adw.Window):
|
||||||
__gtype_name__ = "DetailsWindow"
|
__gtype_name__ = "DetailsWindow"
|
||||||
|
|
||||||
|
cover_overlay = Gtk.Template.Child()
|
||||||
cover = Gtk.Template.Child()
|
cover = Gtk.Template.Child()
|
||||||
cover_button_edit = Gtk.Template.Child()
|
cover_button_edit = Gtk.Template.Child()
|
||||||
cover_button_delete_revealer = Gtk.Template.Child()
|
cover_button_delete_revealer = Gtk.Template.Child()
|
||||||
cover_button_delete = Gtk.Template.Child()
|
cover_button_delete = Gtk.Template.Child()
|
||||||
|
spinner = Gtk.Template.Child()
|
||||||
|
|
||||||
name = Gtk.Template.Child()
|
name = Gtk.Template.Child()
|
||||||
developer = Gtk.Template.Child()
|
developer = Gtk.Template.Child()
|
||||||
@@ -222,6 +224,11 @@ class DetailsWindow(Adw.Window):
|
|||||||
def focus_executable(self, *_args):
|
def focus_executable(self, *_args):
|
||||||
self.set_focus(self.executable)
|
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):
|
def set_cover(self, _source, result, *_args):
|
||||||
try:
|
try:
|
||||||
path = self.file_dialog.open_finish(result).get_path()
|
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_button_delete_revealer.set_reveal_child(True)
|
||||||
self.cover_changed = True
|
self.cover_changed = True
|
||||||
|
|
||||||
|
def resize():
|
||||||
self.game_cover.new_cover(resize_cover(self.win, path))
|
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):
|
def choose_cover(self, *_args):
|
||||||
self.file_dialog.open(self, None, self.set_cover)
|
self.file_dialog.open(self, None, self.set_cover)
|
||||||
|
|||||||
@@ -36,8 +36,7 @@ def resize_cover(win, cover_path=None, pixbuf=None):
|
|||||||
with Image.open(cover_path) as image:
|
with Image.open(cover_path) as image:
|
||||||
if getattr(image, "is_animated", False):
|
if getattr(image, "is_animated", False):
|
||||||
frames = tuple(
|
frames = tuple(
|
||||||
frame.copy().resize((200, 300))
|
frame.resize((200, 300)) for frame in ImageSequence.Iterator(image)
|
||||||
for frame in ImageSequence.Iterator(image)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
tmp_path = Path(Gio.File.new_tmp("XXXXXX.gif")[0].get_path())
|
tmp_path = Path(Gio.File.new_tmp("XXXXXX.gif")[0].get_path())
|
||||||
|
|||||||
Reference in New Issue
Block a user