diff --git a/data/ui/library-panel.ui b/data/ui/library-panel.ui
index 7663ac3..1985edb 100644
--- a/data/ui/library-panel.ui
+++ b/data/ui/library-panel.ui
@@ -26,10 +26,7 @@
0
0
False
-
+
diff --git a/src/librarypanel.py b/src/librarypanel.py
index 11b68f5..d426a0f 100644
--- a/src/librarypanel.py
+++ b/src/librarypanel.py
@@ -35,10 +35,6 @@ class LibraryPanel(Adw.Bin):
'sort-order-changed': (GObject.SIGNAL_RUN_FIRST, None, (int,)),
'sort-type-changed': (GObject.SIGNAL_RUN_FIRST, None, (bool,)),
'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
# Widgets
- # FIXME Toolbar signals
- #self._toolbar.connect('start-scale', self.on_toolbar_scale)
- #self._toolbar.connect('end-scale', self.on_toolbar_scaled)
# Header bar
self._headerbar_standalone = AlbumHeaderbar()
self._headerbar_standalone.connect('close', self.on_standalone_close_clicked)
@@ -121,6 +114,11 @@ class LibraryPanel(Adw.Bin):
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):
return self._headerbar_standalone
@@ -153,17 +151,24 @@ class LibraryPanel(Adw.Bin):
self.emit('update')
- # FXME on_grid_scale_changed
- #@Gtk.Template.Callback()
- def on_grid_scale_change(self, widget, scroll, value):
- self.emit('start-scale', value)
+ def on_grid_scale_released(self, widget, x, y, npress, sequence):
+ size = math.floor(self.grid_scale.get_value())
+ range = self.grid_scale.get_adjustment()
+ 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()
- def on_grid_scale_changed(self, widget, event):
- self.emit('end-scale', self.grid_scale.get_value())
- self.toolbar_popover.popdown()
+ @Gtk.Template.Callback()
+ def on_grid_scale_changed(self, widget):
+ size = math.floor(self.grid_scale.get_value())
+ range = widget.get_adjustment()
+ if size < range.get_lower() or size > range.get_upper():
+ return
+ self._set_widget_grid_size(self.library_grid, size, True)
@Gtk.Template.Callback()
@@ -212,26 +217,6 @@ class LibraryPanel(Adw.Bin):
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()
def on_filter_entry_changed(self, widget):
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_stop.clear()
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.progress_bar.set_fraction, 0.0)
- #GObject.idle_add(self.library_grid.set_item_padding, size / 100)
- temp_model = self.library_grid.get_model()
- self.library_grid.set_model(None)
- #self.library_grid.freeze_child_notify()
- self._library_grid_model.remove_all()
+ GObject.idle_add(self.stack.set_transition_type, stack_transition_type)
+ GObject.idle_add(self._library_grid_model.remove_all)
i = 0
n = len(albums)
@@ -404,7 +387,7 @@ class LibraryPanel(Adw.Bin):
# Exception is handled by client
pass
except Exception as e:
- self._logger.exception("Failed to load albumart")
+ self._logger.exception("Failed to load albumart", e)
if pixbuf is None:
pixbuf = self._icon_theme.lookup_icon(
Utils.STOCK_ICON_DEFAULT,
@@ -416,18 +399,12 @@ class LibraryPanel(Adw.Bin):
)
if pixbuf is not None:
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
GObject.idle_add(self.progress_bar.set_fraction, i/n)
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.stack.set_visible_child(self.scroll)
self._sort_grid_model()
@@ -441,50 +418,31 @@ class LibraryPanel(Adw.Bin):
def _set_widget_grid_size_thread(self, grid_widget, size, vertical):
self._library_lock.acquire()
self._library_stop.clear()
- grid_filter = grid_widget.get_model()
- 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:
+ if size == self._item_size:
self._library_lock.release()
return
- (vis_start,), (vis_end,) = vis_range
- vis_end = min(vis_start + c, len(grid_filter))
- vis_range = range(vis_start, vis_end)
-
- # set pixbuf
- cur_start = min(old_start, vis_start)
- 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]
+ for i in range(self._library_grid_model.get_n_items()):
+ grid_item = self._library_grid_model.get_item(i)
+ album_id = grid_item.get_album().get_id()
+
+ pixbuf = self._grid_pixbufs[album_id]
+ if pixbuf is not None:
pixbuf = pixbuf.scale_simple(size, size, GdkPixbuf.InterpType.NEAREST)
else:
- pixbuf = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, False, 8, 1, 1)
- grid_model.set_value(iter, 0, pixbuf)
+ pixbuf = self._icon_theme.lookup_icon(
+ 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():
self._library_lock.release()
return
- self._old_ranges[grid_widget_id] = vis_range
- grid_widget.set_item_width(size)
-
self._library_lock.release()
diff --git a/src/utils.py b/src/utils.py
index e67655d..c25b66d 100644
--- a/src/utils.py
+++ b/src/utils.py
@@ -114,6 +114,10 @@ class GridItem(GObject.GObject):
return self._album
+ def set_cover(self, cover):
+ self.cover = Gdk.Texture.new_for_pixbuf(cover)
+
+
class SearchFilter(Gtk.Filter):