[gnome-music/wip/jfelder/search-selection-reset: 3/9] search: Add state GObject Property
- From: Jean Felder <jfelder src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-music/wip/jfelder/search-selection-reset: 3/9] search: Add state GObject Property
- Date: Tue, 2 Apr 2019 21:40:58 +0000 (UTC)
commit 2bbc4ea5daf3385d3f7fd80999d4bac503f01be6
Author: Jean Felder <jfelder src gnome org>
Date: Tue Feb 26 23:29:03 2019 +0100
search: Add state GObject Property
Also, Introduce a search_mode_active GObject property in
SearchView. This allows to remove an ambiguity when SearchView is
visible.
On one hand, when accessing a child view from SearchView, the
searchbar becomes invisible (search_mode_active is False) but the
search State is unchanged to prevent the searchbar from being
cleared.
On the other hand, when leaving SearchView, the searchbar
becomes invisible and search State needs to be reset (None) to clear
the searchbar and restore the previous view before the search. This
operation takes place in search_mode_active setter which propagates to
Search and then the main window.
These changes should help simplify search-mode interactions
between the main views and the searchbar.
gnomemusic/search.py | 1 +
gnomemusic/views/searchview.py | 26 +++++++++++++++++++-------
gnomemusic/widgets/searchbar.py | 13 ++++---------
gnomemusic/window.py | 14 +++++++++-----
4 files changed, 33 insertions(+), 21 deletions(-)
---
diff --git a/gnomemusic/search.py b/gnomemusic/search.py
index d25e3528..2428f0e3 100644
--- a/gnomemusic/search.py
+++ b/gnomemusic/search.py
@@ -43,6 +43,7 @@ class Search(GObject.GObject):
NO_RESULT = 2
search_mode_active = GObject.Property(type=bool, default=False)
+ state = GObject.Property(type=int, default=0)
def __repr__(self):
return "<Search>"
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index a088a515..f2c0bd42 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -55,9 +55,6 @@ class SearchView(BaseView):
def __init__(self, window, player):
super().__init__('search', None, window)
- # FIXME: Searchbar handling does not belong here.
- self._searchbar = window._searchbar
-
self._add_list_renderers()
self.player = player
self._head_iters = [None, None, None, None]
@@ -81,6 +78,8 @@ class SearchView(BaseView):
self._items_found = None
+ self._search_mode_active = False
+
@log
def _setup_view(self):
view_container = Gtk.ScrolledWindow(hexpand=True, vexpand=True)
@@ -103,8 +102,6 @@ class SearchView(BaseView):
@log
def _back_button_clicked(self, widget, data=None):
- self._searchbar.props.search_mode_enabled = True
-
if self.get_visible_child() == self._artist_albums_widget:
self._artist_albums_widget.destroy()
self._artist_albums_widget = None
@@ -113,6 +110,7 @@ class SearchView(BaseView):
self._window.views[View.ALBUM]._grid)
self.set_visible_child(self._grid)
+ self.props.search_mode_active = True
self._headerbar.props.state = HeaderBar.State.MAIN
@log
@@ -141,7 +139,7 @@ class SearchView(BaseView):
self._headerbar.props.title = title
self._headerbar.props.subtitle = artist
self.set_visible_child(self._album_widget)
- self.props.search_state = Search.State.NONE
+ self.props.search_mode_active = False
elif self.model[_iter][12] == 'artist':
artist = self.model[_iter][2]
@@ -162,7 +160,7 @@ class SearchView(BaseView):
self._headerbar.props.title = artist
self._headerbar.props.subtitle = None
self.set_visible_child(self._artist_albums_widget)
- self.props.search_state = Search.State.NONE
+ self.props.search_mode_active = False
elif self.model[_iter][12] == 'song':
if self.model[_iter][11] != ValidationStatus.FAILED:
c_iter = self._songs_model.convert_child_iter_to_iter(_iter)[1]
@@ -214,6 +212,20 @@ class SearchView(BaseView):
cells[4].props.visible = self.props.selection_mode
col.queue_resize()
+ @GObject.Property(type=bool, default=False)
+ def search_mode_active(self):
+ return self._search_mode_active
+
+ @search_mode_active.setter
+ def search_mode_active(self, value):
+ # FIXME: search_mode_active should not change search_state.
+ # This is necessary because Search state cannot interact with
+ # the child views.
+ self._search_mode_active = value
+ if (not self._search_mode_active
+ and self.get_visible_child() == self._grid):
+ self.props.search_state = Search.State.NONE
+
@log
def _add_search_item(self, source, param, item, remaining=0, data=None):
if not item:
diff --git a/gnomemusic/widgets/searchbar.py b/gnomemusic/widgets/searchbar.py
index b0930024..c82a88e7 100644
--- a/gnomemusic/widgets/searchbar.py
+++ b/gnomemusic/widgets/searchbar.py
@@ -404,14 +404,14 @@ class Searchbar(Gtk.SearchBar):
def _search_state_changed(self, klass, data):
search_state = self.props.search_state
- if search_state == Search.State.NONE:
- self.props.search_mode_enabled = False
- elif search_state == Search.State.NO_RESULT:
+ if search_state == Search.State.NO_RESULT:
self._set_error_style(True)
self.props.stack.props.visible_child_name = 'emptyview'
- else:
+ elif search_state == Search.State.RESULT:
self._set_error_style(False)
self.props.stack.props.visible_child_name = 'search'
+ elif search_state == Search.State.NONE:
+ self._search_entry.props.text = ""
@log
def _set_error_style(self, error):
@@ -424,8 +424,3 @@ class Searchbar(Gtk.SearchBar):
style_context.add_class('error')
else:
style_context.remove_class('error')
-
- @log
- def clear(self):
- """Clear the searchbar."""
- self._search_entry.props.text = ""
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index 8996c38f..598fc7b0 100644
--- a/gnomemusic/window.py
+++ b/gnomemusic/window.py
@@ -129,8 +129,10 @@ class Window(Gtk.ApplicationWindow):
| GObject.BindingFlags.SYNC_CREATE)
self._search.bind_property(
"search-mode-active", self._searchbar, "search-mode-enabled",
- GObject.BindingFlags.BIDIRECTIONAL
- | GObject.BindingFlags.SYNC_CREATE)
+ GObject.BindingFlags.SYNC_CREATE)
+ self._search.bind_property(
+ "state", self._searchbar, "search-state",
+ GObject.BindingFlags.SYNC_CREATE)
self._player = Player(self)
self._player_toolbar = PlayerToolbar(self._player, self)
@@ -277,7 +279,11 @@ class Window(Gtk.ApplicationWindow):
self._stack.set_visible_child(self.views[View.ALBUM])
self.views[View.SEARCH].bind_property(
- 'search-state', self._searchbar, 'search-state')
+ "search-state", self._search, "state",
+ GObject.BindingFlags.SYNC_CREATE)
+ self._search.bind_property(
+ "search-mode-active", self.views[View.SEARCH],
+ "search-mode-active", GObject.BindingFlags.BIDIRECTIONAL)
@log
def _select_all(self, action=None, param=None):
@@ -462,12 +468,10 @@ class Window(Gtk.ApplicationWindow):
# We should get back to the view before the search
self._stack.set_visible_child(
self.views[View.SEARCH].previous_view)
- self._searchbar.clear()
elif (self.views[View.SEARCH].previous_view == self.views[View.ALBUM]
and child != self.curr_view._album_widget
and child != self.curr_view._artist_albums_widget):
self._stack.set_visible_child(self.views[View.ALBUM])
- self._searchbar.clear()
if self.props.selection_mode:
self.props.selection_mode = False
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]