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