[gnome-music/wip/jfelder/expose-grilo-application-wide: 5/6] application: Expose playlists as an application property
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/expose-grilo-application-wide: 5/6] application: Expose playlists as an application property
- Date: Tue, 7 May 2019 15:42:01 +0000 (UTC)
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]