[gnome-music/wip/jfelder/search-selection-reset: 5/11] search: Add state GObject Property



commit 43e73ccd3b9b1cc590eaeecd5b05f99c4b877ddb
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  | 35 ++++++++++++++++++++++++++++-------
 gnomemusic/widgets/searchbar.py | 13 ++++---------
 gnomemusic/window.py            | 14 +++++++++-----
 4 files changed, 42 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..e0ff0c19 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,29 @@ 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):
+        """Get search mode status.
+
+        :returns: the search mode status
+        :rtype: bool
+        """
+        return self._search_mode_active
+
+    @search_mode_active.setter
+    def search_mode_active(self, value):
+        """Set search mode status.
+
+        :param bool mode: new search mode
+        """
+        # 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]