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



commit 54373a60d0a640046653e28dd148fdf11cfcc99d
Author: Jean Felder <jfelder src gnome org>
Date:   Tue Feb 26 23:29:03 2019 +0100

    search: Add state GObject Property
    
    This should help simplify search-mode interactions between the main
    views and the searchbar.

 gnomemusic/search.py            | 11 +++++++++++
 gnomemusic/views/searchview.py  | 20 +++++++++++++++-----
 gnomemusic/widgets/searchbar.py |  6 ++----
 gnomemusic/window.py            | 11 +++++------
 4 files changed, 33 insertions(+), 15 deletions(-)
---
diff --git a/gnomemusic/search.py b/gnomemusic/search.py
index 2c77646a..b93e8108 100644
--- a/gnomemusic/search.py
+++ b/gnomemusic/search.py
@@ -50,3 +50,14 @@ class Search(GObject.GObject):
     @log
     def __init__(self):
         super().__init__()
+        self._state = Search.State.NONE
+
+    @GObject.Property(type=int, default=State.NONE)
+    def state(self):
+        return self._state
+
+    @state.setter
+    def state(self, state):
+        self._state = state
+        none_state = (self._state == Search.State.NONE)
+        self.props.search_mode_enabled = not none_state
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index a088a515..0bfc6384 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -52,11 +52,20 @@ class SearchView(BaseView):
         return '<SearchView>'
 
     @log
-    def __init__(self, window, player):
+    def __init__(self, window, player, search):
+        """Initialize SearchView.
+
+        :param Window window: Window object
+        :param Player player: Player object
+        :param Search search: Search object
+        """
         super().__init__('search', None, window)
 
-        # FIXME: Searchbar handling does not belong here.
-        self._searchbar = window._searchbar
+        self._search = search
+        self.bind_property(
+            "search-state", self._search, "state",
+            GObject.BindingFlags.SYNC_CREATE)
+        self._previous_search_state = Search.State.NONE
 
         self._add_list_renderers()
         self.player = player
@@ -103,8 +112,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 +120,7 @@ class SearchView(BaseView):
                 self._window.views[View.ALBUM]._grid)
 
         self.set_visible_child(self._grid)
+        self.props.search_state = self._previous_search_state
         self._headerbar.props.state = HeaderBar.State.MAIN
 
     @log
@@ -141,6 +149,7 @@ class SearchView(BaseView):
             self._headerbar.props.title = title
             self._headerbar.props.subtitle = artist
             self.set_visible_child(self._album_widget)
+            self._previous_search_state = self.props.search_state
             self.props.search_state = Search.State.NONE
 
         elif self.model[_iter][12] == 'artist':
@@ -162,6 +171,7 @@ class SearchView(BaseView):
             self._headerbar.props.title = artist
             self._headerbar.props.subtitle = None
             self.set_visible_child(self._artist_albums_widget)
+            self._previous_search_state = self.props.search_state
             self.props.search_state = Search.State.NONE
         elif self.model[_iter][12] == 'song':
             if self.model[_iter][11] != ValidationStatus.FAILED:
diff --git a/gnomemusic/widgets/searchbar.py b/gnomemusic/widgets/searchbar.py
index b0930024..6ca5ba27 100644
--- a/gnomemusic/widgets/searchbar.py
+++ b/gnomemusic/widgets/searchbar.py
@@ -404,12 +404,10 @@ 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'
 
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index 183b22b4..90b2bb20 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-enabled", 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)
@@ -257,7 +259,7 @@ class Window(Gtk.ApplicationWindow):
         self.views[View.ARTIST] = ArtistsView(self, self._player)
         self.views[View.SONG] = SongsView(self, self._player)
         self.views[View.PLAYLIST] = PlaylistView(self, self._player)
-        self.views[View.SEARCH] = SearchView(self, self._player)
+        self.views[View.SEARCH] = SearchView(self, self._player, self._search)
 
         selectable_views = [View.ALBUM, View.ARTIST, View.SONG, View.SEARCH]
         for view in selectable_views:
@@ -276,9 +278,6 @@ 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')
-
     @log
     def _select_all(self, action=None, param=None):
         if not self.props.selection_mode:


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