[gnome-music/wip/jfelder/playback-status-v4: 14/22] coremodel: Add an active_media property to create a player playlist



commit 6675eab1d455567b35b05d71b9241e3d1e214e70
Author: Jean Felder <jfelder src gnome org>
Date:   Sat Jan 11 23:09:26 2020 +0100

    coremodel: Add an active_media property to create a player playlist
    
    Only some widgets and the MPRIS objet can set the playlist player by
    calling the set_player_model() function from the CoreModel. Once the
    player playlist is loaded, the appropriate is loaded and the player
    starts playing.
    Each type of player playlist can be set by only one widget. However, a
    playlist type can also set by the MPRIS object. When PlaylistsWidget
    or MPRIS set a new player playlist, the active_playlist property is
    used to inform the other object of the change.
    
    This commit generalizes this approach by introducing a new
    active_media property. A set_player_model call is replaced by setting
    the active_media. Based on the type of media, _set_player_model() is
    called with the correct parameters.
    
    The next commit will remove the active_playlist property which is
    redundant with the active_media property.

 gnomemusic/coremodel.py                  | 42 +++++++++++++++++++++++++++++++-
 gnomemusic/mpris.py                      |  3 +--
 gnomemusic/views/searchview.py           |  4 +--
 gnomemusic/views/songsview.py            |  6 ++---
 gnomemusic/widgets/albumwidget.py        |  4 +--
 gnomemusic/widgets/artistalbumswidget.py |  3 +--
 gnomemusic/widgets/playlistswidget.py    |  4 +--
 7 files changed, 48 insertions(+), 18 deletions(-)
---
diff --git a/gnomemusic/coremodel.py b/gnomemusic/coremodel.py
index 5a3048db..88369887 100644
--- a/gnomemusic/coremodel.py
+++ b/gnomemusic/coremodel.py
@@ -29,6 +29,7 @@ gi.require_version("Gfm", "0.1")
 from gi.repository import GObject, Gio, Gfm, Gtk
 
 from gnomemusic.coreartist import CoreArtist
+from gnomemusic.corealbum import CoreAlbum
 from gnomemusic.coresong import CoreSong
 from gnomemusic.grilowrappers.grltrackerplaylists import Playlist
 from gnomemusic.player import PlayerPlaylist
@@ -104,6 +105,7 @@ class CoreModel(GObject.GObject):
         self._playlist_model_sort = Gfm.SortListModel.new(self._playlist_model)
         self._playlist_model_recent = Gfm.SliceListModel.new(
             self._playlist_model_sort, 0, self._recent_size)
+        self._active_media = None
 
         self._songs_search_proxy = Gio.ListStore.new(Gfm.FilterListModel)
         self._songs_search_flatten = Gfm.FlattenListModel.new(CoreSong)
@@ -138,6 +140,8 @@ class CoreModel(GObject.GObject):
         self._user_playlists_model_sort.set_sort_func(
             utils.wrap_list_store_sort_func(self._playlists_sort))
 
+        self._search = application.props.search
+
         self._songs_model.connect(
             "items-changed", self._on_songs_items_changed)
 
@@ -181,7 +185,7 @@ class CoreModel(GObject.GObject):
             playlist_a.props.creation_date)
         return math.copysign(1, date_diff)
 
-    def set_player_model(self, playlist_type, model):
+    def _set_player_model(self, playlist_type, model):
         """Set the model for PlayerPlaylist to use
 
         This fills playlist model based on the playlist type and model
@@ -296,6 +300,42 @@ class CoreModel(GObject.GObject):
 
         self.emit("playlist-loaded", playlist_type)
 
+    @GObject.Property(default=None)
+    def active_media(self):
+        """Get the current playing media
+        (album, artist, playlist, search result or song).
+
+        :returns: current media
+        :rtype: CoreObject
+        """
+        return self._active_media
+
+    @active_media.setter
+    def active_media(self, value):
+        """Set the current playing media
+        (album, artist, playlist, search result or song).
+
+        :param CoreObject value: new media
+        """
+        self._active_media = value
+        if isinstance(value, CoreAlbum):
+            playlist_type = PlayerPlaylist.Type.ALBUM
+            model = value.props.model
+        elif isinstance(value, CoreArtist):
+            playlist_type = PlayerPlaylist.Type.ARTIST
+            model = value.props.model
+        elif isinstance(value, Playlist):
+            playlist_type = PlayerPlaylist.Type.PLAYLIST
+            model = value.props.model
+        elif self._search.props.search_mode_active:
+            playlist_type = PlayerPlaylist.Type.SEARCH_RESULT
+            model = self._song_search_flatten
+        else:
+            playlist_type = PlayerPlaylist.Type.SONGS
+            model = self._songs_model
+
+        self._set_player_model(playlist_type, model)
+
     @GObject.Property(
         type=Gio.ListStore, default=None, flags=GObject.ParamFlags.READABLE)
     def songs(self):
diff --git a/gnomemusic/mpris.py b/gnomemusic/mpris.py
index d27c226d..a7c26328 100644
--- a/gnomemusic/mpris.py
+++ b/gnomemusic/mpris.py
@@ -751,8 +751,7 @@ class MPRIS(DBusInterface):
         loaded_id = self._coremodel.connect(
             "playlist-loaded", _on_playlist_loaded)
         self._coremodel.props.active_playlist = playlist
-        self._coremodel.set_player_model(
-            PlayerPlaylist.Type.PLAYLIST, playlist.props.model)
+        self._coremodel.props.active_media = playlist
 
     def _activate_playlist(self, playlist_path):
         """Starts playing the given playlist (MPRIS Method).
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index 1b727e09..8cdb43d4 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -27,7 +27,6 @@ from gettext import gettext as _
 
 from gi.repository import Gdk, GObject, Gtk
 
-from gnomemusic.player import PlayerPlaylist
 from gnomemusic.search import Search
 from gnomemusic.widgets.albumcover import AlbumCover
 from gnomemusic.widgets.albumwidget import AlbumWidget
@@ -249,8 +248,7 @@ class SearchView(Gtk.Stack):
                 and not self.props.selection_mode):
             # self.emit('song-activated', widget)
 
-            self._coremodel.set_player_model(
-                PlayerPlaylist.Type.SEARCH_RESULT, self._model)
+            self._coremodel.props.active_media = widget.props.coresong
             self._player.play(widget.props.coresong)
 
         # FIXME: Need to ignore the event from the checkbox.
diff --git a/gnomemusic/views/songsview.py b/gnomemusic/views/songsview.py
index 267e39cb..91a33824 100644
--- a/gnomemusic/views/songsview.py
+++ b/gnomemusic/views/songsview.py
@@ -26,7 +26,6 @@ from gettext import gettext as _
 from gi.repository import Gdk, GObject, Gtk, Pango
 
 from gnomemusic.coresong import CoreSong
-from gnomemusic.player import PlayerPlaylist
 from gnomemusic.utils import SongStateIcon
 from gnomemusic.widgets.starhandlerwidget import StarHandlerWidget
 
@@ -149,10 +148,9 @@ class SongsView(Gtk.ScrolledWindow):
         if self.props.selection_mode:
             return
 
-        itr = self._model.get_iter(path)
+        itr = self._songs_view.props.model.get_iter(path)
         coresong = self._model[itr][7]
-        self._coremodel.set_player_model(
-            PlayerPlaylist.Type.SONGS, self._model)
+        self._coremodel.props.active_media = coresong
 
         self._player.play(coresong)
 
diff --git a/gnomemusic/widgets/albumwidget.py b/gnomemusic/widgets/albumwidget.py
index 635b19cd..73283b1d 100644
--- a/gnomemusic/widgets/albumwidget.py
+++ b/gnomemusic/widgets/albumwidget.py
@@ -27,7 +27,6 @@ from gettext import ngettext
 from gi.repository import GObject, Grl, Gtk
 
 from gnomemusic.albumartcache import Art
-from gnomemusic.player import PlayerPlaylist
 from gnomemusic.widgets.disclistboxwidget import DiscBox
 from gnomemusic.widgets.disclistboxwidget import DiscListBox  # noqa: F401
 
@@ -167,8 +166,7 @@ class AlbumWidget(Gtk.EventBox):
 
         signal_id = self._coremodel.connect(
             "playlist-loaded", _on_playlist_loaded)
-        self._coremodel.set_player_model(
-            PlayerPlaylist.Type.ALBUM, self._album_model)
+        self._coremodel.props.active_media = self._corealbum
 
         return True
 
diff --git a/gnomemusic/widgets/artistalbumswidget.py b/gnomemusic/widgets/artistalbumswidget.py
index be262e2b..f9430d26 100644
--- a/gnomemusic/widgets/artistalbumswidget.py
+++ b/gnomemusic/widgets/artistalbumswidget.py
@@ -24,7 +24,6 @@
 
 from gi.repository import GObject, Gtk
 
-from gnomemusic.player import PlayerPlaylist
 from gnomemusic.widgets.artistalbumwidget import ArtistAlbumWidget
 
 
@@ -74,7 +73,7 @@ class ArtistAlbumsWidget(Gtk.ListBox):
             coremodel.disconnect(signal_id)
 
         signal_id = coremodel.connect("playlist-loaded", _on_playlist_loaded)
-        coremodel.set_player_model(PlayerPlaylist.Type.ARTIST, self._model)
+        coremodel.props.active_media = self._artist
 
     def _add_album(self, corealbum):
         row = Gtk.ListBoxRow()
diff --git a/gnomemusic/widgets/playlistswidget.py b/gnomemusic/widgets/playlistswidget.py
index 084b42e7..b5ec2b41 100644
--- a/gnomemusic/widgets/playlistswidget.py
+++ b/gnomemusic/widgets/playlistswidget.py
@@ -24,7 +24,6 @@
 
 from gi.repository import Gdk, GObject, Gtk
 
-from gnomemusic.player import PlayerPlaylist
 from gnomemusic.widgets.notificationspopup import PlaylistNotification
 from gnomemusic.widgets.playlistcontextmenu import PlaylistContextMenu
 from gnomemusic.widgets.playlistcontrols import PlaylistControls  # noqa: F401
@@ -119,8 +118,7 @@ class PlaylistsWidget(Gtk.Box):
         signal_id = self._coremodel.connect(
             "playlist-loaded", _on_playlist_loaded)
         self._coremodel.props.active_playlist = current_playlist
-        self._coremodel.set_player_model(
-            PlayerPlaylist.Type.PLAYLIST, current_playlist.props.model)
+        self._coremodel.props.active_media = current_playlist
 
     def _on_song_widget_moved(self, target, source_position):
         target_position = target.get_parent().get_index()


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]