[gnome-music/wip/jfelder/expose-grilo-application-wide: 1/6] views: Update media favorite status in baseview



commit 1411d81729410daa9af6638d6608c3dd3ba4df56
Author: Jean Felder <jfelder src gnome org>
Date:   Fri May 3 23:41:14 2019 +0200

    views: Update media favorite status in baseview
    
    There are 4 differents views which allow to change the favorite status
    of a song:
    * AlbumsView via the AlbumWidget
    * SearchView
    * SongsView
    * PlaylistView
    
    AlbumWidget relies on SongWidget to handle the favorite change. The
    other views (SearchView, SongsView and PlaylistView) rely on
    StarHandlerWidget to handle the favorite change.
    
    The favorite change consists of 3 steps:
    * refresh the current view
    * update the tracker database
    * regenerate the static favorite playlist
    
    A fourth step is currently missing: reflect the change to the other
    views if necessary (#91).
    
    The first step depends on the widget (SongWidget and
    StarHandlerWidget) while the other two are common to all views. By
    introducing an update_favorite method into BaseView, it moves all the
    grilo logic into one place. Besides, it will also allow to easily
    refresh the other views when a song favorite status changes.
    
    The StarHandlerWidget changes are minimal because it has a direct
    access to its parent view.
    SongWidget however needs to propagate a "favorite-status-changed"
    signal up to the AlbumWidget.

 gnomemusic/views/baseview.py            | 13 +++++++++++++
 gnomemusic/widgets/albumwidget.py       |  6 ++++++
 gnomemusic/widgets/disclistboxwidget.py | 12 +++++++++++-
 gnomemusic/widgets/songwidget.py        | 12 ++++--------
 gnomemusic/widgets/starhandlerwidget.py |  7 +------
 5 files changed, 35 insertions(+), 15 deletions(-)
---
diff --git a/gnomemusic/views/baseview.py b/gnomemusic/views/baseview.py
index c1794c9b..f694d2e2 100644
--- a/gnomemusic/views/baseview.py
+++ b/gnomemusic/views/baseview.py
@@ -26,8 +26,11 @@ from gi.repository import GdkPixbuf, GObject, Gtk
 
 from gnomemusic import log
 from gnomemusic.grilo import grilo
+from gnomemusic.playlists import Playlists, StaticPlaylists
 from gnomemusic.widgets.starhandlerwidget import StarHandlerWidget
 
+playlists = Playlists.get_default()
+
 
 class BaseView(Gtk.Stack):
     """Base Class for all view classes"""
@@ -143,6 +146,16 @@ class BaseView(Gtk.Stack):
     def _on_item_activated(self, widget, id, path):
         pass
 
+    @log
+    def update_favorite(self, media):
+        """Toggles song favorite status.
+
+        Updates Favorites Playlist too.
+        :param Grl.Media media: song to update
+        """
+        grilo.toggle_favorite(media)
+        playlists.update_static_playlist(StaticPlaylists.Favorites)
+
     @log
     def get_selected_songs(self, callback):
         callback([])
diff --git a/gnomemusic/widgets/albumwidget.py b/gnomemusic/widgets/albumwidget.py
index f380ad2e..debb8c73 100644
--- a/gnomemusic/widgets/albumwidget.py
+++ b/gnomemusic/widgets/albumwidget.py
@@ -186,6 +186,8 @@ class AlbumWidget(Gtk.EventBox):
         disc_box.props.show_favorites = True
         disc_box.props.show_song_numbers = False
         disc_box.connect('song-activated', self._song_activated)
+        disc_box.connect(
+            'favorite-status-changed', self._favorite_status_changed)
 
         return disc_box
 
@@ -201,6 +203,10 @@ class AlbumWidget(Gtk.EventBox):
         self._player.play()
         return True
 
+    @log
+    def _favorite_status_changed(self, klass, media):
+        self._parent_view.update_favorite(media)
+
     @log
     def add_item(self, source, prefs, song, remaining, data=None):
         """Add a song to the item to album list.
diff --git a/gnomemusic/widgets/disclistboxwidget.py b/gnomemusic/widgets/disclistboxwidget.py
index 3faa32c7..f2017145 100644
--- a/gnomemusic/widgets/disclistboxwidget.py
+++ b/gnomemusic/widgets/disclistboxwidget.py
@@ -23,7 +23,7 @@
 # delete this exception statement from your version.
 
 from gettext import gettext as _
-from gi.repository import Gdk, GObject, Gtk
+from gi.repository import Gdk, GObject, Grl, Gtk
 
 from gnomemusic import log
 from gnomemusic.widgets.songwidget import SongWidget
@@ -95,6 +95,8 @@ class DiscBox(Gtk.Box):
     _disc_songs_flowbox = Gtk.Template.Child()
 
     __gsignals__ = {
+        'favorite-status-changed': (
+            GObject.SignalFlags.RUN_FIRST, None, (Grl.Media, )),
         'selection-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
         'song-activated': (GObject.SignalFlags.RUN_FIRST, None, (Gtk.Widget,))
     }
@@ -214,6 +216,8 @@ class DiscBox(Gtk.Box):
         song_widget.itr = itr
         song_widget.model = self._model
         song_widget.connect('button-release-event', self._song_activated)
+        song_widget.connect(
+            'favorite-status-changed', self._favorite_status_changed)
         song_widget.connect('selection-changed', self._on_selection_changed)
 
         self.bind_property(
@@ -231,6 +235,12 @@ class DiscBox(Gtk.Box):
 
         return song_widget
 
+    @log
+    def _favorite_status_changed(self, klass, media):
+        self.emit('favorite-status-changed', media)
+
+        return True
+
     @log
     def _on_selection_changed(self, widget):
         self.emit('selection-changed')
diff --git a/gnomemusic/widgets/songwidget.py b/gnomemusic/widgets/songwidget.py
index 4322f8a8..1aded656 100644
--- a/gnomemusic/widgets/songwidget.py
+++ b/gnomemusic/widgets/songwidget.py
@@ -26,13 +26,11 @@ from enum import IntEnum
 
 import gi
 gi.require_version('Dazzle', '1.0')
-from gi.repository import Gdk, GObject, Gtk
+from gi.repository import Gdk, GObject, Grl, Gtk
 from gi.repository.Dazzle import BoldingLabel  # noqa: F401
 
 from gnomemusic import log
 from gnomemusic import utils
-from gnomemusic.grilo import grilo
-from gnomemusic.playlists import Playlists, StaticPlaylists
 from gnomemusic.widgets.starimage import StarImage  # noqa: F401
 
 
@@ -52,6 +50,8 @@ class SongWidget(Gtk.EventBox):
     __gtype_name__ = 'SongWidget'
 
     __gsignals__ = {
+        'favorite-status-changed': (
+            GObject.SignalFlags.RUN_FIRST, None, (Grl.Media, )),
         'selection-changed': (GObject.SignalFlags.RUN_FIRST, None, ()),
     }
 
@@ -60,8 +60,6 @@ class SongWidget(Gtk.EventBox):
     show_favorite = GObject.Property(type=bool, default=True)
     show_song_number = GObject.Property(type=bool, default=True)
 
-    _playlists = Playlists.get_default()
-
     _select_button = Gtk.Template.Child()
     _number_label = Gtk.Template.Child()
     _title_label = Gtk.Template.Child()
@@ -141,9 +139,7 @@ class SongWidget(Gtk.EventBox):
         favorite = not self._star_image.favorite
         self._star_image.props.favorite = favorite
 
-        # TODO: Rework and stop updating widgets from here directly.
-        grilo.set_favorite(self._media, favorite)
-        self._playlists.update_static_playlist(StaticPlaylists.Favorites)
+        self.emit("favorite-status-changed", self._media)
 
         return True
 
diff --git a/gnomemusic/widgets/starhandlerwidget.py b/gnomemusic/widgets/starhandlerwidget.py
index 41c5c07f..ef9b8943 100644
--- a/gnomemusic/widgets/starhandlerwidget.py
+++ b/gnomemusic/widgets/starhandlerwidget.py
@@ -25,10 +25,6 @@
 from gi.repository import GObject, Gtk
 
 from gnomemusic import log
-from gnomemusic.grilo import grilo
-from gnomemusic.playlists import Playlists, StaticPlaylists
-
-playlists = Playlists.get_default()
 
 
 class CellRendererStar(Gtk.CellRendererPixbuf):
@@ -151,8 +147,7 @@ class StarHandlerWidget(object):
         new_value = not self._parent.model[_iter][self._star_index]
         self._parent.model[_iter][self._star_index] = new_value
         song_item = self._parent.model[_iter][5]
-        grilo.toggle_favorite(song_item)
-        playlists.update_static_playlist(StaticPlaylists.Favorites)
+        self._parent.update_favorite(song_item)
 
         # Use this flag to ignore the upcoming _on_item_activated call
         self.star_renderer_click = True


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