[gtk/zbrown/type-info] inspector: Type info for misc pane



commit e493b9b702cfed30c9ddcf5d1715379f2cda3f41
Author: Zander Brown <zbrown gnome org>
Date:   Wed Apr 3 23:50:24 2019 +0100

    inspector: Type info for misc pane
    
    Replaces the class hierarchy page with a button/popover on the misc page

 gtk/inspector/meson.build  |   1 +
 gtk/inspector/misc-info.c  |  17 ++++
 gtk/inspector/misc-info.ui |  26 ++++++
 gtk/inspector/type-info.c  | 216 +++++++++++++++++++++++++++++++++++++++++++++
 gtk/inspector/type-info.h  |  35 ++++++++
 gtk/inspector/type-info.ui |  59 +++++++++++++
 6 files changed, 354 insertions(+)
---
diff --git a/gtk/inspector/meson.build b/gtk/inspector/meson.build
index b67da21bd4..a26d67ed87 100644
--- a/gtk/inspector/meson.build
+++ b/gtk/inspector/meson.build
@@ -31,6 +31,7 @@ inspector_sources = files(
   'statistics.c',
   'strv-editor.c',
   'treewalk.c',
+  'type-info.c',
   'updatesoverlay.c',
   'visual.c',
   'window.c',
diff --git a/gtk/inspector/misc-info.c b/gtk/inspector/misc-info.c
index 1d9d053d7d..f082553a6b 100644
--- a/gtk/inspector/misc-info.c
+++ b/gtk/inspector/misc-info.c
@@ -21,6 +21,7 @@
 #include "misc-info.h"
 #include "window.h"
 #include "object-tree.h"
+#include "type-info.h"
 
 #include "gtktypebuiltins.h"
 #include "gtktreeview.h"
@@ -28,6 +29,7 @@
 #include "gtklabel.h"
 #include "gtkframe.h"
 #include "gtkbutton.h"
+#include "gtkmenubutton.h"
 #include "gtkwidgetprivate.h"
 
 
@@ -37,6 +39,8 @@ struct _GtkInspectorMiscInfoPrivate {
   GObject *object;
 
   GtkWidget *address;
+  GtkWidget *type;
+  GtkWidget *type_popover;
   GtkWidget *refcount_row;
   GtkWidget *refcount;
   GtkWidget *state_row;
@@ -260,11 +264,18 @@ update_info (gpointer data)
 {
   GtkInspectorMiscInfo *sl = data;
   gchar *tmp;
+  GType gtype;
 
   tmp = g_strdup_printf ("%p", sl->priv->object);
   gtk_label_set_text (GTK_LABEL (sl->priv->address), tmp);
   g_free (tmp);
 
+  gtype = G_TYPE_FROM_INSTANCE (sl->priv->object);
+
+  gtk_button_set_label (GTK_BUTTON (sl->priv->type), g_type_name (gtype));
+  gtk_inspector_type_popover_set_gtype (GTK_INSPECTOR_TYPE_POPOVER (sl->priv->type_popover),
+                                        gtype);
+
   if (G_IS_OBJECT (sl->priv->object))
     {
       tmp = g_strdup_printf ("%d", sl->priv->object->ref_count);
@@ -458,6 +469,11 @@ gtk_inspector_misc_info_init (GtkInspectorMiscInfo *sl)
 {
   sl->priv = gtk_inspector_misc_info_get_instance_private (sl);
   gtk_widget_init_template (GTK_WIDGET (sl));
+
+  sl->priv->type_popover = g_object_new (GTK_TYPE_INSPECTOR_TYPE_POPOVER, NULL);
+  gtk_menu_button_set_popover (GTK_MENU_BUTTON (sl->priv->type),
+                               sl->priv->type_popover);
+
 }
 
 static void
@@ -540,6 +556,7 @@ gtk_inspector_misc_info_class_init (GtkInspectorMiscInfoClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/misc-info.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, address);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, type);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, refcount_row);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, refcount);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, state_row);
diff --git a/gtk/inspector/misc-info.ui b/gtk/inspector/misc-info.ui
index cbb3ef65b4..414a5d2fc1 100644
--- a/gtk/inspector/misc-info.ui
+++ b/gtk/inspector/misc-info.ui
@@ -41,6 +41,32 @@
                     </child>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkListBoxRow" id="type_row">
+                    <property name="activatable">0</property>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="margin">10</property>
+                        <property name="spacing">40</property>
+                        <child>
+                          <object class="GtkLabel" id="type_label">
+                            <property name="label" translatable="yes">Type</property>
+                            <property name="halign">start</property>
+                            <property name="valign">baseline</property>
+                            <property name="xalign">0.0</property>
+                            <property name="hexpand">1</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuButton" id="type">
+                            <property name="halign">end</property>
+                            <property name="valign">baseline</property>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
                 <child>
                   <object class="GtkListBoxRow" id="refcount_row">
                     <property name="activatable">0</property>
diff --git a/gtk/inspector/type-info.c b/gtk/inspector/type-info.c
new file mode 100644
index 0000000000..6f2f8bdbc5
--- /dev/null
+++ b/gtk/inspector/type-info.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright © 2019 Zander Brown
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+
+#include "type-info.h"
+
+#include "gtkpopover.h"
+
+struct _GtkInspectorTypePopover
+{
+  GtkPopover parent_instance;
+};
+
+typedef struct _GtkInspectorTypePopoverPrivate GtkInspectorTypePopoverPrivate;
+
+struct _GtkInspectorTypePopoverPrivate
+{
+  GType type;
+
+  GtkWidget *parents;
+  GtkWidget *interfaces;
+};
+
+enum
+{
+  PROP_0,
+  PROP_TYPE
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorTypePopover, gtk_inspector_type_popover,
+                            GTK_TYPE_POPOVER)
+
+static void
+add_row (GtkContainer *box,
+         const gchar  *name)
+{
+  GtkWidget *row;
+  GtkWidget *label;
+
+  row = g_object_new (GTK_TYPE_LIST_BOX_ROW,
+                      "selectable", FALSE,
+                      "activatable", FALSE,
+                      "can-focus", FALSE,
+                      NULL);
+
+  label = g_object_new (GTK_TYPE_LABEL,
+                        "margin", 6,
+                        "label", name,
+                        "selectable", TRUE,
+                        "xalign", 0.0,
+                        NULL);
+
+  gtk_container_add (GTK_CONTAINER (row), label);
+  gtk_container_add (box, row);
+}
+
+static void
+remove_row (GtkWidget *item,
+            gpointer   data)
+{
+  if (GTK_IS_LIST_BOX_ROW (item))
+    gtk_container_remove (GTK_CONTAINER (data), item);
+}
+
+void
+gtk_inspector_type_popover_set_gtype (GtkInspectorTypePopover *self,
+                                      GType                    gtype)
+{
+  GtkInspectorTypePopoverPrivate *priv;
+  GHashTable *implements;
+  GHashTableIter iter;
+  const gchar *name;
+  GType *interfaces;
+  GType tmp;
+  gint i;
+
+  g_return_if_fail (GTK_IS_INSPECTOR_TYPE_POPOVER (self));
+
+  priv = gtk_inspector_type_popover_get_instance_private (self);
+
+  if (priv->type == gtype)
+    return;
+
+  priv->type = gtype;
+
+  gtk_container_foreach (GTK_CONTAINER (priv->parents),
+                         remove_row, priv->parents);
+  gtk_container_foreach (GTK_CONTAINER (priv->interfaces),
+                         remove_row, priv->interfaces);
+
+  implements = g_hash_table_new (g_str_hash, g_str_equal);
+
+  tmp = gtype;
+
+  do
+    {
+      add_row (GTK_CONTAINER (priv->parents), g_type_name (tmp));
+
+      interfaces = g_type_interfaces (tmp, NULL);
+
+      for (i = 0; interfaces[i]; i++)
+        g_hash_table_add (implements, (gchar *) g_type_name (interfaces[i]));
+
+      g_free (interfaces);
+    }
+  while ((tmp = g_type_parent (tmp)));
+
+  g_hash_table_iter_init (&iter, implements);
+
+  while (g_hash_table_iter_next (&iter, (gpointer *) &name, NULL))
+    add_row (GTK_CONTAINER (priv->interfaces), name);
+
+  g_hash_table_unref (implements);
+}
+
+static void
+gtk_inspector_type_popover_init (GtkInspectorTypePopover *self)
+{
+  GtkInspectorTypePopoverPrivate *priv;
+  GtkWidget *label;
+
+  gtk_widget_init_template (GTK_WIDGET (self));
+
+  priv = gtk_inspector_type_popover_get_instance_private (self);
+
+  priv->type = G_TYPE_NONE;
+
+  label = g_object_new (GTK_TYPE_LABEL,
+                        "margin", 12,
+                        "label", "None",
+                        NULL);
+
+  gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->parents), label);
+
+  label = g_object_new (GTK_TYPE_LABEL,
+                        "margin", 12,
+                        "label", "None",
+                        NULL);
+
+  gtk_list_box_set_placeholder (GTK_LIST_BOX (priv->interfaces), label);
+}
+
+static void
+gtk_inspector_type_popover_get_property (GObject    *object,
+                                      guint       param_id,
+                                      GValue     *value,
+                                      GParamSpec *pspec)
+{
+  GtkInspectorTypePopover *self = GTK_INSPECTOR_TYPE_POPOVER (object);
+  GtkInspectorTypePopoverPrivate *priv = gtk_inspector_type_popover_get_instance_private (self);
+
+  switch (param_id)
+    {
+      case PROP_TYPE:
+        g_value_set_gtype (value, priv->type);
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+        break;
+    }
+}
+
+static void
+gtk_inspector_type_popover_set_property (GObject      *object,
+                                      guint         param_id,
+                                      const GValue *value,
+                                      GParamSpec   *pspec)
+{
+  GtkInspectorTypePopover *self = GTK_INSPECTOR_TYPE_POPOVER (object);
+
+  switch (param_id)
+    {
+      case PROP_TYPE:
+        gtk_inspector_type_popover_set_gtype (self, g_value_get_gtype (value));
+        break;
+
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+        break;
+    }
+}
+
+static void
+gtk_inspector_type_popover_class_init (GtkInspectorTypePopoverClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->get_property = gtk_inspector_type_popover_get_property;
+  object_class->set_property = gtk_inspector_type_popover_set_property;
+
+  g_object_class_install_property (object_class, PROP_TYPE,
+      g_param_spec_gtype ("type", "Type", "Type",
+                          G_TYPE_NONE, G_PARAM_READWRITE));
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/type-info.ui");
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorTypePopover, parents);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorTypePopover, interfaces);
+}
diff --git a/gtk/inspector/type-info.h b/gtk/inspector/type-info.h
new file mode 100644
index 0000000000..f6d8f41608
--- /dev/null
+++ b/gtk/inspector/type-info.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2019 Zander Brown
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _GTK_INSPECTOR_TYPE_INFO_H_
+#define _GTK_INSPECTOR_TYPE_INFO_H_
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_INSPECTOR_TYPE_POPOVER (gtk_inspector_type_popover_get_type ())
+
+G_DECLARE_FINAL_TYPE (GtkInspectorTypePopover, gtk_inspector_type_popover,
+                      GTK, INSPECTOR_TYPE_POPOVER, GtkPopover)
+
+void gtk_inspector_type_popover_set_gtype (GtkInspectorTypePopover *self,
+                                           GType                    gtype);
+
+G_END_DECLS
+
+#endif
\ No newline at end of file
diff --git a/gtk/inspector/type-info.ui b/gtk/inspector/type-info.ui
new file mode 100644
index 0000000000..9e62daca0a
--- /dev/null
+++ b/gtk/inspector/type-info.ui
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface domain="gtk40">
+  <template class="GtkInspectorTypePopover" parent="GtkPopover">
+    <child>
+      <object class="GtkBox">
+        <property name="margin-start">6</property>
+        <property name="margin-end">6</property>
+        <property name="margin-top">6</property>
+        <property name="margin-bottom">6</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">6</property>
+        <child>
+          <object class="GtkLabel">
+            <property name="label" translatable="yes">Hierarchy</property>
+            <property name="xalign">0</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow">
+            <property name="can-focus">1</property>
+            <property name="shadow-type">etched-in</property>
+            <property name="min-content-width">200</property>
+            <property name="max-content-height">200</property>
+            <property name="propagate-natural-width">1</property>
+            <property name="propagate-natural-height">1</property>
+            <child>
+              <object class="GtkListBox" id="parents">
+                <property name="selection-mode">none</property>
+                <property name="activate-on-single-click">0</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkLabel">
+            <property name="label" translatable="yes">Implements</property>
+            <property name="xalign">0</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow">
+            <property name="can-focus">1</property>
+            <property name="shadow-type">etched-in</property>
+            <property name="min-content-width">200</property>
+            <property name="max-content-height">150</property>
+            <property name="propagate-natural-width">1</property>
+            <property name="propagate-natural-height">1</property>
+            <child>
+              <object class="GtkListBox" id="interfaces">
+                <property name="selection-mode">none</property>
+                <property name="activate-on-single-click">0</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>


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