[gnome-music/wip/jfelder/expose-grilo-application-wide: 1/6] views: Update media favorite status in baseview
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/expose-grilo-application-wide: 1/6] views: Update media favorite status in baseview
- Date: Tue, 7 May 2019 15:41:41 +0000 (UTC)
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]