[gnome-music/wip/jfelder/playback-status-v3: 11/12] playbackpopover: Introduce PlaybackPopover
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/playback-status-v3: 11/12] playbackpopover: Introduce PlaybackPopover
- Date: Wed, 30 Jan 2019 22:44:34 +0000 (UTC)
commit 9ef3862e7bc3d76a66a1ea2876d7a5c636037808
Author: Jean Felder <jfelder src gnome org>
Date: Mon Sep 10 08:45:20 2018 +0200
playbackpopover: Introduce PlaybackPopover
The PlaybackPopover allows to keep track of the current playset.
When a playset is started from the album view, it displays an
AlbumWidget in PLAYBACK mode. If a playset is started from Artists,
Songs or Playlist view, it displays a LinearPlayBox.
Playbackpopover also contains a RepeatBox widget to change the repeat
mode.
PlaybackPopover is automatically updated when the current song, repeat
mode or playset changes.
data/org.gnome.Music.gresource.xml | 1 +
data/ui/PlaybackPopover.ui | 22 ++++++++
gnomemusic/grilo.py | 7 +++
gnomemusic/query.py | 11 ++++
gnomemusic/widgets/playbackpopover.py | 102 +++++++++++++++++++++++++++++++++-
gnomemusic/widgets/playertoolbar.py | 4 ++
po/POTFILES.in | 1 +
7 files changed, 147 insertions(+), 1 deletion(-)
---
diff --git a/data/org.gnome.Music.gresource.xml b/data/org.gnome.Music.gresource.xml
index 9ec0b196..ebe6f69d 100644
--- a/data/org.gnome.Music.gresource.xml
+++ b/data/org.gnome.Music.gresource.xml
@@ -16,6 +16,7 @@
<file preprocess="xml-stripblanks">ui/FilterView.ui</file>
<file preprocess="xml-stripblanks">ui/HeaderBar.ui</file>
<file preprocess="xml-stripblanks">ui/LinearPlaybackWindow.ui</file>
+ <file preprocess="xml-stripblanks">ui/PlaybackPopover.ui</file>
<file preprocess="xml-stripblanks">ui/PlayerToolbar.ui</file>
<file preprocess="xml-stripblanks">ui/PlaylistContextMenu.ui</file>
<file preprocess="xml-stripblanks">ui/PlaylistControls.ui</file>
diff --git a/data/ui/PlaybackPopover.ui b/data/ui/PlaybackPopover.ui
new file mode 100644
index 00000000..75aca461
--- /dev/null
+++ b/data/ui/PlaybackPopover.ui
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <template class="PlaybackPopover" parent="GtkPopover">
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkHeaderBar" id="_headerbar">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="_main_box">
+ <property name="orientation">vertical</property>
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/gnomemusic/grilo.py b/gnomemusic/grilo.py
index 65d0373f..457645a3 100644
--- a/gnomemusic/grilo.py
+++ b/gnomemusic/grilo.py
@@ -420,6 +420,13 @@ class Grilo(GObject.GObject):
self.search_source.query(query, self.METADATA_THUMBNAIL_KEYS, options,
callback)
+ @log
+ def get_album_with_id(self, album_id, callback):
+ options = self.options.copy()
+ query = Query.get_album_for_album_id(album_id)
+
+ self.tracker.query(query, self.METADATA_KEYS, options, callback, None)
+
@log
def get_playlist_with_id(self, playlist_id, callback):
options = self.options.copy()
diff --git a/gnomemusic/query.py b/gnomemusic/query.py
index ac7707f8..0f62cb8a 100644
--- a/gnomemusic/query.py
+++ b/gnomemusic/query.py
@@ -630,6 +630,17 @@ class Query():
}
return query
+ @staticmethod
+ def get_album_with_id(playlist_id):
+ query = """
+ ?playlist a nmm:Playlist .
+ FILTER (
+ tracker:id(?playlist) = %(playlist_id)s
+ )
+ """.replace('\n', ' ').strip() % {'playlist_id': playlist_id}
+
+ return Query.playlists(query)
+
@staticmethod
def get_playlist_with_id(playlist_id):
query = """
diff --git a/gnomemusic/widgets/playbackpopover.py b/gnomemusic/widgets/playbackpopover.py
index c48d7283..5c315f63 100644
--- a/gnomemusic/widgets/playbackpopover.py
+++ b/gnomemusic/widgets/playbackpopover.py
@@ -22,10 +22,16 @@
# 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 Gtk
+from gi.repository import GObject, Gtk
+from gettext import gettext as _
from gnomemusic import log
+from gnomemusic.grilo import grilo
+from gnomemusic.player import PlayerPlaylist
+from gnomemusic.widgets.albumwidget import AlbumWidget
+from gnomemusic.widgets.repeatbox import RepeatBox
from gnomemusic.widgets.songwidget import WidgetState, TwoLineWidget
+import gnomemusic.utils as utils
@Gtk.Template(resource_path='/org/gnome/Music/ui/LinearPlaybackWindow.ui')
@@ -129,3 +135,97 @@ class LinearPlaybackWindow(Gtk.ScrolledWindow):
def _on_row_activated(self, klass, row):
index = row.get_index()
self._player.play(index - self._current_index)
+
+
+@Gtk.Template(resource_path='/org/gnome/Music/ui/PlaybackPopover.ui')
+class PlaybackPopover(Gtk.Popover):
+ """Popover showing the following tracks in the current playlist"""
+
+ __gtype_name__ = 'PlaybackPopover'
+
+ __gsignals__ = {
+ 'current-changed':
+ (GObject.SignalFlags.RUN_FIRST, None, (Gtk.TreeIter,)),
+ }
+
+ _headerbar = Gtk.Template.Child()
+ _main_box = Gtk.Template.Child()
+
+ def __repr__(self):
+ return '<PlaybackPopover>'
+
+ @log
+ def __init__(self, player, button):
+ super().__init__(relative_to=button)
+
+ self._player = player
+ button.connect('toggled', self._on_button_toggled)
+ self._player.connect('playlist-changed', self._on_playlist_changed)
+
+ self._album_playback = AlbumWidget(
+ player, self, AlbumWidget.Mode.PLAYBACK)
+ self._main_box.add(self._album_playback)
+
+ self._linear_playback = LinearPlaybackWindow(self._player)
+ self._main_box.add(self._linear_playback)
+
+ repeat_box = RepeatBox(self._player)
+ self._main_box.add(repeat_box)
+
+ @log
+ def _on_button_toggled(self, klass):
+ self.popup()
+
+ @log
+ def _set_title(self, title_suffix):
+ header = _("Playing")
+ self._headerbar.props.title = header + " " + title_suffix
+
+ @log
+ def _display_album_widget(self, source, param, item, count, error, data):
+ if not item:
+ return
+
+ self._album_playback.update(item)
+ self._set_title(utils.get_album_title(item))
+ self._linear_playback.hide()
+ self._album_playback.show()
+
+ @log
+ def _update_playlist_title(self, source, param, item, count, error, data):
+ if not item:
+ return
+ self._set_title(utils.get_media_title(item))
+
+ @log
+ def _update_linear_mode_title(self):
+ playlist_type = self._player.get_playlist_type()
+ if playlist_type == PlayerPlaylist.Type.PLAYLIST:
+ pl_id = self._player.get_playlist_id()
+ grilo.get_playlist_with_id(pl_id, self._update_playlist_title)
+ elif playlist_type == PlayerPlaylist.Type.ARTIST:
+ self._set_title(self._player.get_playlist_id())
+ else:
+ self._set_title(_("Songs"))
+
+ @log
+ def _on_playlist_changed(self, klass, data=None):
+ playlist_type = self._player.get_playlist_type()
+ linear_playlists = [
+ PlayerPlaylist.Type.ARTIST,
+ PlayerPlaylist.Type.PLAYLIST,
+ PlayerPlaylist.Type.SONGS]
+
+ if playlist_type == PlayerPlaylist.Type.ALBUM:
+ album_id = self._player.get_playlist_id()
+ grilo.get_album_with_id(album_id, self._display_album_widget)
+
+ elif playlist_type in linear_playlists:
+ self._album_playback.hide()
+ self._linear_playback.update()
+ self._update_linear_mode_title()
+ self._linear_playback.show()
+
+ else:
+ self._album_playback.hide()
+ self._linear_playback.hide()
diff --git a/gnomemusic/widgets/playertoolbar.py b/gnomemusic/widgets/playertoolbar.py
index 7c0b69ca..a4a2c0b9 100644
--- a/gnomemusic/widgets/playertoolbar.py
+++ b/gnomemusic/widgets/playertoolbar.py
@@ -30,6 +30,7 @@ from gnomemusic.albumartcache import Art
from gnomemusic.gstplayer import Playback
from gnomemusic.player import RepeatMode
from gnomemusic.widgets.coverstack import CoverStack # noqa: F401
+from gnomemusic.widgets.playbackpopover import PlaybackPopover
from gnomemusic.widgets.smoothscale import SmoothScale # noqa: F401
from gnomemusic.widgets.twolinetip import TwoLineTip
import gnomemusic.utils as utils
@@ -80,6 +81,9 @@ class PlayerToolbar(Gtk.ActionBar):
self._sync_repeat_image()
+ self._playback_popover = PlaybackPopover(
+ self._player, self._nowplaying_button)
+
self._player.connect('clock-tick', self._on_clock_tick)
self._player.connect('song-changed', self._update_view)
self._player.connect('prev-next-invalidated', self._sync_prev_next)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 15aaaf14..4c81c2a0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -35,6 +35,7 @@ gnomemusic/widgets/artistalbumwidget.py
gnomemusic/widgets/disclistboxwidget.py
gnomemusic/widgets/headerbar.py
gnomemusic/widgets/notificationspopup.py
+gnomemusic/widgets/playbackpopover.py
gnomemusic/widgets/playertoolbar.py
gnomemusic/widgets/playlistcontrols.py
gnomemusic/widgets/playlistdialog.py
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]