[gtk/matthiasc/for-master: 7/7] inspector: Show some information about expressions



commit 2b5dd0082d0fd87d6302a0c87ae1846eea40426f
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jul 13 20:49:56 2020 -0400

    inspector: Show some information about expressions
    
    This is not too useful, but better than nothing.

 gtk/inspector/prop-editor.c | 72 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 72 insertions(+)
---
diff --git a/gtk/inspector/prop-editor.c b/gtk/inspector/prop-editor.c
index c182f1c958..c557e4206f 100644
--- a/gtk/inspector/prop-editor.c
+++ b/gtk/inspector/prop-editor.c
@@ -768,6 +768,67 @@ font_changed (GObject *object, GParamSpec *pspec, gpointer data)
   pango_font_description_free (fb_font_desc);
 }
 
+static char *
+describe_expression (GtkExpression *expression)
+{
+  if (expression == NULL)
+    return NULL;
+
+  if (G_TYPE_CHECK_INSTANCE_TYPE (expression, GTK_TYPE_CONSTANT_EXPRESSION))
+    {
+      const GValue *value = gtk_constant_expression_get_value (expression);
+      GValue dest = G_VALUE_INIT;
+
+      g_value_init (&dest, G_TYPE_STRING);
+      if (g_value_transform (value, &dest))
+        {
+          char *res = g_strdup_printf (_("%s with value \"%s\""),
+                                       g_type_name (G_TYPE_FROM_INSTANCE (expression)),
+                                       g_value_get_string (&dest));
+          g_value_unset (&dest);
+          return res;
+        }
+      else
+        {
+          return g_strdup_printf (_("%s with type %s"),
+                                  g_type_name (G_TYPE_FROM_INSTANCE (expression)),
+                                  g_type_name (G_VALUE_TYPE (value)));
+        }
+    }
+  else if (G_TYPE_CHECK_INSTANCE_TYPE (expression, GTK_TYPE_OBJECT_EXPRESSION))
+    {
+      gpointer obj = gtk_object_expression_get_object (expression);
+
+      if (obj)
+        return g_strdup_printf (_("%s for %s %p"),
+                                g_type_name (G_TYPE_FROM_INSTANCE (expression)),
+                                G_OBJECT_TYPE_NAME (obj), obj);
+      else
+        return g_strdup_printf (_("%s"),
+                                g_type_name (G_TYPE_FROM_INSTANCE (expression)));
+    }
+  else if (G_TYPE_CHECK_INSTANCE_TYPE (expression, GTK_TYPE_PROPERTY_EXPRESSION))
+    {
+      GParamSpec *pspec = gtk_property_expression_get_pspec (expression);
+      GtkExpression *expr = gtk_property_expression_get_expression (expression);
+      char *str;
+      char *res;
+
+      str = describe_expression (expr);
+      res = g_strdup_printf ("%s for property %s:%s on: %s",
+                             g_type_name (G_TYPE_FROM_INSTANCE (expression)),
+                             g_type_name (pspec->owner_type),
+                             pspec->name,
+                             str);
+      g_free (str);
+      return res;
+    }
+  else
+    return g_strdup_printf (_("%s with value type %s"),
+                            g_type_name (G_TYPE_FROM_INSTANCE (expression)),
+                            g_type_name (gtk_expression_get_value_type (expression)));
+}
+
 static GtkWidget *
 property_editor (GObject                *object,
                  GParamSpec             *spec,
@@ -1034,6 +1095,17 @@ property_editor (GObject                *object,
       gtk_widget_set_halign (prop_edit, GTK_ALIGN_START);
       gtk_widget_set_valign (prop_edit, GTK_ALIGN_CENTER);
     }
+  else if (type == GTK_TYPE_PARAM_SPEC_EXPRESSION)
+    {
+      GtkExpression *expression;
+      g_object_get (object, spec->name, &expression, NULL);
+      msg = describe_expression (expression);
+      prop_edit = gtk_label_new (msg);
+      g_free (msg);
+      g_clear_pointer (&expression, gtk_expression_unref);
+      gtk_widget_set_halign (prop_edit, GTK_ALIGN_START);
+      gtk_widget_set_valign (prop_edit, GTK_ALIGN_CENTER);
+    }
   else
     {
       msg = g_strdup_printf (_("Uneditable property type: %s"),


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