[gnome-music/wip/mschraal/searchview-selection-fixes-3-34: 3/4] window: Move selection handling to views
- From: Marinus Schraal <mschraal src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/mschraal/searchview-selection-fixes-3-34: 3/4] window: Move selection handling to views
- Date: Thu, 13 Feb 2020 14:50:08 +0000 (UTC)
commit 34e6caa09f9a31dc9151fb66a504f5b7b83f77c4
Author: Marinus Schraal <mschraal gnome org>
Date: Tue Feb 11 15:41:58 2020 +0100
window: Move selection handling to views
The select all/none actions of views with children (AlbumsView &
SearchView) was previously handled in Window. As SearchView became more
complicated this is no longer feasible.
Instead let AlbumsView and SearchView pass the given actions to their
active child if active.
Closes: #364
gnomemusic/views/albumsview.py | 14 ++++++----
gnomemusic/views/searchview.py | 61 ++++++++++++++++++++++++++++++++----------
gnomemusic/window.py | 14 +++-------
3 files changed, 59 insertions(+), 30 deletions(-)
---
diff --git a/gnomemusic/views/albumsview.py b/gnomemusic/views/albumsview.py
index ce1dc37d..3a8148b9 100644
--- a/gnomemusic/views/albumsview.py
+++ b/gnomemusic/views/albumsview.py
@@ -199,13 +199,17 @@ class AlbumsView(Gtk.Stack):
self._headerbar.props.subtitle = corealbum.props.artist
def _toggle_all_selection(self, selected):
- """
- Selects or unselects all items without sending the notify::active
- signal for performance purposes.
+ """Selects or deselects all items.
"""
with self._window._app.props.coreselection.freeze_notify():
- for child in self._flowbox.get_children():
- child.props.selected = selected
+ if self.get_visible_child() == self._album_widget:
+ if selected is True:
+ self._album_widget.select_all()
+ else:
+ self._album_widget.select_none()
+ else:
+ for child in self._flowbox.get_children():
+ child.props.selected = selected
def select_all(self):
self._toggle_all_selection(True)
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index 0e12f410..1e7f823b 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -22,7 +22,9 @@
# 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 enum import IntEnum
from gettext import gettext as _
+
from gi.repository import Gdk, GObject, Gtk
from gnomemusic import log
@@ -45,9 +47,19 @@ class SearchView(Gtk.Stack):
__gtype_name__ = "SearchView"
+ class State(IntEnum):
+ """The different states of SearchView
+ """
+ MAIN = 0
+ ALL_ALBUMS = 1
+ ALL_ARTISTS = 2
+ ALBUM = 3
+ ARTIST = 4
+
search_state = GObject.Property(type=int, default=Search.State.NONE)
selected_items_count = GObject.Property(type=int, default=0, minimum=0)
selection_mode = GObject.Property(type=bool, default=False)
+ state = GObject.Property(type=int, default=State.MAIN)
_album_header = Gtk.Template.Child()
_album_flowbox = Gtk.Template.Child()
@@ -324,6 +336,7 @@ class SearchView(Gtk.Stack):
# Update and display the album widget if not in selection mode
self._album_widget.update(corealbum)
+ self.props.state = SearchView.State.ALBUM
self._headerbar.props.state = HeaderBar.State.SEARCH
self._headerbar.props.title = corealbum.props.title
self._headerbar.props.subtitle = corealbum.props.artist
@@ -352,6 +365,7 @@ class SearchView(Gtk.Stack):
"selection-mode", artist_albums_widget, "selection-mode",
GObject.BindingFlags.BIDIRECTIONAL)
+ self.props.state = SearchView.State.ARTIST
self._headerbar.props.state = HeaderBar.State.SEARCH
self._headerbar.props.title = coreartist.props.artist
self._headerbar.props.subtitle = None
@@ -361,6 +375,7 @@ class SearchView(Gtk.Stack):
@Gtk.Template.Callback()
def _on_all_artists_clicked(self, widget, event, user_data=None):
+ self.props.state = SearchView.State.ALL_ARTISTS
self._headerbar.props.state = HeaderBar.State.SEARCH
self._headerbar.props.title = _("Artists Results")
self._headerbar.props.subtitle = None
@@ -375,6 +390,7 @@ class SearchView(Gtk.Stack):
@Gtk.Template.Callback()
def _on_all_albums_clicked(self, widget, event, user_data=None):
+ self.props.state = SearchView.State.ALL_ALBUMS
self._headerbar.props.state = HeaderBar.State.SEARCH
self._headerbar.props.title = _("Albums Results")
self._headerbar.props.subtitle = None
@@ -388,20 +404,36 @@ class SearchView(Gtk.Stack):
self.props.search_mode_active = False
def _select_all(self, value):
- with self._model.freeze_notify():
- def song_select(child):
- song_widget = child.get_child()
- song_widget.props.selected = value
-
- def album_select(child):
- child.props.selected = value
-
- def artist_select(child):
- child.props.selected = value
-
- self._songs_listbox.foreach(song_select)
- self._album_flowbox.foreach(album_select)
- self._artist_flowbox.foreach(artist_select)
+ def child_select(child):
+ child.props.selected = value
+
+ if self.props.state == SearchView.State.MAIN:
+ with self._model.freeze_notify():
+ def song_select(child):
+ song_widget = child.get_child()
+ song_widget.props.coresong.props.selected = value
+
+ self._songs_listbox.foreach(song_select)
+ self._album_flowbox.foreach(child_select)
+ self._artist_flowbox.foreach(child_select)
+ elif self.props.state == SearchView.State.ALL_ALBUMS:
+ with self._model.freeze_notify():
+ self._album_all_flowbox.foreach(child_select)
+ elif self.props.state == SearchView.State.ALL_ARTISTS:
+ with self._model.freeze_notify():
+ self._artist_all_flowbox.foreach(child_select)
+ elif self.props.state == SearchView.State.ALBUM:
+ view = self.get_visible_child()
+ if value is True:
+ view.select_all()
+ else:
+ view.select_none()
+ elif self.props.state == SearchView.State.ARTIST:
+ view = self.get_visible_child().get_child().get_child()
+ if value is True:
+ view.select_all()
+ else:
+ view.select_none()
def select_all(self):
self._select_all(True)
@@ -420,6 +452,7 @@ class SearchView(Gtk.Stack):
self.set_visible_child(self._search_results)
self.props.search_mode_active = True
+ self.props.state = SearchView.State.MAIN
self._headerbar.props.state = HeaderBar.State.MAIN
@log
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index b6c7525f..87c17257 100644
--- a/gnomemusic/window.py
+++ b/gnomemusic/window.py
@@ -305,23 +305,15 @@ class Window(Gtk.ApplicationWindow):
def _select_all(self, action=None, param=None):
if not self.props.selection_mode:
return
- if self._headerbar.props.state == HeaderBar.State.MAIN:
- view = self.props.active_view
- else:
- view = self.props.active_view.get_visible_child()
- view.select_all()
+ self.props.active_view.select_all()
@log
def _select_none(self, action=None, param=None):
if not self.props.selection_mode:
return
- if self._headerbar.props.state == HeaderBar.State.MAIN:
- view = self.props.active_view
- view.unselect_all()
- else:
- view = self.props.active_view.get_visible_child()
- view.select_none()
+
+ self.props.active_view.unselect_all()
@log
def _on_key_press(self, widget, event):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]