[gnome-music/wip/jfelder/restore-mpris-playlists: 11/13] mpris: Use active_playlist property to activate a playlist



commit 5a1793573a7b3ab03277c6ebef890798c252f4b3
Author: Jean Felder <jfelder src gnome org>
Date:   Sat Sep 21 21:40:53 2019 +0200

    mpris: Use active_playlist property to activate a playlist
    
    When changing activate_playlist property in MPRIS, the
    "notify::activate_playlist" in PlaylistsView needs to be blocked to
    prevent a circular call.

 gnomemusic/coremodel.py           | 12 ------------
 gnomemusic/mpris.py               |  2 +-
 gnomemusic/views/playlistsview.py | 18 ++++++++++++------
 3 files changed, 13 insertions(+), 19 deletions(-)
---
diff --git a/gnomemusic/coremodel.py b/gnomemusic/coremodel.py
index 3b87bcf7..46b69a0f 100644
--- a/gnomemusic/coremodel.py
+++ b/gnomemusic/coremodel.py
@@ -65,8 +65,6 @@ class CoreModel(GObject.GObject):
     """
 
     __gsignals__ = {
-        "activate-playlist": (
-            GObject.SignalFlags.RUN_FIRST, None, (Playlist,)),
         "artists-loaded": (GObject.SignalFlags.RUN_FIRST, None, ()),
         "playlist-loaded": (GObject.SignalFlags.RUN_FIRST, None, (int,)),
         "playlists-loaded": (GObject.SignalFlags.RUN_FIRST, None, ()),
@@ -385,16 +383,6 @@ class CoreModel(GObject.GObject):
         """
         self.props.grilo.create_playlist(playlist_title, callback)
 
-    def activate_playlist(self, playlist):
-        """Activates a playlist.
-
-        Selects the playlist and start playing.
-
-        :param Playlist playlist: playlist to activate
-        """
-        # FIXME: just a proxy
-        self.emit("activate-playlist", playlist)
-
     def search(self, text):
         self.props.grilo.search(text)
 
diff --git a/gnomemusic/mpris.py b/gnomemusic/mpris.py
index ae4d35aa..ce0eac47 100644
--- a/gnomemusic/mpris.py
+++ b/gnomemusic/mpris.py
@@ -765,7 +765,7 @@ class MPRIS(DBusInterface):
                 break
 
         if selected_playlist is not None:
-            self._coremodel.activate_playlist(selected_playlist)
+            self._coremodel.props.active_playlist = selected_playlist
 
     def _get_playlists(self, index, max_count, order, reverse):
         """Gets a set of playlists (MPRIS Method).
diff --git a/gnomemusic/views/playlistsview.py b/gnomemusic/views/playlistsview.py
index 061da267..02d2e66b 100644
--- a/gnomemusic/views/playlistsview.py
+++ b/gnomemusic/views/playlistsview.py
@@ -112,8 +112,8 @@ class PlaylistsView(BaseView):
 
         self._loaded_id = self._coremodel.connect(
             "playlists-loaded", self._on_playlists_loaded)
-        self._coremodel.connect(
-            "activate-playlist", self._on_playlist_activation_request)
+        self._active_playlist_id = self._coremodel.connect(
+            "notify::active-playlist", self._on_active_playlist_changed)
 
         # Selection is only possible from the context menu
         self.disconnect(self._selection_mode_id)
@@ -222,16 +222,20 @@ class PlaylistsView(BaseView):
         self._playlist_delete_action.set_enabled(not playlist.props.is_smart)
         self._remove_song_action.set_enabled(not playlist.props.is_smart)
 
-    def _on_playlist_activation_request(self, klass, playlist):
+    def _on_active_playlist_changed(self, klass, val):
         """Selects and starts playing a playlist.
 
         If the view has not been populated yet, populate it and then
         select the requested playlist. Otherwise, directly select the
         requested playlist and start playing.
 
-        :param CoreModel klass: Main CorexModel
-        :param Playlist playlist: requested playlist
+        :param CoreModel klass: Main CoreModel
+        :param GParamObject val: value
         """
+        playlist = self._coremodel.props.active_playlist
+        if playlist is None:
+            return
+
         def _on_playlist_loaded(playlist):
             playlist.disconnect(playlist_ready_id)
             self._song_activated(None)
@@ -277,14 +281,16 @@ class PlaylistsView(BaseView):
         signal_id = None
 
         def _on_playlist_loaded(klass, playlist_type):
-            self._coremodel.props.active_playlist = current_playlist
             self._player.play(coresong)
+            self._coremodel.handler_unblock(self._active_playlist_id)
             self._coremodel.disconnect(signal_id)
 
         selection = self._sidebar.get_selected_row()
         current_playlist = selection.props.playlist
         signal_id = self._coremodel.connect(
             "playlist-loaded", _on_playlist_loaded)
+        self._coremodel.handler_block(self._active_playlist_id)
+        self._coremodel.props.active_playlist = current_playlist
         self._coremodel.set_player_model(
             PlayerPlaylist.Type.PLAYLIST, current_playlist.props.model)
 


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