[gnome-music/wip/jfelder/search-selection-reset: 5/12] search: Add search-mode-enabled GObject property



commit f0320a1cb433a02b12d48b8968f15a03a2de847b
Author: Jean Felder <jfelder src gnome org>
Date:   Tue Feb 26 22:36:26 2019 +0100

    search: Add search-mode-enabled GObject property
    
    This should help simplify search-mode interactions between the main
    views and the searchbar.
    reveal and toggle method from Searchbar can be removed. The whole
    Searchbar visibility logic can be internally handled by listening to
    search-mode-enabled changes.

 gnomemusic/search.py            | 15 ++++++++++++++-
 gnomemusic/views/searchview.py  |  2 +-
 gnomemusic/widgets/headerbar.py | 11 ++++++++---
 gnomemusic/widgets/searchbar.py | 37 ++++++++++++++++++++-----------------
 gnomemusic/window.py            | 31 ++++++++++++++++---------------
 5 files changed, 59 insertions(+), 37 deletions(-)
---
diff --git a/gnomemusic/search.py b/gnomemusic/search.py
index 78000f76..2c77646a 100644
--- a/gnomemusic/search.py
+++ b/gnomemusic/search.py
@@ -24,8 +24,12 @@
 
 from enum import IntEnum
 
+from gi.repository import GObject
 
-class Search():
+from gnomemusic import log
+
+
+class Search(GObject.GObject):
 
     class State(IntEnum):
         """States the Search can have
@@ -37,3 +41,12 @@ class Search():
         NONE = 0
         RESULT = 1
         NO_RESULT = 2
+
+    search_mode_enabled = GObject.Property(type=bool, default=False)
+
+    def __repr__(self):
+        return "<Search>"
+
+    @log
+    def __init__(self):
+        super().__init__()
diff --git a/gnomemusic/views/searchview.py b/gnomemusic/views/searchview.py
index 010def73..a088a515 100644
--- a/gnomemusic/views/searchview.py
+++ b/gnomemusic/views/searchview.py
@@ -103,7 +103,7 @@ class SearchView(BaseView):
 
     @log
     def _back_button_clicked(self, widget, data=None):
-        self._searchbar.reveal(True, False)
+        self._searchbar.props.search_mode_enabled = True
 
         if self.get_visible_child() == self._artist_albums_widget:
             self._artist_albums_widget.destroy()
diff --git a/gnomemusic/widgets/headerbar.py b/gnomemusic/widgets/headerbar.py
index 3b362982..60d4df4c 100644
--- a/gnomemusic/widgets/headerbar.py
+++ b/gnomemusic/widgets/headerbar.py
@@ -98,7 +98,6 @@ class HeaderBar(Gtk.HeaderBar):
     _back_button = Gtk.Template.Child()
     _menu_button = Gtk.Template.Child()
 
-    search_mode_enabled = GObject.Property(type=bool, default=False)
     selected_items_count = GObject.Property(type=int, default=0, minimum=0)
     selection_mode_allowed = GObject.Property(type=bool, default=True)
     stack = GObject.Property(type=Gtk.Stack)
@@ -107,7 +106,11 @@ class HeaderBar(Gtk.HeaderBar):
         return "<HeaderBar>"
 
     @log
-    def __init__(self):
+    def __init__(self, search):
+        """Initialize the headerbar
+
+        :param Search search: Search object
+        """
         super().__init__()
 
         self._selection_mode = False
@@ -139,7 +142,9 @@ class HeaderBar(Gtk.HeaderBar):
         self.bind_property(
             "selected-items-count", self._selection_menu,
             "selected-items-count")
-        self.bind_property(
+
+        self._search = search
+        self._search.bind_property(
             "search-mode-enabled", self._search_button, "active",
             GObject.BindingFlags.BIDIRECTIONAL
             | GObject.BindingFlags.SYNC_CREATE)
diff --git a/gnomemusic/widgets/searchbar.py b/gnomemusic/widgets/searchbar.py
index 87b2490b..17ce4486 100644
--- a/gnomemusic/widgets/searchbar.py
+++ b/gnomemusic/widgets/searchbar.py
@@ -337,14 +337,26 @@ class Searchbar(Gtk.SearchBar):
         return '<Searchbar>'
 
     @log
-    def __init__(self):
-        """Initialize the Searchbar"""
+    def __init__(self, search):
+        """Initialize the Searchbar
+
+        :param Search search: Search object
+        """
         super().__init__()
 
         self._timeout = None
 
         self._dropdown = DropDown()
         self._dropdown.initialize_filters(self)
+
+        self._search = search
+        self._search.bind_property(
+            "search-mode-enabled", self, "search-mode-enabled",
+            GObject.BindingFlags.BIDIRECTIONAL
+            | GObject.BindingFlags.SYNC_CREATE)
+        self.connect(
+            "notify::search-mode-enabled", self._search_mode_changed)
+
         self.connect('notify::search-state', self._search_state_changed)
 
     @Gtk.Template.Callback()
@@ -390,18 +402,9 @@ class Searchbar(Gtk.SearchBar):
         return False
 
     @log
-    def reveal(self, show, clear=True):
-        """Hides or reveals the searchbar
-
-        :param bool show: Whether to show the searchbar
-        :param bool clear: Whether to clear the search entry
-        """
-        self.props.search_mode_enabled = show
-
-        if show:
+    def _search_mode_changed(self, klass, data):
+        if self.props.search_mode_enabled:
             self._search_entry.realize()
-            if clear:
-                self._search_entry.set_text('')
             self._search_entry.grab_focus()
         else:
             self._drop_down_button.set_active(False)
@@ -411,7 +414,7 @@ class Searchbar(Gtk.SearchBar):
         search_state = self.props.search_state
 
         if search_state == Search.State.NONE:
-            self.reveal(False)
+            self.props.search_mode_enabled = False
         elif search_state == Search.State.NO_RESULT:
             self._set_error_style(True)
             self.props.stack.props.visible_child_name = 'emptyview'
@@ -432,6 +435,6 @@ class Searchbar(Gtk.SearchBar):
             style_context.remove_class('error')
 
     @log
-    def toggle(self):
-        """Toggle the searchbar showing"""
-        self.reveal(not self.get_search_mode())
+    def clear(self):
+        """Clear the searchbar."""
+        self._search_entry.props.text = ""
diff --git a/gnomemusic/window.py b/gnomemusic/window.py
index 5f0cbd42..a941e0ad 100644
--- a/gnomemusic/window.py
+++ b/gnomemusic/window.py
@@ -36,6 +36,7 @@ from gnomemusic import log
 from gnomemusic.mediakeys import MediaKeys
 from gnomemusic.player import Player, RepeatMode
 from gnomemusic.query import Query
+from gnomemusic.search import Search
 from gnomemusic.utils import View
 from gnomemusic.views.albumsview import AlbumsView
 from gnomemusic.views.artistsview import ArtistsView
@@ -118,8 +119,9 @@ class Window(Gtk.ApplicationWindow):
     @log
     def _setup_view(self):
         self._box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
-        self._headerbar = HeaderBar()
-        self._searchbar = Searchbar()
+        self._search = Search()
+        self._headerbar = HeaderBar(self._search)
+        self._searchbar = Searchbar(self._search)
         self._player = Player(self)
         self._player_toolbar = PlayerToolbar(self._player, self)
         selection_toolbar = SelectionToolbar()
@@ -131,10 +133,6 @@ class Window(Gtk.ApplicationWindow):
             visible=True,
             can_focus=False)
 
-        self._headerbar.bind_property(
-            "search-mode-enabled", self._searchbar, "search-mode-enabled",
-            GObject.BindingFlags.BIDIRECTIONAL |
-            GObject.BindingFlags.SYNC_CREATE)
         self._searchbar.props.stack = self._stack
         self._headerbar.connect(
             'back-button-clicked', self._switch_back_from_childview)
@@ -311,7 +309,8 @@ class Window(Gtk.ApplicationWindow):
             if (keyval == Gdk.KEY_f
                     and not self.views[View.PLAYLIST].rename_active
                     and self._headerbar.props.state != HeaderBar.State.SEARCH):
-                self._searchbar.toggle()
+                search_mode = self._search.props.search_mode_enabled
+                self._search.props.search_mode_enabled = not search_mode
             # Play / Pause on Ctrl + SPACE
             if keyval == Gdk.KEY_space:
                 self._player.play_pause()
@@ -382,8 +381,8 @@ class Window(Gtk.ApplicationWindow):
             if keyval == Gdk.KEY_Escape:
                 if self.props.selection_mode:
                     self.props.selection_mode = False
-                else:
-                    self._searchbar.reveal(False)
+                elif self._search.props.search_mode_enabled:
+                    self._search.props.search_mode_enabled = False
 
         # Open the search bar when typing printable chars.
         key_unic = Gdk.keyval_to_unicode(keyval)
@@ -394,7 +393,7 @@ class Window(Gtk.ApplicationWindow):
                      or modifiers == 0)
                 and not self.views[View.PLAYLIST].rename_active
                 and self._headerbar.props.state != HeaderBar.State.SEARCH):
-            self._searchbar.reveal(True)
+            self._search.props.search_mode_enabled = True
 
     @log
     def _on_back_button_pressed(self, gesture, n_press, x, y):
@@ -411,9 +410,11 @@ class Window(Gtk.ApplicationWindow):
         self.prev_view = self.curr_view
         self.curr_view = stack.get_visible_child()
 
-        if (self.curr_view != self.views[View.SEARCH]
-                and self.curr_view != self.views[View.EMPTY]):
-            self._searchbar.reveal(False)
+        # Disable search mode when switching view
+        search_views = [self.views[View.EMPTY], self.views[View.SEARCH]]
+        if (self.curr_view not in search_views
+                and self._search.props.search_mode_enabled is True):
+            self._search.props.search_mode_enabled = False
 
         # Disable the selection button for the EmptySearch and Playlist
         # view
@@ -443,8 +444,6 @@ class Window(Gtk.ApplicationWindow):
 
     @log
     def _on_search_toggled(self, button, data=None):
-        self._searchbar.reveal(
-            button.get_active(), self.curr_view != self.views[View.SEARCH])
         if (not button.get_active()
                 and (self.curr_view == self.views[View.SEARCH]
                     or self.curr_view == self.views[View.EMPTY])):
@@ -453,10 +452,12 @@ 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]