[gnome-music/wip/jfelder/new-album-design-v3: 4/4] albumwidget: Add an album menu




commit 3919cf7c0330ff72d77b2f6a01563064e64205ef
Author: Jean Felder <jfelder src gnome org>
Date:   Thu Jul 29 19:27:30 2021 +0200

    albumwidget: Add an album menu

 data/ui/AlbumWidget.ui            | 71 ++++++++++++++++++++++++++++++++-------
 gnomemusic/widgets/albumwidget.py | 51 +++++++++++++++++++++++++++-
 2 files changed, 108 insertions(+), 14 deletions(-)
---
diff --git a/data/ui/AlbumWidget.ui b/data/ui/AlbumWidget.ui
index 9c124a9be..af6daca1b 100644
--- a/data/ui/AlbumWidget.ui
+++ b/data/ui/AlbumWidget.ui
@@ -99,20 +99,44 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkButton" id="_play_button">
+                      <object class="GtkBox">
+                        <property name="orientation">horizontal</property>
                         <property name="visible">True</property>
-                        <property name="can-focus">True</property>
-                        <property name="receives-default">True</property>
-                        <property name="image">_play_image</property>
-                        <property name="always_show_image">True</property>
-                        <property name="tooltip-text" translatable="yes">Play</property>
-                        <property name="halign">start</property>
-                        <property name="valign">center</property>
-                        <property name="margin-top">12</property>
-                        <signal name="clicked" handler="_on_play_button_clicked" swapped="no"/>
-                        <style>
-                          <class name="circular"/>
-                        </style>
+                        <property name="spacing">12</property>
+                        <property name="margin-top">6</property>
+                        <child>
+                          <object class="GtkButton" id="_play_button">
+                            <property name="visible">True</property>
+                            <property name="can-focus">True</property>
+                            <property name="receives-default">True</property>
+                            <property name="image">_play_image</property>
+                            <property name="always_show_image">True</property>
+                            <property name="tooltip-text" translatable="yes">Play</property>
+                            <property name="valign">center</property>
+                            <signal name="clicked" handler="_on_play_button_clicked" swapped="no"/>
+                            <style>
+                              <class name="circular"/>
+                            </style>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuButton" id="_menu_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="halign">start</property>
+                            <property name="valign">center</property>
+                            <property name="focus_on_click">False</property>
+                            <property name="menu-model">album_menu</property>
+                            <property name="direction">none</property>
+                            <property name="use_popover">True</property>
+                            <property name="image">_view_more_image</property>
+                            <style>
+                              <class name="image-button"/>
+                              <class name="circular"/>
+                            </style>
+                          </object>
+                        </child>
                       </object>
                     </child>
                   </object>
@@ -132,6 +156,13 @@
       </object>
     </child>
   </template>
+  <object class="GtkImage" id="_view_more_image">
+    <property name="visible">True</property>
+    <property name="can_focus">False</property>
+    <property name="margin-top">1</property>
+    <property name="icon_name">view-more-symbolic</property>
+    <property name="icon_size">1</property>
+  </object>
   <object class="GtkImage" id="_play_image">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -139,4 +170,18 @@
     <property name="icon_name">media-playback-start-symbolic</property>
     <property name="icon_size">1</property>
   </object>
+  <menu id="album_menu">
+    <item>
+      <attribute name="label" translatable="yes">_Play</attribute>
+      <attribute name="action">album.play</attribute>
+    </item>
+    <item>
+      <attribute name="label" translatable="yes">Add to _Favorite Songs</attribute>
+      <attribute name="action">album.add_favorites</attribute>
+    </item>
+    <item>
+      <attribute name="label" translatable="yes">_Add to Playlist…</attribute>
+      <attribute name="action">album.add_playlist</attribute>
+    </item>
+  </menu>
 </interface>
diff --git a/gnomemusic/widgets/albumwidget.py b/gnomemusic/widgets/albumwidget.py
index 600729cbc..531054764 100644
--- a/gnomemusic/widgets/albumwidget.py
+++ b/gnomemusic/widgets/albumwidget.py
@@ -27,12 +27,13 @@ from gettext import ngettext
 from typing import Optional
 import typing
 
-from gi.repository import Gfm, GObject, Gtk
+from gi.repository import Gfm, Gio, GLib, GObject, Gtk
 
 from gnomemusic.corealbum import CoreAlbum
 from gnomemusic.utils import ArtSize
 from gnomemusic.widgets.disclistboxwidget import DiscBox
 from gnomemusic.widgets.disclistboxwidget import DiscListBox  # noqa: F401
+from gnomemusic.widgets.playlistdialog import PlaylistDialog
 if typing.TYPE_CHECKING:
     from gnomemusic.application import Application
     from gnomemusic.coredisc import CoreDisc
@@ -54,6 +55,7 @@ class AlbumWidget(Gtk.ScrolledWindow):
     _composer_label = Gtk.Template.Child()
     _art_stack = Gtk.Template.Child()
     _disc_list_box = Gtk.Template.Child()
+    _menu_button = Gtk.Template.Child()
     _play_button = Gtk.Template.Child()
     _released_label = Gtk.Template.Child()
     _title_label = Gtk.Template.Child()
@@ -84,6 +86,19 @@ class AlbumWidget(Gtk.ScrolledWindow):
 
         self.connect("notify::selection-mode", self._on_selection_mode_changed)
 
+        action_group = Gio.SimpleActionGroup()
+        actions = (
+            ("play", self._on_play_action),
+            ("add_favorites", self._on_add_favorites_action),
+            ("add_playlist", self._on_add_playlist_action)
+        )
+        for (name, callback) in actions:
+            action = Gio.SimpleAction.new(name, None)
+            action.connect("activate", callback)
+            action_group.add_action(action)
+
+        self.insert_action_group("album", action_group)
+
     @GObject.Property(
         type=CoreAlbum, default=None, flags=GObject.ParamFlags.READWRITE)
     def corealbum(self) -> Optional[CoreAlbum]:
@@ -156,6 +171,7 @@ class AlbumWidget(Gtk.ScrolledWindow):
 
         empty_album = (n_items == 0)
         self._play_button.props.sensitive = not empty_album
+        self._menu_button.props.sensitive = not empty_album
 
     def _set_composer_label(self, corealbum: CoreAlbum) -> None:
         composer = corealbum.props.composer
@@ -211,6 +227,39 @@ class AlbumWidget(Gtk.ScrolledWindow):
         if not self.props.selection_mode:
             self.deselect_all()
 
+    def _on_add_favorites_action(
+            self, action: Gio.SimpleAction,
+            data: Optional[GLib.Variant]) -> None:
+        if self._corealbum:
+            for coredisc in self._corealbum.props.model:
+                for coresong in coredisc.props.model:
+                    if not coresong.props.favorite:
+                        coresong.props.favorite = True
+
+    def _on_add_playlist_action(
+            self, action: Gio.SimpleAction,
+            data: Optional[GLib.Variant]) -> None:
+        if not self._corealbum:
+            return
+
+        playlist_dialog = PlaylistDialog(self._application)
+        active_window = self._application.props.active_window
+        playlist_dialog.props.transient_for = active_window
+        if playlist_dialog.run() == Gtk.ResponseType.ACCEPT:
+            playlist = playlist_dialog.props.selected_playlist
+            coresongs = [
+                song
+                for disc in self._corealbum.props.model
+                for song in disc.props.model]
+            playlist.add_songs(coresongs)
+
+        playlist_dialog.destroy()
+
+    def _on_play_action(
+            self, action: Gio.SimpleAction,
+            data: Optional[GLib.Variant]) -> None:
+        self._play()
+
     @Gtk.Template.Callback()
     def _on_play_button_clicked(self, button: Gtk.Button) -> None:
         self._play()


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