[gnome-software] Switch to using GtkSearchBar



commit d479fe2e9e2bcd2e13813642f4d39010b9722b81
Author: Richard Hughes <richard hughsie com>
Date:   Thu Jun 2 13:01:00 2016 +0100

    Switch to using GtkSearchBar
    
    Fixes:
    https://bugzilla.gnome.org/show_bug.cgi?id=767143
    https://bugzilla.gnome.org/show_bug.cgi?id=767144
    https://bugzilla.gnome.org/show_bug.cgi?id=767146
    https://bugzilla.gnome.org/show_bug.cgi?id=767148

 src/gnome-software.ui   |   84 +++++--------------------------
 src/gs-shell-overview.c |   21 +++-----
 src/gs-shell.c          |  127 +++--------------------------------------------
 3 files changed, 27 insertions(+), 205 deletions(-)
---
diff --git a/src/gnome-software.ui b/src/gnome-software.ui
index 4207bd6..52755ee 100644
--- a/src/gnome-software.ui
+++ b/src/gnome-software.ui
@@ -250,82 +250,22 @@
         </child>
 
         <child>
-          <object class="GtkRevealer" id="search_bar">
+          <object class="GtkSearchBar" id="search_bar">
             <property name="visible">True</property>
-            <property name="transition-type">slide-up</property>
-
             <child>
-              <object class="GtkToolbar" id="search_bar_toolbar">
+              <object class="GtkSearchEntry" id="entry_search">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <style>
-                  <class name="search-bar"/>
-                </style>
-                <child>
-                  <object class="GtkToolItem" id="search_toolitem">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <child>
-                      <object class="GtkBox" id="search_toolbox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <child>
-                          <object class="GtkBox" id="box_left">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="hexpand">True</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkSearchEntry" id="entry_search">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="activates_default">True</property>
-                            <property name="width_request">500</property>
-                            <property name="hexpand">True</property>
-                            <property name="halign">center</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkBox" id="box_right">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="halign">start</property>
-                            <property name="hexpand">True</property>
-                            <property name="orientation">vertical</property>
-                            <child>
-                              <placeholder/>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">True</property>
-                            <property name="fill">True</property>
-                            <property name="position">2</property>
-                          </packing>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                  </packing>
-                </child>
+                <property name="can_focus">True</property>
+                <property name="activates_default">True</property>
+                <property name="width_request">500</property>
+                <property name="hexpand">True</property>
+                <property name="halign">center</property>
               </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
             </child>
           </object>
           <packing>
diff --git a/src/gs-shell-overview.c b/src/gs-shell-overview.c
index a200a4b..43f5716 100644
--- a/src/gs-shell-overview.c
+++ b/src/gs-shell-overview.c
@@ -497,10 +497,6 @@ gs_shell_overview_switch_to (GsPage *page, gboolean scroll_up)
 
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "buttonbox_main"));
        gtk_widget_show (widget);
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "search_bar"));
-       gtk_revealer_set_reveal_child (GTK_REVEALER (widget), FALSE);
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
-       gtk_entry_set_text (GTK_ENTRY (widget), "");
 
        /* hide the expander */
        gtk_revealer_set_transition_duration (GTK_REVEALER (priv->categories_expander), 0);
@@ -524,15 +520,14 @@ static void
 gs_shell_overview_search_button_cb (GtkButton *button, GsShellOverview *self)
 {
        GsShellOverviewPrivate *priv = gs_shell_overview_get_instance_private (self);
-       GtkToggleButton *search_button = GTK_TOGGLE_BUTTON (priv->search_button);
-       GtkRevealer *search_bar;
-       gboolean show_search;
-
-       show_search = gtk_toggle_button_get_active (search_button);
-
-       search_bar = GTK_REVEALER (gtk_builder_get_object (priv->builder,
-                                                          "search_bar"));
-       gtk_revealer_set_reveal_child (search_bar, show_search);
+       GtkSearchBar *search_bar;
+       GtkToggleButton *search_button;
+
+       search_button = GTK_TOGGLE_BUTTON (priv->search_button);
+       search_bar = GTK_SEARCH_BAR (gtk_builder_get_object (priv->builder,
+                                                            "search_bar"));
+       gtk_search_bar_set_search_mode (search_bar,
+                                       gtk_toggle_button_get_active (search_button));
 }
 
 static void
diff --git a/src/gs-shell.c b/src/gs-shell.c
index 382d11f..5c4595d 100644
--- a/src/gs-shell.c
+++ b/src/gs-shell.c
@@ -247,8 +247,12 @@ gs_shell_change_mode (GsShell *shell,
        gtk_widget_hide (widget);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "header_selection_menu_button"));
        gtk_widget_hide (widget);
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "search_bar"));
-       gtk_revealer_set_reveal_child (GTK_REVEALER (widget), FALSE);
+
+       /* hide unless we're going to search */
+       if (mode != GS_SHELL_MODE_SEARCH) {
+               widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "search_bar"));
+               gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (widget), FALSE);
+       }
 
        context = gtk_widget_get_style_context (GTK_WIDGET (gtk_builder_get_object (priv->builder, 
"header")));
        gtk_style_context_remove_class (context, "selection-mode");
@@ -419,125 +423,13 @@ initial_overview_load_done (GsShellOverview *shell_overview, gpointer data)
        g_signal_emit (shell, signals[SIGNAL_LOADED], 0);
 }
 
-static void
-gs_shell_search_activated_cb (GtkEntry *entry, GsShell *shell)
-{
-       GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-       const gchar *text;
-
-       text = gtk_entry_get_text (entry);
-       if (text[0] == '\0')
-               return;
-
-       if (gs_shell_get_mode (shell) == GS_SHELL_MODE_SEARCH) {
-               gs_shell_search_set_text (priv->shell_search, text);
-               gs_page_switch_to (GS_PAGE (priv->shell_search), TRUE);
-       } else {
-               gs_shell_change_mode (shell, GS_SHELL_MODE_SEARCH, NULL, NULL, TRUE);
-       }
-}
-
-static gboolean
-is_keynav_event (GdkEvent *event, guint keyval)
-{
-       GdkModifierType state = 0;
-
-       gdk_event_get_state (event, &state);
-
-       if (keyval == GDK_KEY_Tab ||
-           keyval == GDK_KEY_KP_Tab ||
-           keyval == GDK_KEY_Up ||
-           keyval == GDK_KEY_KP_Up ||
-           keyval == GDK_KEY_Down ||
-           keyval == GDK_KEY_KP_Down ||
-           keyval == GDK_KEY_Left ||
-           keyval == GDK_KEY_KP_Left ||
-           keyval == GDK_KEY_Right ||
-           keyval == GDK_KEY_KP_Right ||
-           keyval == GDK_KEY_Home ||
-           keyval == GDK_KEY_KP_Home ||
-           keyval == GDK_KEY_End ||
-           keyval == GDK_KEY_KP_End ||
-           keyval == GDK_KEY_Page_Up ||
-           keyval == GDK_KEY_KP_Page_Up ||
-           keyval == GDK_KEY_Page_Down ||
-           keyval == GDK_KEY_KP_Page_Down ||
-           ((state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) != 0))
-               return TRUE;
-
-       return FALSE;
-}
-
-static gboolean
-entry_keypress_handler (GtkWidget *widget, GdkEvent *event, GsShell *shell)
-{
-       GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-       guint keyval;
-       GtkWidget *entry;
-
-       if (!gdk_event_get_keyval (event, &keyval) ||
-           keyval != GDK_KEY_Escape)
-               return GDK_EVENT_PROPAGATE;
-
-       entry = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
-       gtk_entry_set_text (GTK_ENTRY (entry), "");
-
-       return GDK_EVENT_STOP;
-}
-
-static void
-preedit_changed_cb (GtkEntry *entry, GtkWidget *popup, gboolean *preedit_changed)
-{
-       *preedit_changed = TRUE;
-}
-
 static gboolean
 window_keypress_handler (GtkWidget *window, GdkEvent *event, GsShell *shell)
 {
        GsShellPrivate *priv = gs_shell_get_instance_private (shell);
-       GtkWidget *entry;
        GtkWidget *widget;
-       guint keyval;
-       gboolean handled;
-       gboolean preedit_changed;
-       guint preedit_change_id;
-       gboolean res;
-       g_autofree gchar *old_text = NULL;
-       g_autofree gchar *new_text = NULL;
-
-       if (gs_shell_get_mode (shell) != GS_SHELL_MODE_OVERVIEW &&
-           gs_shell_get_mode (shell) != GS_SHELL_MODE_SEARCH)
-               return GDK_EVENT_PROPAGATE;
-
-       if (!gdk_event_get_keyval (event, &keyval) ||
-           is_keynav_event (event, keyval) ||
-           keyval == GDK_KEY_space ||
-           keyval == GDK_KEY_Menu)
-               return GDK_EVENT_PROPAGATE;
-
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "search_bar"));
-       gtk_revealer_set_reveal_child (GTK_REVEALER (widget), TRUE);
-
-       entry = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
-
-       handled = GDK_EVENT_PROPAGATE;
-       preedit_changed = FALSE;
-       preedit_change_id = g_signal_connect (entry, "preedit-changed",
-                                             G_CALLBACK (preedit_changed_cb), &preedit_changed);
-
-       old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
-       res = gtk_widget_event (entry, event);
-       new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
-
-       g_signal_handler_disconnect (entry, preedit_change_id);
-
-       if ((res && g_strcmp0 (new_text, old_text) != 0) ||
-           preedit_changed) {
-               gtk_entry_grab_focus_without_selecting (GTK_ENTRY (entry));
-               handled = GDK_EVENT_STOP;
-       }
-
-       return handled;
+       return gtk_search_bar_handle_event (GTK_SEARCH_BAR (widget), event);
 }
 
 static void
@@ -813,14 +705,9 @@ gs_shell_setup (GsShell *shell, GsPluginLoader *plugin_loader, GCancellable *can
                                 priv->cancellable);
 
        /* set up search */
-       widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
-       g_signal_connect (GTK_EDITABLE (widget), "activate",
-                         G_CALLBACK (gs_shell_search_activated_cb), shell);
        g_signal_connect (priv->main_window, "key-press-event",
                          G_CALLBACK (window_keypress_handler), shell);
        widget = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search"));
-       g_signal_connect (widget, "key-press-event",
-                         G_CALLBACK (entry_keypress_handler), shell);
        g_signal_connect (widget, "search-changed",
                          G_CALLBACK (search_changed_handler), shell);
 


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