[epiphany] Added search to cookies dialog



commit b93f4d74c4c7366b131e0125907963d936a8b5ac
Author: Robert Roth <robert roth off gmail com>
Date:   Tue Sep 29 05:26:09 2015 +0300

    Added search to cookies dialog
    
    https://bugzilla.gnome.org/show_bug.cgi?id=720978

 src/cookies-dialog.c            |   72 +++++++++++++++++
 src/resources/cookies-dialog.ui |  163 ++++++++++++++++++++++++++------------
 2 files changed, 183 insertions(+), 52 deletions(-)
---
diff --git a/src/cookies-dialog.c b/src/cookies-dialog.c
index 9f2a395..2b5b4e0 100644
--- a/src/cookies-dialog.c
+++ b/src/cookies-dialog.c
@@ -43,11 +43,15 @@ struct CookiesDialogPrivate
 {
        GtkWidget *cookies_treeview;
        GtkWidget *liststore;
+       GtkWidget *treemodelfilter;
+       GtkWidget *treemodelsort;
        GtkWidget *remove_toolbutton;
        GtkWidget *clear_button;
 
        WebKitCookieManager *cookie_manager;
        gboolean filled;
+
+       char *search_text;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (CookiesDialog, cookies_dialog, GTK_TYPE_DIALOG)
@@ -85,6 +89,17 @@ cookies_dialog_dispose (GObject *object)
 }
 
 static void
+cookies_dialog_finalize (GObject *object)
+{
+       CookiesDialogPrivate *priv;
+
+       priv = EPHY_COOKIES_DIALOG (object)->priv;
+
+       g_free (priv->search_text);
+       G_OBJECT_CLASS (cookies_dialog_parent_class)->finalize (object);
+}
+
+static void
 cookie_remove (CookiesDialog *dialog,
               gpointer data)
 {
@@ -146,12 +161,25 @@ delete_selection (CookiesDialog *dialog)
        {
                GValue val = { 0, };
 
+               GtkTreeIter filter_iter;
+               GtkTreeIter child_iter;
+
                path = gtk_tree_row_reference_get_path ((GtkTreeRowReference *)r->data);
                gtk_tree_model_get_iter (model, &iter, path);
                gtk_tree_model_get_value (model, &iter, COL_COOKIES_HOST, &val);
                cookie_remove (dialog, (gpointer)g_value_get_string (&val));
                g_value_unset (&val);
 
+               gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT 
(dialog->priv->treemodelsort),
+                                                               &filter_iter,
+                                                               &iter);
+
+               gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER 
(dialog->priv->treemodelfilter),
+                                                                 &child_iter,
+                                                                 &filter_iter);
+
+               gtk_list_store_remove (GTK_LIST_STORE (dialog->priv->liststore), &child_iter);
+
                gtk_tree_row_reference_free ((GtkTreeRowReference *)r->data);
                gtk_tree_path_free (path);
        }
@@ -212,17 +240,32 @@ on_treeview_selection_changed (GtkTreeSelection *selection,
 }
 
 static void
+on_search_entry_changed (GtkSearchEntry *entry,
+                        CookiesDialog *dialog)
+{
+       const char *text;
+
+       text = gtk_entry_get_text (GTK_ENTRY (entry));
+       g_free (dialog->priv->search_text);
+       dialog->priv->search_text = g_strdup (text);
+       gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (dialog->priv->treemodelfilter));
+}
+
+static void
 cookies_dialog_class_init (CookiesDialogClass *klass)
 {
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
        object_class->dispose = cookies_dialog_dispose;
+       object_class->finalize = cookies_dialog_finalize;
 
        gtk_widget_class_set_template_from_resource (widget_class,
                                                     "/org/gnome/epiphany/cookies-dialog.ui");
 
        gtk_widget_class_bind_template_child_private (widget_class, CookiesDialog, liststore);
+       gtk_widget_class_bind_template_child_private (widget_class, CookiesDialog, treemodelfilter);
+       gtk_widget_class_bind_template_child_private (widget_class, CookiesDialog, treemodelsort);
        gtk_widget_class_bind_template_child_private (widget_class, CookiesDialog, cookies_treeview);
        gtk_widget_class_bind_template_child_private (widget_class, CookiesDialog, clear_button);
        gtk_widget_class_bind_template_child_private (widget_class, CookiesDialog, remove_toolbutton);
@@ -230,6 +273,7 @@ cookies_dialog_class_init (CookiesDialogClass *klass)
        gtk_widget_class_bind_template_callback (widget_class, on_cookies_treeview_key_press_event);
        gtk_widget_class_bind_template_callback (widget_class, on_treeview_selection_changed);
        gtk_widget_class_bind_template_callback (widget_class, on_remove_toolbutton_clicked);
+       gtk_widget_class_bind_template_callback (widget_class, on_search_entry_changed);
 }
 
 static void
@@ -356,6 +400,29 @@ get_domains_with_cookies_cb (WebKitCookieManager *cookie_manager,
        dialog->priv->filled = TRUE;
 }
 
+static gboolean
+row_visible_func (GtkTreeModel *model,
+                 GtkTreeIter  *iter,
+                 CookiesDialog *dialog)
+{
+       gboolean visible = FALSE;
+       gchar *host;
+
+       if (dialog->priv->search_text == NULL)
+               return TRUE;
+
+       gtk_tree_model_get (model, iter,
+                           COL_COOKIES_HOST, &host,
+                           -1);
+
+       if (host != NULL && strstr (host, dialog->priv->search_text) != NULL)
+               visible = TRUE;
+
+       g_free (host);
+
+       return visible;
+}
+
 static void
 populate_model (CookiesDialog *dialog)
 {
@@ -387,6 +454,11 @@ cookies_dialog_init (CookiesDialog *dialog)
        dialog->priv = cookies_dialog_get_instance_private (dialog);
        gtk_widget_init_template (GTK_WIDGET (dialog));
 
+       gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (dialog->priv->treemodelfilter),
+                                               (GtkTreeModelFilterVisibleFunc)row_visible_func,
+                                               dialog,
+                                               NULL);
+
        web_context = ephy_embed_shell_get_web_context (shell);
        dialog->priv->cookie_manager = webkit_web_context_get_cookie_manager (web_context);
 
diff --git a/src/resources/cookies-dialog.ui b/src/resources/cookies-dialog.ui
index 6a370d8..e64d290 100644
--- a/src/resources/cookies-dialog.ui
+++ b/src/resources/cookies-dialog.ui
@@ -12,6 +12,12 @@
       <column type="SoupCookie"/>
     </columns>
   </object>
+  <object class="GtkTreeModelFilter" id="treemodelfilter">
+    <property name="child_model">liststore</property>
+  </object>
+  <object class="GtkTreeModelSort" id="treemodelsort">
+    <property name="model">treemodelfilter</property>
+  </object>
   <template class="CookiesDialog" parent="GtkDialog">
     <property name="height_request">500</property>
     <property name="can_focus">False</property>
@@ -73,82 +79,135 @@
             <property name="can_focus">False</property>
             <property name="border_width">5</property>
             <property name="orientation">vertical</property>
+            <property name="spacing">6</property>
             <child>
-              <object class="GtkScrolledWindow" id="scrolledwindow1">
-                <property name="width_request">400</property>
-                <property name="height_request">300</property>
+              <object class="GtkSearchEntry" id="searchentry1">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="hscrollbar_policy">never</property>
-                <property name="shadow_type">in</property>
-                <property name="min_content_width">300</property>
-                <property name="min_content_height">300</property>
+                <property name="primary_icon_name">edit-find-symbolic</property>
+                <property name="primary_icon_activatable">False</property>
+                <property name="primary_icon_sensitive">False</property>
+                <property name="placeholder_text" translatable="yes">Search cookies</property>
+                <signal name="search-changed" handler="on_search_entry_changed" object="CookiesDialog" 
swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkBox" id="box2">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="border_width">0</property>
+                <property name="orientation">vertical</property>
                 <child>
-                  <object class="GtkTreeView" id="cookies_treeview">
+                  <object class="GtkScrolledWindow" id="scrolledwindow1">
+                    <property name="width_request">400</property>
+                    <property name="height_request">300</property>
                     <property name="visible">True</property>
                     <property name="can_focus">True</property>
-                    <property name="model">liststore</property>
-                    <property name="search_column">0</property>
-                    <signal name="key-press-event" handler="on_cookies_treeview_key_press_event" 
object="CookiesDialog" swapped="no"/>
-                    <child internal-child="selection">
-                      <object class="GtkTreeSelection" id="treeview-selection">
-                        <property name="mode">multiple</property>
-                        <signal name="changed" handler="on_treeview_selection_changed" 
object="CookiesDialog" swapped="no"/>
-                      </object>
-                    </child>
+                    <property name="hscrollbar_policy">never</property>
+                    <property name="shadow_type">in</property>
+                    <property name="min_content_width">300</property>
+                    <property name="min_content_height">300</property>
                     <child>
-                      <object class="GtkTreeViewColumn" id="treeviewcolumn1">
-                        <property name="resizable">True</property>
-                        <property name="sizing">autosize</property>
-                        <property name="title" translatable="yes">Site</property>
-                        <property name="reorderable">True</property>
-                        <property name="sort_column_id">1</property>
+                      <object class="GtkTreeView" id="cookies_treeview">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="model">treemodelsort</property>
+                        <property name="enable_search">False</property>
+                        <property name="search_column">0</property>
+                        <signal name="key-press-event" handler="on_cookies_treeview_key_press_event" 
object="CookiesDialog" swapped="no"/>
+                        <child internal-child="selection">
+                          <object class="GtkTreeSelection" id="treeview-selection">
+                            <property name="mode">multiple</property>
+                            <signal name="changed" handler="on_treeview_selection_changed" 
object="CookiesDialog" swapped="no"/>
+                          </object>
+                        </child>
                         <child>
-                          <object class="GtkCellRendererText" id="cellrenderertext1"/>
-                          <attributes>
-                            <attribute name="text">0</attribute>
-                          </attributes>
+                          <object class="GtkTreeViewColumn" id="treeviewcolumn1">
+                            <property name="sizing">autosize</property>
+                            <property name="title" translatable="yes">Site</property>
+                            <property name="clickable">True</property>
+                            <property name="reorderable">True</property>
+                            <property name="sort_column_id">0</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
                         </child>
                       </object>
                     </child>
                   </object>
+                  <packing>
+                    <property name="expand">True</property>
+                    <property name="fill">True</property>
+                    <property name="position">0</property>
+                  </packing>
                 </child>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkToolbar" id="toolbar1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <style>
-                  <class name="inline-toolbar"/>
-                </style>
-                <property name="icon_size">1</property>
                 <child>
-                  <object class="GtkToolButton" id="remove_toolbutton">
+                  <object class="GtkToolbar" id="toolbar1">
                     <property name="visible">True</property>
-                    <property name="sensitive">False</property>
                     <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Remove</property>
-                    <property name="use_underline">True</property>
-                    <property name="icon_name">list-remove-symbolic</property>
-                    <property name="tooltip_text" translatable="yes">Delete the selected cookies</property>
-                    <signal name="clicked" handler="on_remove_toolbutton_clicked" object="CookiesDialog" 
swapped="no"/>
+                    <style>
+                      <class name="inline-toolbar"/>
+                    </style>
+                    <property name="icon_size">1</property>
+                    <child>
+                      <object class="GtkToolItem" id="toolitem1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <child>
+                          <object class="GtkBox" id="remove_button_box">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <child>
+                              <object class="GtkButton" id="remove_toolbutton">
+                                <property name="visible">True</property>
+                                <property name="sensitive">False</property>
+                                <property name="can_focus">False</property>
+                                <property name="use_underline">True</property>
+                                <property name="tooltip_text" translatable="yes">Delete the selected 
cookies</property>
+                                <property name="label" translatable="yes">Remove</property>
+                                <signal name="clicked" handler="on_remove_toolbutton_clicked" 
object="CookiesDialog" swapped="no"/>
+                                <child>
+                                  <object class="GtkImage" id="remove_cookie_image">
+                                    <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
+                                    <property name="icon_name">list-remove-symbolic</property>
+                                    <property name="icon-size">1</property>
+                                  </object>
+                                </child>
+                              </object>
+                              <packing>
+                                <property name="expand">False</property>
+                              </packing>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="homogeneous">True</property>
+                      </packing>
+                    </child>
                   </object>
                   <packing>
                     <property name="expand">False</property>
-                    <property name="homogeneous">True</property>
+                    <property name="fill">True</property>
+                    <property name="pack_type">end</property>
+                    <property name="position">1</property>
                   </packing>
                 </child>
               </object>
               <packing>
-                <property name="expand">False</property>
+                <property name="expand">True</property>
                 <property name="fill">True</property>
-                <property name="pack_type">end</property>
                 <property name="position">1</property>
               </packing>
             </child>


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