[gtk/prop-list] inspector: Make prop list sortable again



commit 61bfafa38f1bf7b65d683e8ea3f6aed6572b03e0
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Dec 3 02:27:43 2019 -0500

    inspector: Make prop list sortable again

 gtk/inspector/prop-list.c  | 74 +++++++++++++++++++++++++++++++++++++++++++---
 gtk/inspector/prop-list.ui |  6 ++--
 2 files changed, 73 insertions(+), 7 deletions(-)
---
diff --git a/gtk/inspector/prop-list.c b/gtk/inspector/prop-list.c
index 749f79b4b0..065fcf492b 100644
--- a/gtk/inspector/prop-list.c
+++ b/gtk/inspector/prop-list.c
@@ -67,6 +67,9 @@ struct _GtkInspectorPropListPrivate
   GtkWidget *search_stack;
   GtkWidget *list2;
   GtkFilter *filter;
+  GtkColumnViewColumn *name;
+  GtkColumnViewColumn *type;
+  GtkColumnViewColumn *origin;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorPropList, gtk_inspector_prop_list, GTK_TYPE_BOX)
@@ -87,16 +90,42 @@ show_search_entry (GtkInspectorPropList *pl)
 }
 
 static char *
-holder_prop (gpointer object)
+holder_prop (gpointer item)
 {
-  g_print ("object is %s\n", G_OBJECT_TYPE_NAME (object));
-  return g_strdup (prop_holder_get_property (PROP_HOLDER (object)));
+  return g_strdup (prop_holder_get_property (PROP_HOLDER (item)));
+}
+
+static char *
+holder_type (gpointer item)
+{
+  GObject *object;
+  const char *property;
+  GParamSpec *prop;
+
+  object = prop_holder_get_object (PROP_HOLDER (item));
+  property = prop_holder_get_property (PROP_HOLDER (item));
+  prop = g_object_class_find_property (G_OBJECT_GET_CLASS (object), property);
+  return g_strdup (g_type_name (G_PARAM_SPEC_VALUE_TYPE (prop)));
+}
+
+static char *
+holder_origin (gpointer item)
+{
+  GObject *object;
+  const char *property;
+  GParamSpec *prop;
+
+  object = prop_holder_get_object (PROP_HOLDER (item));
+  property = prop_holder_get_property (PROP_HOLDER (item));
+  prop = g_object_class_find_property (G_OBJECT_GET_CLASS (object), property);
+  return g_strdup (g_type_name (prop->owner_type));
 }
 
 static void
 gtk_inspector_prop_list_init (GtkInspectorPropList *pl)
 {
   GtkExpression *expression;
+  GtkSorter *sorter;
 
   pl->priv = gtk_inspector_prop_list_get_instance_private (pl);
   gtk_widget_init_template (GTK_WIDGET (pl));
@@ -109,6 +138,36 @@ gtk_inspector_prop_list_init (GtkInspectorPropList *pl)
                                             NULL, NULL);
  
   gtk_string_filter_set_expression (GTK_STRING_FILTER (pl->priv->filter), expression);
+
+  sorter = gtk_string_sorter_new ();
+  gtk_string_sorter_set_expression (GTK_STRING_SORTER (sorter), expression);
+  gtk_column_view_column_set_sorter (pl->priv->name, sorter);
+  g_object_unref (sorter);
+
+  gtk_expression_unref (expression);
+
+  expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
+                                            0, NULL,
+                                            (GCallback)holder_type,
+                                            NULL, NULL);
+ 
+  sorter = gtk_string_sorter_new ();
+  gtk_string_sorter_set_expression (GTK_STRING_SORTER (sorter), expression);
+  gtk_column_view_column_set_sorter (pl->priv->type, sorter);
+  g_object_unref (sorter);
+
+  gtk_expression_unref (expression);
+
+  expression = gtk_cclosure_expression_new (G_TYPE_STRING, NULL,
+                                            0, NULL,
+                                            (GCallback)holder_origin,
+                                            NULL, NULL);
+ 
+  sorter = gtk_string_sorter_new ();
+  gtk_string_sorter_set_expression (GTK_STRING_SORTER (sorter), expression);
+  gtk_column_view_column_set_sorter (pl->priv->origin, sorter);
+  g_object_unref (sorter);
+
   gtk_expression_unref (expression);
 }
 
@@ -414,6 +473,9 @@ gtk_inspector_prop_list_class_init (GtkInspectorPropListClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/prop-list.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, list2);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, name);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, type);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, origin);
   gtk_widget_class_bind_template_callback (widget_class, setup_name_cb);
   gtk_widget_class_bind_template_callback (widget_class, bind_name_cb);
   gtk_widget_class_bind_template_callback (widget_class, setup_type_cb);
@@ -547,6 +609,7 @@ gtk_inspector_prop_list_set_object (GtkInspectorPropList *pl,
   GListStore *store;
   GListModel *list;
   GListModel *filtered;
+  GtkSortListModel *sorted;
 
   if (!object)
     return FALSE;
@@ -584,13 +647,16 @@ gtk_inspector_prop_list_set_object (GtkInspectorPropList *pl,
     g_signal_connect_object (object, "destroy", G_CALLBACK (cleanup_object), pl, G_CONNECT_SWAPPED);
 
   filtered = G_LIST_MODEL (gtk_filter_list_model_new (G_LIST_MODEL (store), pl->priv->filter));
-  list = G_LIST_MODEL (gtk_no_selection_new (filtered));
+  sorted = gtk_sort_list_model_new (filtered, NULL);
+  list = G_LIST_MODEL (gtk_no_selection_new (G_LIST_MODEL (sorted)));
 
   gtk_column_view_set_model (GTK_COLUMN_VIEW (pl->priv->list2), list);
+  gtk_column_view_set_sort_model (GTK_COLUMN_VIEW (pl->priv->list2), sorted);
 
   gtk_widget_show (GTK_WIDGET (pl));
 
   g_object_unref (list);
+  g_object_unref (sorted);
   g_object_unref (filtered);
   g_object_unref (store);
 
diff --git a/gtk/inspector/prop-list.ui b/gtk/inspector/prop-list.ui
index 35457f484d..2c0537fb29 100644
--- a/gtk/inspector/prop-list.ui
+++ b/gtk/inspector/prop-list.ui
@@ -15,7 +15,7 @@
             <child>
               <object class="GtkColumnView" id="list2">
                 <child>
-                  <object class="GtkColumnViewColumn">
+                  <object class="GtkColumnViewColumn" id="name">
                     <property name="title">Name</property>
                     <property name="factory">
                       <object class="GtkSignalListItemFactory">
@@ -26,7 +26,7 @@
                   </object>
                 </child>
                 <child>
-                  <object class="GtkColumnViewColumn">
+                  <object class="GtkColumnViewColumn" id="type">
                     <property name="title">Type</property>
                     <property name="factory">
                       <object class="GtkSignalListItemFactory">
@@ -37,7 +37,7 @@
                   </object>
                 </child>
                 <child>
-                  <object class="GtkColumnViewColumn">
+                  <object class="GtkColumnViewColumn" id="origin">
                     <property name="title">Defined At</property>
                     <property name="factory">
                       <object class="GtkSignalListItemFactory">


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