[glade/composite-templates-new: 1/7] Revert "Removed search entry from GladeInspector"



commit 7434df5696da1eb0fd60826d3354c1e0c5c1eaf4
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Sun Apr 7 22:34:11 2013 +0900

    Revert "Removed search entry from GladeInspector"
    
    This reverts commit 644299857b3cdd3861bfebfb7aefdabe0e93fb30.

 gladeui/glade-inspector.c |  328 +++++++++++++++++++++++++++++++++------------
 gladeui/glade-inspector.h |    2 -
 2 files changed, 241 insertions(+), 89 deletions(-)
---
diff --git a/gladeui/glade-inspector.c b/gladeui/glade-inspector.c
index 1614fab..7c4d9c3 100644
--- a/gladeui/glade-inspector.c
+++ b/gladeui/glade-inspector.c
@@ -60,7 +60,6 @@ enum
 {
   PROP_0,
   PROP_PROJECT,
-  PROP_SEARCH_ENTRY,
   N_PROPERTIES
 };
 
@@ -77,7 +76,10 @@ struct _GladeInspectorPrivate
   GtkTreeModel *filter;
 
   GladeProject *project;
-  GtkWidget *search_entry;
+
+  GtkWidget *entry;
+  guint idle_complete;
+  gboolean search_disabled;
 };
 
 static GParamSpec *properties[N_PROPERTIES];
@@ -98,12 +100,10 @@ static gint button_press_cb (GtkWidget *widget,
                              GladeInspector *inspector);
 
 G_DEFINE_TYPE (GladeInspector, glade_inspector, GTK_TYPE_VBOX)
-
-static void
-glade_inspector_set_property (GObject *object,
-                              guint property_id,
-                              const GValue *value,
-                              GParamSpec *pspec)
+     static void
+         glade_inspector_set_property (GObject *object,
+                                       guint property_id,
+                                       const GValue *value, GParamSpec *pspec)
 {
   GladeInspector *inspector = GLADE_INSPECTOR (object);
 
@@ -112,9 +112,6 @@ glade_inspector_set_property (GObject *object,
       case PROP_PROJECT:
         glade_inspector_set_project (inspector, g_value_get_object (value));
         break;
-      case PROP_SEARCH_ENTRY:
-        glade_inspector_set_search_entry (inspector, g_value_get_object (value));
-        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -134,9 +131,6 @@ glade_inspector_get_property (GObject *object,
       case PROP_PROJECT:
         g_value_set_object (value, glade_inspector_get_project (inspector));
         break;
-      case PROP_SEARCH_ENTRY:
-        g_value_set_object (value, inspector->priv->search_entry);
-        break;
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
         break;
@@ -187,14 +181,7 @@ glade_inspector_class_init (GladeInspectorClass *klass)
                          _("The project being inspected"),
                          GLADE_TYPE_PROJECT,
                          G_PARAM_READABLE | G_PARAM_WRITABLE);
-
-  properties[PROP_SEARCH_ENTRY] =
-    g_param_spec_object ("search-entry",
-                         _("Search Entry"),
-                         _("The search entry to use for this inspector. see 
gtk_tree_view_set_search_entry()"),
-                         GTK_TYPE_ENTRY,
-                         G_PARAM_READWRITE);
-
+  
   /* Install all properties */
   g_object_class_install_properties (object_class, N_PROPERTIES, properties);
 
@@ -228,7 +215,7 @@ glade_inspector_visible_func (GtkTreeModel *model,
 
   gboolean retval = FALSE;
 
-  if (!priv->search_entry)
+  if (priv->search_disabled)
     return TRUE;
 
   if (gtk_tree_model_iter_children (model, &iter, parent))
@@ -241,21 +228,212 @@ glade_inspector_visible_func (GtkTreeModel *model,
     }
   if (!retval)
     {
-      const gchar *text = gtk_entry_get_text (GTK_ENTRY (priv->search_entry));
-      GladeWidget *gwidget;
-      GObject *object;
-
-      /* We better get the object and then access the Gladewidget name than
-         allocating the string from the model */
-      gtk_tree_model_get (model, parent, GLADE_PROJECT_MODEL_COLUMN_OBJECT, &object, -1);
-      gwidget = glade_widget_get_from_gobject (object); 
-      retval = find_in_string_insensitive (glade_widget_get_name (gwidget), text);
+      const gchar *text = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+      gchar *widget_name;
+
+      gtk_tree_model_get (model, parent, GLADE_PROJECT_MODEL_COLUMN_NAME,
+                          &widget_name, -1);
+
+      retval = find_in_string_insensitive (widget_name, text);
+
+      g_free (widget_name);
     }
 
   return retval;
 }
 
 static void
+glade_inspector_filter (GladeInspector *inspector)
+{
+  GladeInspectorPrivate *priv = inspector->priv;
+
+  if (!priv->search_disabled)
+    {
+      gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
+      gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->view));
+    }
+
+}
+
+static void
+search_entry_changed_cb (GtkEntry *entry, GladeInspector *inspector)
+{
+  glade_inspector_filter (inspector);
+}
+
+static void
+selection_name_foreach_func (GtkTreeModel *model,
+                             GtkTreePath *path,
+                             GtkTreeIter *iter,
+                             gchar **selection)
+{
+  if (*selection == NULL)
+    {
+      gchar *name;
+      
+      gtk_tree_model_get (model, iter, GLADE_PROJECT_MODEL_COLUMN_NAME, &name, -1);
+      *selection = name;
+    }
+}
+
+static gchar *
+get_selected_name (GladeInspector *inspector)
+{
+  GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (inspector->priv->view));
+  gchar *name = NULL;
+  
+  gtk_tree_selection_selected_foreach (selection,
+                                       (GtkTreeSelectionForeachFunc)
+                                       selection_name_foreach_func, &name);
+
+  return name;
+}
+
+static gboolean
+search_complete_idle (GladeInspector *inspector)
+{
+  GladeInspectorPrivate *priv = inspector->priv;
+  gchar *completed = get_selected_name (inspector);
+  const gchar *str;
+  gsize length;
+
+  str = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+
+  if (completed)
+    {
+      length = strlen (str);
+
+      gtk_entry_set_text (GTK_ENTRY (priv->entry), completed);
+      gtk_editable_set_position (GTK_EDITABLE (priv->entry), length);
+      gtk_editable_select_region (GTK_EDITABLE (priv->entry), length, -1);
+      g_free (completed);
+    }
+
+  priv->idle_complete = 0;
+
+  return FALSE;
+}
+
+static void
+search_entry_text_inserted_cb (GtkEntry *entry,
+                               const gchar *text,
+                               gint length,
+                               gint *position,
+                               GladeInspector *inspector)
+{
+  GladeInspectorPrivate *priv = inspector->priv;
+
+  if (!priv->search_disabled && !priv->idle_complete)
+    {
+      priv->idle_complete =
+          g_idle_add ((GSourceFunc) search_complete_idle, inspector);
+    }
+}
+
+static gboolean
+search_entry_key_press_event_cb (GtkEntry *entry,
+                                 GdkEventKey *event,
+                                 GladeInspector *inspector)
+{
+  GladeInspectorPrivate *priv = inspector->priv;
+  const gchar *str;
+
+  if (event->keyval == GDK_KEY_Tab)
+    {
+      if (event->state & GDK_CONTROL_MASK)
+        {
+          gtk_widget_grab_focus (priv->view);
+        }
+      else
+        {
+          gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+          gtk_editable_select_region (GTK_EDITABLE (entry), -1, -1);
+        }
+      return TRUE;
+    }
+
+  if (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter)
+    {
+      gchar *name;
+
+      str = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+
+      if (str && (name = get_selected_name (inspector)))
+        {
+          gtk_entry_set_text (GTK_ENTRY (entry), name);
+          g_free (name);
+          gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+          gtk_editable_select_region (GTK_EDITABLE (entry), -1, -1);
+        }
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+widget_font_desc_set_style (GtkWidget *widget, PangoStyle style)
+{
+  GtkStyleContext *context = gtk_widget_get_style_context (widget);
+  PangoFontDescription *font_desc = 
+    pango_font_description_copy (gtk_style_context_get_font (context, GTK_STATE_FLAG_NORMAL));
+
+  pango_font_description_set_style (font_desc, style);
+  gtk_widget_override_font (widget, font_desc);
+  pango_font_description_free (font_desc);
+}
+
+static void
+search_entry_update (GladeInspector *inspector)
+{
+  GladeInspectorPrivate *priv = inspector->priv;
+  const gchar *str = gtk_entry_get_text (GTK_ENTRY (priv->entry));
+
+  if (str[0] == '\0')
+    {
+      GtkStyleContext *context;
+      GdkRGBA          color;
+
+      priv->search_disabled = TRUE;
+      widget_font_desc_set_style (priv->entry, PANGO_STYLE_ITALIC);
+      gtk_entry_set_text (GTK_ENTRY (priv->entry), _("< search widgets >"));
+
+      context = gtk_widget_get_style_context (priv->entry);
+      gtk_style_context_get_color (context, GTK_STATE_FLAG_INSENSITIVE, &color);
+      gtk_widget_override_color (priv->entry, GTK_STATE_FLAG_NORMAL, &color);
+    }
+}
+
+static gboolean
+search_entry_focus_in_cb (GtkWidget *entry,
+                          GdkEventFocus *event,
+                          GladeInspector *inspector)
+{
+  GladeInspectorPrivate *priv = inspector->priv;
+
+  if (priv->search_disabled)
+    {
+      gtk_entry_set_text (GTK_ENTRY (priv->entry), "");
+      gtk_widget_override_color (priv->entry, GTK_STATE_NORMAL, NULL);
+      gtk_widget_override_font (priv->entry, NULL);
+
+      priv->search_disabled = FALSE;
+    }
+
+  return FALSE;
+}
+
+static gboolean
+search_entry_focus_out_cb (GtkWidget *entry,
+                           GdkEventFocus *event,
+                           GladeInspector *inspector)
+{
+  search_entry_update (inspector);
+
+  return FALSE;
+}
+
+static void
 glade_inspector_init (GladeInspector *inspector)
 {
   GladeInspectorPrivate *priv;
@@ -266,6 +444,24 @@ glade_inspector_init (GladeInspector *inspector)
 
   priv->project = NULL;
 
+  priv->entry = gtk_entry_new ();
+
+  search_entry_update (inspector);
+  gtk_widget_show (priv->entry);
+  gtk_box_pack_start (GTK_BOX (inspector), priv->entry, FALSE, FALSE, 2);
+
+  g_signal_connect (priv->entry, "changed",
+                    G_CALLBACK (search_entry_changed_cb), inspector);
+  g_signal_connect (priv->entry, "key-press-event",
+                    G_CALLBACK (search_entry_key_press_event_cb), inspector);
+  g_signal_connect_after (priv->entry, "insert-text",
+                          G_CALLBACK (search_entry_text_inserted_cb),
+                          inspector);
+  g_signal_connect (priv->entry, "focus-in-event",
+                    G_CALLBACK (search_entry_focus_in_cb), inspector);
+  g_signal_connect (priv->entry, "focus-out-event",
+                    G_CALLBACK (search_entry_focus_out_cb), inspector);
+
   priv->view = gtk_tree_view_new ();
   add_columns (GTK_TREE_VIEW (priv->view));
   gtk_tree_view_set_search_column (GTK_TREE_VIEW (priv->view), GLADE_PROJECT_MODEL_COLUMN_NAME);
@@ -301,6 +497,12 @@ glade_inspector_dispose (GObject *object)
   glade_inspector_set_search_entry (inspector, NULL);
   glade_inspector_set_project (inspector, NULL);
 
+  if (inspector->priv->idle_complete)
+    {
+      g_source_remove (inspector->priv->idle_complete);
+      inspector->priv->idle_complete = 0;
+    }
+
   G_OBJECT_CLASS (glade_inspector_parent_class)->dispose (object);
 }
 
@@ -603,9 +805,6 @@ glade_inspector_set_project (GladeInspector *inspector, GladeProject *project)
       priv->project = NULL;
     }
 
-  gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), NULL);
-  gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), FALSE);
-  
   if (project)
     {
       priv->project = project;
@@ -625,12 +824,13 @@ glade_inspector_set_project (GladeInspector *inspector, GladeProject *project)
 
       connect_project_signals (inspector, project);
 
-      if (priv->search_entry)
-        {
-          gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view),
-                                          GTK_ENTRY (priv->search_entry));
-          gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), TRUE);
-        }
+      gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), GTK_ENTRY (priv->entry));
+      gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), TRUE);
+    }
+  else
+    {
+      gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), NULL);
+      gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view), FALSE);
     }
 
   g_object_notify_by_pspec (G_OBJECT (inspector), properties[PROP_PROJECT]);
@@ -728,49 +928,3 @@ glade_inspector_new_with_project (GladeProject *project)
 
   return GTK_WIDGET (inspector);
 }
-
-static void
-search_entry_changed_cb (GtkEntry *entry, GladeInspector *inspector)
-{
-  GladeInspectorPrivate *priv = inspector->priv;
-
-  gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
-  gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->view));
-}
-
-/**
- * glade_inspector_set_search_entry:
- * @project: a #GladeProject
- * @entry: a #GtkEntry
- *
- * Sets @entry as the interactive search entry for the inspector treeview.
- */
-void
-glade_inspector_set_search_entry (GladeInspector *inspector, GtkEntry *entry)
-{
-  GladeInspectorPrivate *priv;
-  
-  g_return_if_fail (GLADE_IS_INSPECTOR (inspector));
-
-  priv = inspector->priv;
-
-  if (priv->search_entry)
-    g_signal_handlers_disconnect_by_func (priv->search_entry, search_entry_changed_cb, inspector);
-  
-  g_clear_object (&priv->search_entry);
-
-  if (entry)
-    {
-      priv->search_entry = g_object_ref (entry);
-      
-      g_signal_connect (entry, "changed", G_CALLBACK (search_entry_changed_cb), inspector);
-    }
-
-  if (priv->project)
-    {
-      gtk_tree_view_set_search_entry (GTK_TREE_VIEW (priv->view), entry);
-      gtk_tree_view_set_enable_search (GTK_TREE_VIEW (priv->view),
-                                       entry ? TRUE : FALSE);
-    }
-}
-
diff --git a/gladeui/glade-inspector.h b/gladeui/glade-inspector.h
index a98671f..3b95dad 100644
--- a/gladeui/glade-inspector.h
+++ b/gladeui/glade-inspector.h
@@ -77,8 +77,6 @@ GtkWidget     *glade_inspector_new                (void);
 GtkWidget     *glade_inspector_new_with_project   (GladeProject   *project);
 void           glade_inspector_set_project        (GladeInspector *inspector,
                                                   GladeProject   *project);
-void           glade_inspector_set_search_entry   (GladeInspector *inspector,
-                                                   GtkEntry       *entry);
 GladeProject  *glade_inspector_get_project        (GladeInspector *inspector);
 GList         *glade_inspector_get_selected_items (GladeInspector *inspector);
 


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