fixup! Port UI to GTK 4
This commit is contained in:
parent
2744e1f351
commit
8673d44976
|
@ -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>
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in a new issue