diff options
Diffstat (limited to 'gnomemusic/coredisc.py')
-rw-r--r-- | gnomemusic/coredisc.py | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/gnomemusic/coredisc.py b/gnomemusic/coredisc.py index 697089a6..ece33ba2 100644 --- a/gnomemusic/coredisc.py +++ b/gnomemusic/coredisc.py @@ -22,13 +22,13 @@ # code, but you are not obligated to do so. If you do not wish to do so, # delete this exception statement from your version. -from gi.repository import GObject, Gio, Gfm, Grl - -import gnomemusic.utils as utils +from gi.repository import GObject, Gio, Grl, Gtk class CoreDisc(GObject.GObject): + __gtype_name__ = "CoreDisc" + disc_nr = GObject.Property(type=int, default=0) duration = GObject.Property(type=int, default=None) media = GObject.Property(type=Grl.Media, default=None) @@ -47,7 +47,6 @@ class CoreDisc(GObject.GObject): self._filter_model = None self._log = application.props.log self._model = None - self._old_album_ids = [] self._selected = False self.update(media) @@ -58,20 +57,28 @@ class CoreDisc(GObject.GObject): @GObject.Property(type=Gio.ListModel, default=None) def model(self): - def _disc_sort(song_a, song_b): - return song_a.props.track_number - song_b.props.track_number + def _disc_sort(song_a, song_b, data=None): + order = song_a.props.track_number - song_b.props.track_number + if order < 0: + return Gtk.Ordering.SMALLER + elif order > 0: + return Gtk.Ordering.LARGER + else: + return Gtk.Ordering.EQUAL if self._model is None: - self._filter_model = Gfm.FilterListModel.new( + self._filter_model = Gtk.FilterListModel.new( self._coremodel.props.songs) - self._filter_model.set_filter_func(lambda a: False) - self._model = Gfm.SortListModel.new(self._filter_model) - self._model.set_sort_func( - utils.wrap_list_store_sort_func(_disc_sort)) + self._filter_model.set_filter(Gtk.AnyFilter()) + + self._model = Gtk.SortListModel.new(self._filter_model) + disc_sorter = Gtk.CustomSorter() + disc_sorter.set_sort_func(_disc_sort) + self._model.set_sorter(disc_sorter) self._model.connect("items-changed", self._on_disc_changed) - self._get_album_disc( + self._coregrilo.get_album_disc( self.props.media, self.props.disc_nr, self._filter_model) return self._model @@ -85,36 +92,16 @@ class CoreDisc(GObject.GObject): self.props.duration = duration - def _get_album_disc(self, media, discnr, model): - album_ids = [] - model_filter = model - - def _filter_func(core_song): - return core_song.props.grlid in album_ids - - def _callback(source, op_id, media, remaining, error): - if error: - self._log.warning("Error: {}".format(error)) - return - - if media is None: - if sorted(album_ids) == sorted(self._old_album_ids): - return - model_filter.set_filter_func(_filter_func) - self._old_album_ids = album_ids - return - - album_ids.append(media.get_source() + media.get_id()) - - self._coregrilo.populate_album_disc_songs(media, discnr, _callback) - @GObject.Property( - type=bool, default=False, flags=GObject.BindingFlags.SYNC_CREATE) + type=bool, default=False, flags=GObject.ParamFlags.READWRITE) def selected(self): return self._selected @selected.setter # type: ignore def selected(self, value): + if value == self._selected: + return + self._selected = value # The model is loaded on-demand, so the first time the model is |