[gnome-music/wip/jfelder/expose-grilo-application-wide: 5/6] application: Expose playlists as an application property



commit 3b4e25342373d4c90a5260f6a09ffe2a7a5fd989
Author: Jean Felder <jfelder src gnome org>
Date:   Fri May 3 16:37:39 2019 +0200

    application: Expose playlists as an application property
    
    Playlists should not be exposed as a global variable in different
    parts of the codebase.
    
    Move Playlists to Application, and make it a property so that it can
    be accessed as application.props.player. It is a readable property,
    since there is no reason to change it.

 gnomemusic/application.py            | 12 ++++++++++++
 gnomemusic/mpris.py                  |  3 +--
 gnomemusic/player.py                 |  6 +++---
 gnomemusic/playlists.py              |  9 ---------
 gnomemusic/views/playlistview.py     | 29 ++++++++++++++++-------------
 gnomemusic/widgets/playlistdialog.py |  3 +--
 gnomemusic/window.py                 | 13 +++++++------
 7 files changed, 40 insertions(+), 35 deletions(-)
---
diff --git a/gnomemusic/application.py b/gnomemusic/application.py
index 3cb88ed1..5521960f 100644
--- a/gnomemusic/application.py
+++ b/gnomemusic/application.py
@@ -40,6 +40,7 @@ from gnomemusic.inhibitsuspend import InhibitSuspend
 from gnomemusic.mpris import MediaPlayer2Service
 from gnomemusic.pauseonsuspend import PauseOnSuspend
 from gnomemusic.player import Player
+from gnomemusic.playlists import Playlists
 from gnomemusic.widgets.aboutdialog import AboutDialog
 from gnomemusic.window import Window
 
@@ -63,6 +64,7 @@ class Application(Gtk.Application):
         self._window = None
 
         self._settings = Gio.Settings.new('org.gnome.Music')
+        self._playlists = Playlists(self)
         self._player = Player(self)
 
         InhibitSuspend(self)
@@ -86,6 +88,16 @@ class Application(Gtk.Application):
         """
         return self._player
 
+    @GObject.Property(
+        type=Playlists, default=None, flags=GObject.ParamFlags.READABLE)
+    def playlists(self):
+        """Get application-wide music playlists.
+
+        :returns: the playlists
+        :rtype: Playlists
+        """
+        return self._playlists
+
     @GObject.Property(
         type=Gio.Settings, flags=GObject.ParamFlags.READABLE)
     def settings(self):
diff --git a/gnomemusic/mpris.py b/gnomemusic/mpris.py
index 91464d0e..93457770 100644
--- a/gnomemusic/mpris.py
+++ b/gnomemusic/mpris.py
@@ -26,7 +26,6 @@
 from gnomemusic.gstplayer import Playback
 from gnomemusic.player import PlayerPlaylist, RepeatMode
 from gnomemusic.grilo import grilo
-from gnomemusic.playlists import Playlists
 from gnomemusic.utils import View
 import gnomemusic.utils as utils
 
@@ -231,7 +230,7 @@ class MediaPlayer2Service(Server):
         self.player_toolbar = app.get_active_window()._player_toolbar
         self.player_toolbar.connect(
             'thumbnail-updated', self._on_thumbnail_updated)
-        playlists = Playlists.get_default()
+        playlists = app.props.playlists
         playlists.connect('playlist-created', self._on_playlists_count_changed)
         playlists.connect('playlist-deleted', self._on_playlists_count_changed)
         grilo.connect('ready', self._on_grilo_ready)
diff --git a/gnomemusic/player.py b/gnomemusic/player.py
index f60eed0a..94634a35 100644
--- a/gnomemusic/player.py
+++ b/gnomemusic/player.py
@@ -39,12 +39,10 @@ from gi.repository import GObject, Grl, GstPbutils
 from gnomemusic import log
 from gnomemusic.gstplayer import GstPlayer, Playback
 from gnomemusic.grilo import grilo
-from gnomemusic.playlists import Playlists
 from gnomemusic.scrobbler import LastFmScrobbler
 
 
 logger = logging.getLogger(__name__)
-playlists = Playlists.get_default()
 
 
 class RepeatMode(IntEnum):
@@ -565,6 +563,8 @@ class Player(GObject.GObject):
         self._playlist = PlayerPlaylist()
         self._playlist.connect('song-validated', self._on_song_validated)
 
+        self._playlists = application.props.playlists
+
         self._settings = application.props.settings
         self._settings.connect(
             'changed::repeat', self._on_repeat_setting_changed)
@@ -798,7 +798,7 @@ class Player(GObject.GObject):
                 # FIXME: we should not need to update static
                 # playlists here but removing it may introduce
                 # a bug. So, we keep it for the time being.
-                playlists.update_all_static_playlists()
+                self._playlists.update_all_static_playlists()
                 grilo.bump_play_count(current_song)
                 grilo.set_last_played(current_song)
 
diff --git a/gnomemusic/playlists.py b/gnomemusic/playlists.py
index 3081857d..553d731b 100644
--- a/gnomemusic/playlists.py
+++ b/gnomemusic/playlists.py
@@ -129,20 +129,11 @@ class Playlists(GObject.GObject):
         ),
     }
 
-    instance = None
     _tracker = None
 
     def __repr__(self):
         return '<Playlists>'
 
-    @classmethod
-    def get_default(cls, tracker=None):
-        if cls.instance:
-            return cls.instance
-        else:
-            cls.instance = Playlists()
-        return cls.instance
-
     @log
     def __init__(self):
         super().__init__()
diff --git a/gnomemusic/views/playlistview.py b/gnomemusic/views/playlistview.py
index 99a87eb0..16fab384 100644
--- a/gnomemusic/views/playlistview.py
+++ b/gnomemusic/views/playlistview.py
@@ -29,7 +29,7 @@ from gi.repository import Gdk, Gio, GLib, GObject, Gtk, Pango
 from gnomemusic import log
 from gnomemusic.grilo import grilo
 from gnomemusic.player import ValidationStatus, PlayerPlaylist
-from gnomemusic.playlists import Playlists, StaticPlaylists
+from gnomemusic.playlists import StaticPlaylists
 from gnomemusic.views.baseview import BaseView
 from gnomemusic.widgets.notificationspopup import PlaylistNotification
 from gnomemusic.widgets.playlistcontextmenu import PlaylistContextMenu
@@ -38,8 +38,6 @@ from gnomemusic.widgets.playlistdialog import PlaylistDialog
 from gnomemusic.widgets.sidebarrow import SidebarRow
 import gnomemusic.utils as utils
 
-playlists = Playlists.get_default()
-
 
 class PlaylistView(BaseView):
     """Main view for playlists"""
@@ -48,11 +46,12 @@ class PlaylistView(BaseView):
         return '<PlaylistView>'
 
     @log
-    def __init__(self, window, player):
+    def __init__(self, window, player, playlists):
         """Initialize
 
         :param GtkWidget window: The main window
         :param player: The main player object
+        :param Playlists playlists: The main playlists object
         """
         self._sidebar = Gtk.ListBox()
         sidebar_container = Gtk.ScrolledWindow()
@@ -63,6 +62,7 @@ class PlaylistView(BaseView):
 
         self._window = window
         self.player = player
+        self._playlists = playlists
 
         self._view.get_style_context().add_class('songs-list')
 
@@ -127,9 +127,9 @@ class PlaylistView(BaseView):
 
         self.player.connect('song-changed', self._update_model)
         self.player.connect('song-validated', self._on_song_validated)
-        playlists.connect('playlist-created', self._on_playlist_created)
-        playlists.connect('playlist-updated', self._on_playlist_update)
-        playlists.connect(
+        self._playlists.connect('playlist-created', self._on_playlist_created)
+        self._playlists.connect('playlist-updated', self._on_playlist_update)
+        self._playlists.connect(
             'song-added-to-playlist', self._on_song_added_to_playlist)
 
         self.show_all()
@@ -305,7 +305,7 @@ class PlaylistView(BaseView):
         """
         if index is None:
             index = -1
-        if playlists.is_static_playlist(playlist):
+        if self._playlists.is_static_playlist(playlist):
             index = 0
 
         title = utils.get_media_title(playlist)
@@ -436,7 +436,8 @@ class PlaylistView(BaseView):
             songs.append(model[_iter][5])
             positions.append(pos + 1)
 
-        playlists.reorder_playlist(self._current_playlist, songs, positions)
+        self._playlists.reorder_playlist(
+            self._current_playlist, songs, positions)
 
     @log
     def _play_song(self, menuitem, data=None):
@@ -452,7 +453,8 @@ class PlaylistView(BaseView):
         playlist_dialog = PlaylistDialog(
             self._window, self.pls_todelete)
         if playlist_dialog.run() == Gtk.ResponseType.ACCEPT:
-            playlists.add_to_playlist(playlist_dialog.get_selected(), [song])
+            self._playlists.add_to_playlist(
+                playlist_dialog.get_selected(), [song])
         playlist_dialog.destroy()
 
     @log
@@ -710,12 +712,13 @@ class PlaylistView(BaseView):
 
         if notification_type == PlaylistNotification.Type.PLAYLIST:
             pl_todelete = self.pls_todelete[media_id]
-            playlists.delete_playlist(pl_todelete['playlist'])
+            self._playlists.delete_playlist(
+                pl_todelete['playlist'])
             self.pls_todelete.pop(media_id)
 
         else:
             song_todelete = self._songs_todelete[media_id]
-            playlists.remove_from_playlist(
+            self._playlists.remove_from_playlist(
                 song_todelete['playlist'], [song_todelete['song']])
             self._songs_todelete.pop(media_id)
 
@@ -737,7 +740,7 @@ class PlaylistView(BaseView):
 
         pl_torename = selection.playlist
         pl_torename.set_title(new_name)
-        playlists.rename(pl_torename, new_name)
+        self._playlists.rename(pl_torename, new_name)
 
     @log
     def _on_playlist_created(self, playlists, playlist):
diff --git a/gnomemusic/widgets/playlistdialog.py b/gnomemusic/widgets/playlistdialog.py
index 3b77abae..5e4ab2bd 100644
--- a/gnomemusic/widgets/playlistdialog.py
+++ b/gnomemusic/widgets/playlistdialog.py
@@ -26,7 +26,6 @@ from gi.repository import Gtk, Pango
 
 from gnomemusic import log
 from gnomemusic.grilo import grilo
-from gnomemusic.playlists import Playlists
 import gnomemusic.utils as utils
 
 
@@ -68,7 +67,7 @@ class PlaylistDialog(Gtk.Dialog):
         self._playlists_todelete_ids = playlists_todelete.keys()
 
         self._user_playlists_available = False
-        self._playlist = Playlists.get_default()
+        self._playlist = parent._playlists
         self._playlist.connect('playlist-created', self._on_playlist_created)
 
     @log
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index 095ed094..a3ee1299 100644
--- a/gnomemusic/window.py
+++ b/gnomemusic/window.py
@@ -36,7 +36,7 @@ from gnomemusic import log
 from gnomemusic.grilo import grilo
 from gnomemusic.mediakeys import MediaKeys
 from gnomemusic.player import RepeatMode
-from gnomemusic.playlists import Playlists, StaticPlaylists
+from gnomemusic.playlists import StaticPlaylists
 from gnomemusic.query import Query
 from gnomemusic.search import Search
 from gnomemusic.utils import View
@@ -57,8 +57,6 @@ from gnomemusic.windowplacement import WindowPlacement
 import logging
 logger = logging.getLogger(__name__)
 
-playlists = Playlists.get_default()
-
 
 class Window(Gtk.ApplicationWindow):
 
@@ -76,6 +74,8 @@ class Window(Gtk.ApplicationWindow):
         """
         super().__init__(application=app, title=_("Music"))
 
+        self._playlists = app.props.playlists
+
         self._settings = app.props.settings
         self.add_action(self._settings.create_action('repeat'))
         select_all = Gio.SimpleAction.new('select_all', None)
@@ -262,7 +262,8 @@ class Window(Gtk.ApplicationWindow):
         self.views[View.ALBUM] = AlbumsView(self, self._player)
         self.views[View.ARTIST] = ArtistsView(self, self._player)
         self.views[View.SONG] = SongsView(self, self._player)
-        self.views[View.PLAYLIST] = PlaylistView(self, self._player)
+        self.views[View.PLAYLIST] = PlaylistView(
+            self, self._player, self._playlists)
         self.views[View.SEARCH] = SearchView(self, self._player)
 
         selectable_views = [View.ALBUM, View.ARTIST, View.SONG, View.SEARCH]
@@ -507,7 +508,7 @@ class Window(Gtk.ApplicationWindow):
             playlist_dialog = PlaylistDialog(
                 self, self.views[View.PLAYLIST].pls_todelete)
             if playlist_dialog.run() == Gtk.ResponseType.ACCEPT:
-                playlists.add_to_playlist(
+                self._playlists.add_to_playlist(
                     playlist_dialog.get_selected(), selected_songs)
             self.props.selection_mode = False
             playlist_dialog.destroy()
@@ -525,7 +526,7 @@ class Window(Gtk.ApplicationWindow):
     @log
     def refresh_views_favorite(self, visible_view, media):
         grilo.toggle_favorite(media)
-        playlists.update_static_playlist(StaticPlaylists.Favorites)
+        self._playlists.update_static_playlist(StaticPlaylists.Favorites)
 
         # FIXME: the refresh should be triggered by listening to the
         # relevant tracker event.


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