Resize images asynchronously in the edit dialog
This commit is contained in:
@@ -40,30 +40,20 @@ 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 cover_overlay {
|
Overlay {
|
||||||
halign: center;
|
|
||||||
valign: center;
|
|
||||||
|
|
||||||
[overlay]
|
[overlay]
|
||||||
Button cover_button_edit {
|
Spinner spinner {
|
||||||
icon-name: "document-edit-symbolic";
|
margin-start: 72;
|
||||||
halign: end;
|
margin-end: 72;
|
||||||
valign: end;
|
|
||||||
margin-bottom: 6;
|
|
||||||
margin-end: 6;
|
|
||||||
|
|
||||||
styles [
|
|
||||||
"circular", "osd"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[overlay]
|
Overlay cover_overlay {
|
||||||
Revealer cover_button_delete_revealer {
|
halign: center;
|
||||||
transition-type: crossfade;
|
valign: center;
|
||||||
margin-end: 40;
|
|
||||||
|
|
||||||
Button cover_button_delete {
|
[overlay]
|
||||||
icon-name: "user-trash-symbolic";
|
Button cover_button_edit {
|
||||||
|
icon-name: "document-edit-symbolic";
|
||||||
halign: end;
|
halign: end;
|
||||||
valign: end;
|
valign: end;
|
||||||
margin-bottom: 6;
|
margin-bottom: 6;
|
||||||
@@ -73,15 +63,33 @@ template DetailsWindow : Adw.Window {
|
|||||||
"circular", "osd"
|
"circular", "osd"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Picture cover {
|
[overlay]
|
||||||
width-request: 200;
|
Revealer cover_button_delete_revealer {
|
||||||
height-request: 300;
|
transition-type: crossfade;
|
||||||
|
margin-end: 40;
|
||||||
|
|
||||||
styles [
|
Button cover_button_delete {
|
||||||
"card"
|
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"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
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):
|
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