[gnome-music/wip/jfelder/playback-status-v4: 1/2] playbackpopover: Introduce PlaybackPopover




commit d70fbc13ae64b0d03868a8ee6e7d2425ff7f3472
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. It 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/widgets/playbackpopover.py | 101 +++++++++++++++++++++++++++++++++-
 gnomemusic/widgets/playertoolbar.py   |   5 ++
 po/POTFILES.in                        |   1 +
 5 files changed, 129 insertions(+), 1 deletion(-)
---
diff --git a/data/org.gnome.Music.gresource.xml b/data/org.gnome.Music.gresource.xml
index 04ffc19f7..8e55b224f 100644
--- a/data/org.gnome.Music.gresource.xml
+++ b/data/org.gnome.Music.gresource.xml
@@ -22,6 +22,7 @@
     <file preprocess="xml-stripblanks">ui/LinearPlaybackWidget.ui</file>
     <file preprocess="xml-stripblanks">ui/LoadingNotification.ui</file>
     <file preprocess="xml-stripblanks">ui/NotificationsPopup.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 000000000..75aca461b
--- /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/widgets/playbackpopover.py b/gnomemusic/widgets/playbackpopover.py
index 9b68b2905..c51a58730 100644
--- a/gnomemusic/widgets/playbackpopover.py
+++ b/gnomemusic/widgets/playbackpopover.py
@@ -23,11 +23,19 @@
 # delete this exception statement from your version.
 
 from __future__ import annotations
+from typing import Optional
 import typing
 
-from gi.repository import Gfm, Gtk
+from enum import IntEnum
+from gettext import gettext as _
 
+from gi.repository import Gfm, GObject, Gtk
+
+from gnomemusic.coreartist import CoreArtist
+from gnomemusic.player import PlayerPlaylist
 from gnomemusic.utils import SongState
+from gnomemusic.widgets.albumwidget import AlbumWidget
+from gnomemusic.widgets.repeatbox import RepeatBox
 from gnomemusic.widgets.twolinewidget import TwoLineWidget
 if typing.TYPE_CHECKING:
     from gnomemusic.application import Application
@@ -84,3 +92,94 @@ class LinearPlaybackWidget(Gtk.ScrolledWindow):
         self._player.play(coresong)
         current_coresong.props.state = SongState.PLAYED
         coresong.props.state = SongState.PLAYING
+
+
+@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"
+
+    _headerbar = Gtk.Template.Child()
+    _main_box = Gtk.Template.Child()
+
+    class Mode(IntEnum):
+        """Playback mode"""
+        LINEAR = 0
+        ALBUM = 1
+
+    def __init__(self, application):
+        """Instantiate LinearPlaybackWidget
+
+        :param Application application: Application object
+        """
+        super().__init__()
+
+        self._coremodel: CoreModel = application.props.coremodel
+        self._coremodel.connect("playlist-loaded", self._on_playlist_changed)
+
+        player: Player = application.props.player
+        self._album_wiget: AlbumWidget = AlbumWidget(
+            application, AlbumWidget.Mode.PLAYBACK)
+        self._main_box.add(self._album_wiget)
+
+        self._linear_playback: LinearPlaybackWidget = LinearPlaybackWidget(
+            application)
+        self._main_box.add(self._linear_playback)
+
+        repeat_box: RepeatBox = RepeatBox(player)
+        self._main_box.add(repeat_box)
+
+        self._playlist_type: Optional[PlayerPlaylist.Type] = None
+        self._mode: PlaybackPopover.Mode = PlaybackPopover.Mode.LINEAR
+        self._set_linear_mode()
+
+    @GObject.Property(type=int, default=0, minimum=0, maximum=1)
+    def mode(self) -> PlaybackPopover.Mode:
+        """Get the playback mode
+
+        :returns: The view state
+        :rtype: int
+        """
+        return self._mode
+
+    @mode.setter  # type: ignore
+    def mode(self, value: PlaybackPopover.Mode) -> None:
+        """Set the playback mode
+
+        :param int value: new playback mode
+        """
+        self._mode = value
+        if self._mode == PlaybackPopover.Mode.LINEAR:
+            self._set_linear_mode()
+        elif self._mode == PlaybackPopover.Mode.ALBUM:
+            self._set_album_mode()
+
+    def _set_linear_mode(self) -> None:
+        self._album_wiget.hide()
+        self._linear_playback.show()
+
+    def _set_album_mode(self) -> None:
+        self._linear_playback.hide()
+        self._album_wiget.update(self._coremodel.props.active_core_object)
+        self._album_wiget.show()
+
+    def _on_playlist_changed(
+            self, coremodel: CoreModel,
+            playlist_type: PlayerPlaylist.Type) -> None:
+        self._playlist_type = playlist_type
+        if playlist_type == PlayerPlaylist.Type.ALBUM:
+            self.props.mode = PlaybackPopover.Mode.ALBUM
+        else:
+            self.props.mode = PlaybackPopover.Mode.LINEAR
+
+        core_object: GObject.GObject = self._coremodel.props.active_core_object
+        if isinstance(core_object, CoreSong):
+            pl_title: str = _("Songs")
+        elif isinstance(core_object, CoreArtist):
+            pl_title = core_object.props.artist
+        else:
+            pl_title = core_object.props.title
+
+        title: str = _("Playing {}".format(pl_title))
+        self._headerbar.props.title = title
diff --git a/gnomemusic/widgets/playertoolbar.py b/gnomemusic/widgets/playertoolbar.py
index 16f7ac319..1a665702b 100644
--- a/gnomemusic/widgets/playertoolbar.py
+++ b/gnomemusic/widgets/playertoolbar.py
@@ -28,6 +28,7 @@ from gi.repository import GObject, Gtk
 from gnomemusic.gstplayer import Playback
 from gnomemusic.utils import ArtSize
 from gnomemusic.player import Player, RepeatMode
+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
@@ -97,6 +98,10 @@ class PlayerToolbar(Gtk.ActionBar):
         self._player = player
         self._progress_scale.props.player = self._player
 
+        # FIXME
+        self._playback_popover = PlaybackPopover(
+            self._player._app, self._nowplaying_button)
+
         self._player.connect('song-changed', self._update_view)
         self._player.connect(
             'notify::repeat-mode', self._on_repeat_mode_changed)
diff --git a/po/POTFILES.in b/po/POTFILES.in
index c88c5b2cc..b7b0f2a9e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -38,6 +38,7 @@ gnomemusic/widgets/disclistboxwidget.py
 gnomemusic/widgets/headerbar.py
 gnomemusic/widgets/lastfmdialog.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]