fixup! Port UI to GTK 4

This commit is contained in:
coderkun 2024-04-10 11:54:18 +02:00
parent 2744e1f351
commit 8673d44976
3 changed files with 48 additions and 89 deletions

View file

@ -26,10 +26,7 @@
<property name="round-digits">0</property> <property name="round-digits">0</property>
<property name="digits">0</property> <property name="digits">0</property>
<property name="has-origin">False</property> <property name="has-origin">False</property>
<!-- <signal name="value-changed" handler="on_grid_scale_changed" swapped="no"/>
<signal name="button-release-event" handler="on_grid_scale_changed" swapped="no"/>
<signal name="change-value" handler="on_grid_scale_change" swapped="no"/>
-->
</object> </object>
</child> </child>
<child> <child>

View file

@ -35,10 +35,6 @@ class LibraryPanel(Adw.Bin):
'sort-order-changed': (GObject.SIGNAL_RUN_FIRST, None, (int,)), 'sort-order-changed': (GObject.SIGNAL_RUN_FIRST, None, (int,)),
'sort-type-changed': (GObject.SIGNAL_RUN_FIRST, None, (bool,)), 'sort-type-changed': (GObject.SIGNAL_RUN_FIRST, None, (bool,)),
'albumart': (GObject.SIGNAL_RUN_FIRST, None, (str,)), 'albumart': (GObject.SIGNAL_RUN_FIRST, None, (str,)),
'update': (GObject.SIGNAL_RUN_FIRST, None, ()),
'start-scale': (GObject.SIGNAL_RUN_FIRST, None, (int,)),
'end-scale': (GObject.SIGNAL_RUN_FIRST, None, (int,)),
} }
@ -99,9 +95,6 @@ class LibraryPanel(Adw.Bin):
self._is_selected = False self._is_selected = False
# Widgets # Widgets
# FIXME Toolbar signals
#self._toolbar.connect('start-scale', self.on_toolbar_scale)
#self._toolbar.connect('end-scale', self.on_toolbar_scaled)
# Header bar # Header bar
self._headerbar_standalone = AlbumHeaderbar() self._headerbar_standalone = AlbumHeaderbar()
self._headerbar_standalone.connect('close', self.on_standalone_close_clicked) self._headerbar_standalone.connect('close', self.on_standalone_close_clicked)
@ -121,6 +114,11 @@ class LibraryPanel(Adw.Bin):
SortOrder.YEAR: self.sort_year SortOrder.YEAR: self.sort_year
} }
# Button controller for grid scale
buttonController = Gtk.GestureClick()
buttonController.connect('unpaired-release', self.on_grid_scale_released)
self.grid_scale.add_controller(buttonController)
def get_headerbar_standalone(self): def get_headerbar_standalone(self):
return self._headerbar_standalone return self._headerbar_standalone
@ -153,17 +151,24 @@ class LibraryPanel(Adw.Bin):
self.emit('update') self.emit('update')
# FXME on_grid_scale_changed def on_grid_scale_released(self, widget, x, y, npress, sequence):
#@Gtk.Template.Callback() size = math.floor(self.grid_scale.get_value())
def on_grid_scale_change(self, widget, scroll, value): range = self.grid_scale.get_adjustment()
self.emit('start-scale', value) if size < range.get_lower() or size > range.get_upper():
return
self._item_size = size
self.emit('item-size-changed', size)
self._redraw()
GObject.idle_add(self.toolbar_popover.popdown)
# FXME on_grid_scale_changed @Gtk.Template.Callback()
#@Gtk.Template.Callback() def on_grid_scale_changed(self, widget):
def on_grid_scale_changed(self, widget, event): size = math.floor(self.grid_scale.get_value())
self.emit('end-scale', self.grid_scale.get_value()) range = widget.get_adjustment()
self.toolbar_popover.popdown() if size < range.get_lower() or size > range.get_upper():
return
self._set_widget_grid_size(self.library_grid, size, True)
@Gtk.Template.Callback() @Gtk.Template.Callback()
@ -212,26 +217,6 @@ class LibraryPanel(Adw.Bin):
self.emit('update') self.emit('update')
def on_toolbar_scale(self, widget, value):
size = math.floor(value)
range = self.grid_scale.get_adjustment()
if size < range.get_lower() or size > range.get_upper():
return
self._item_size = size
#GObject.idle_add(self.library_grid.set_item_padding, size / 100)
GObject.idle_add(self._set_widget_grid_size, self.library_grid, size, True)
def on_toolbar_scaled(self, widget, value):
size = round(value)
range = self.grid_scale.get_adjustment()
if size < range.get_lower() or size > range.get_upper():
return False
self.emit('item-size-changed', size)
self._redraw()
return False
@Gtk.Template.Callback() @Gtk.Template.Callback()
def on_filter_entry_changed(self, widget): def on_filter_entry_changed(self, widget):
self._library_grid_filter.set_filter(SearchFilter(self.filter_entry.get_text())) self._library_grid_filter.set_filter(SearchFilter(self.filter_entry.get_text()))
@ -381,15 +366,13 @@ class LibraryPanel(Adw.Bin):
) )
""" """
self._library_lock.acquire() self._library_lock.acquire()
self._library_stop.clear()
self._albums = albums self._albums = albums
stack_transition_type = self.stack.get_transition_type()
GObject.idle_add(self.stack.set_transition_type, Gtk.StackTransitionType.NONE)
GObject.idle_add(self.stack.set_visible_child, self.progress_box) GObject.idle_add(self.stack.set_visible_child, self.progress_box)
GObject.idle_add(self.progress_bar.set_fraction, 0.0) GObject.idle_add(self.progress_bar.set_fraction, 0.0)
#GObject.idle_add(self.library_grid.set_item_padding, size / 100) GObject.idle_add(self.stack.set_transition_type, stack_transition_type)
temp_model = self.library_grid.get_model() GObject.idle_add(self._library_grid_model.remove_all)
self.library_grid.set_model(None)
#self.library_grid.freeze_child_notify()
self._library_grid_model.remove_all()
i = 0 i = 0
n = len(albums) n = len(albums)
@ -404,7 +387,7 @@ class LibraryPanel(Adw.Bin):
# Exception is handled by client # Exception is handled by client
pass pass
except Exception as e: except Exception as e:
self._logger.exception("Failed to load albumart") self._logger.exception("Failed to load albumart", e)
if pixbuf is None: if pixbuf is None:
pixbuf = self._icon_theme.lookup_icon( pixbuf = self._icon_theme.lookup_icon(
Utils.STOCK_ICON_DEFAULT, Utils.STOCK_ICON_DEFAULT,
@ -416,18 +399,12 @@ class LibraryPanel(Adw.Bin):
) )
if pixbuf is not None: if pixbuf is not None:
self._grid_pixbufs[album.get_id()] = pixbuf self._grid_pixbufs[album.get_id()] = pixbuf
self._library_grid_model.append(GridItem(album, pixbuf)) GObject.idle_add(self._library_grid_model.append, GridItem(album, pixbuf))
i += 1 i += 1
GObject.idle_add(self.progress_bar.set_fraction, i/n) GObject.idle_add(self.progress_bar.set_fraction, i/n)
GObject.idle_add(self.progress_bar.set_text, locale.gettext("Loading images")) GObject.idle_add(self.progress_bar.set_text, locale.gettext("Loading images"))
if self._library_stop.is_set():
self._library_lock.release()
return
self.library_grid.set_model(temp_model)
#self.library_grid.thaw_child_notify()
#self.library_grid.set_item_width(-1)
self._library_lock.release() self._library_lock.release()
self.stack.set_visible_child(self.scroll) self.stack.set_visible_child(self.scroll)
self._sort_grid_model() self._sort_grid_model()
@ -441,50 +418,31 @@ class LibraryPanel(Adw.Bin):
def _set_widget_grid_size_thread(self, grid_widget, size, vertical): def _set_widget_grid_size_thread(self, grid_widget, size, vertical):
self._library_lock.acquire() self._library_lock.acquire()
self._library_stop.clear() self._library_stop.clear()
grid_filter = grid_widget.get_model() if size == self._item_size:
grid_model = grid_filter.get_model()
# get old_range
grid_widget_id = id(grid_widget)
if grid_widget_id not in self._old_ranges or self._old_ranges[grid_widget_id] is None:
self._old_ranges[grid_widget_id] = range(0, len(grid_filter))
old_range = self._old_ranges[grid_widget_id]
old_start = len(old_range) > 0 and old_range[0] or 0
old_end = len(old_range) > 0 and old_range[len(old_range)-1] + 1 or 0
# calculate visible range
w = (grid_widget.get_allocation().width // size) + (vertical and 0 or 1)
h = (grid_widget.get_allocation().height // size) + (vertical and 1 or 0)
c = w * h
vis_range = grid_widget.get_visible_range()
if vis_range is None:
self._library_lock.release() self._library_lock.release()
return return
(vis_start,), (vis_end,) = vis_range for i in range(self._library_grid_model.get_n_items()):
vis_end = min(vis_start + c, len(grid_filter)) grid_item = self._library_grid_model.get_item(i)
vis_range = range(vis_start, vis_end) album_id = grid_item.get_album().get_id()
# set pixbuf pixbuf = self._grid_pixbufs[album_id]
cur_start = min(old_start, vis_start) if pixbuf is not None:
cur_end = max(old_end, vis_end)
cur_range = range(cur_start, cur_end)
for index in cur_range:
iter = grid_filter.convert_iter_to_child_iter(grid_filter[index].iter)
if index in vis_range:
album_id = grid_model.get_value(iter, 2)
pixbuf = self._grid_pixbufs[album_id]
pixbuf = pixbuf.scale_simple(size, size, GdkPixbuf.InterpType.NEAREST) pixbuf = pixbuf.scale_simple(size, size, GdkPixbuf.InterpType.NEAREST)
else: else:
pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, False, 8, 1, 1) pixbuf = self._icon_theme.lookup_icon(
grid_model.set_value(iter, 0, pixbuf) Utils.STOCK_ICON_DEFAULT,
None,
size,
size,
Gtk.TextDirection.LTR,
Gtk.IconLookupFlags.FORCE_SYMBOLIC
)
GObject.idle_add(grid_item.set_cover, pixbuf)
if self._library_stop.is_set(): if self._library_stop.is_set():
self._library_lock.release() self._library_lock.release()
return return
self._old_ranges[grid_widget_id] = vis_range
grid_widget.set_item_width(size)
self._library_lock.release() self._library_lock.release()

View file

@ -114,6 +114,10 @@ class GridItem(GObject.GObject):
return self._album return self._album
def set_cover(self, cover):
self.cover = Gdk.Texture.new_for_pixbuf(cover)
class SearchFilter(Gtk.Filter): class SearchFilter(Gtk.Filter):