[gtk+] inspector: UI refresh



commit aa193ce4a4485ab37f703ea44e6342580a3d3eb6
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Mar 6 20:41:28 2016 -0500

    inspector: UI refresh
    
    The sidebar in the object page was using up more space than it deserves.
    Replace it with a combo box in the subheader. Now that we have more space,
    put the CSS node tree and the style properties in the same page again.

 gtk/inspector/Makefile.inc        |    2 +
 gtk/inspector/actions.c           |    9 -
 gtk/inspector/actions.ui          |    9 -
 gtk/inspector/css-node-tree.c     |   71 -------
 gtk/inspector/css-node-tree.ui    |   86 +---------
 gtk/inspector/gestures.c          |   19 +--
 gtk/inspector/gtkstackcombo.c     |  239 ++++++++++++++++++++++++
 gtk/inspector/gtkstackcombo.h     |   46 +++++
 gtk/inspector/init.c              |    2 +
 gtk/inspector/magnifier.c         |   73 +++++++-
 gtk/inspector/magnifier.ui        |   41 ----
 gtk/inspector/menu.c              |    9 -
 gtk/inspector/menu.ui             |    9 -
 gtk/inspector/misc-info.c         |    7 -
 gtk/inspector/misc-info.ui        |   10 +-
 gtk/inspector/object-hierarchy.c  |    6 -
 gtk/inspector/object-hierarchy.ui |   13 +-
 gtk/inspector/prop-list.c         |   44 +++--
 gtk/inspector/prop-list.ui        |   57 ------
 gtk/inspector/selector.c          |    6 -
 gtk/inspector/selector.ui         |   12 +-
 gtk/inspector/signals-list.c      |   94 ++++++++--
 gtk/inspector/signals-list.ui     |   57 +------
 gtk/inspector/size-groups.c       |   13 +--
 gtk/inspector/window.c            |   44 +++++-
 gtk/inspector/window.h            |    3 +
 gtk/inspector/window.ui           |  362 ++++++++++++++++++++++++-------------
 27 files changed, 766 insertions(+), 577 deletions(-)
---
diff --git a/gtk/inspector/Makefile.inc b/gtk/inspector/Makefile.inc
index e34a805..7641d3a 100644
--- a/gtk/inspector/Makefile.inc
+++ b/gtk/inspector/Makefile.inc
@@ -8,6 +8,7 @@ inspector_c_sources =                   \
        inspector/general.c             \
        inspector/gestures.c            \
        inspector/graphdata.c           \
+        inspector/gtkstackcombo.c       \
        inspector/gtktreemodelcssnode.c \
        inspector/init.c                \
        inspector/inspect-button.c      \
@@ -38,6 +39,7 @@ inspector_h_sources =                         \
        inspector/general.h             \
        inspector/gestures.h            \
        inspector/graphdata.h           \
+        inspector/gtkstackcombo.h       \
        inspector/gtktreemodelcssnode.h \
        inspector/init.h                \
        inspector/magnifier.h           \
diff --git a/gtk/inspector/actions.c b/gtk/inspector/actions.c
index 4d7523a..a3d0b0b 100644
--- a/gtk/inspector/actions.c
+++ b/gtk/inspector/actions.c
@@ -44,7 +44,6 @@ struct _GtkInspectorActionsPrivate
   GtkListStore *model;
   GHashTable *groups;
   GHashTable *iters;
-  GtkWidget *object_title;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorActions, gtk_inspector_actions, GTK_TYPE_BOX)
@@ -231,13 +230,6 @@ gtk_inspector_actions_set_object (GtkInspectorActions *sl,
           g_free (prefixes);
         }
     }
-
-  if (G_IS_OBJECT (object))
-    {
-      const gchar *title;
-      title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-      gtk_label_set_label (GTK_LABEL (sl->priv->object_title), title);
-    }
 }
 
 static void
@@ -286,7 +278,6 @@ gtk_inspector_actions_class_init (GtkInspectorActionsClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/actions.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorActions, model);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorActions, object_title);
   gtk_widget_class_bind_template_callback (widget_class, row_activated);
 }
 
diff --git a/gtk/inspector/actions.ui b/gtk/inspector/actions.ui
index 471a436..c87a06b 100644
--- a/gtk/inspector/actions.ui
+++ b/gtk/inspector/actions.ui
@@ -13,15 +13,6 @@
   <template class="GtkInspectorActions" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkLabel" id="object_title">
-        <property name="visible">True</property>
-        <property name="halign">fill</property>
-        <property name="valign">center</property>
-        <property name="margin-top">12</property>
-        <property name="margin-bottom">12</property>
-      </object>
-    </child>
-    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="expand">True</property>
diff --git a/gtk/inspector/css-node-tree.c b/gtk/inspector/css-node-tree.c
index a207e18..fe486cd 100644
--- a/gtk/inspector/css-node-tree.c
+++ b/gtk/inspector/css-node-tree.c
@@ -65,15 +65,10 @@ enum
 struct _GtkInspectorCssNodeTreePrivate
 {
   GtkWidget *node_tree;
-  GtkWidget *stack;
-  GtkWidget *node_list_button;
-  GtkWidget *prop_list_button;
-  GtkWidget *css_node_info;
   GtkTreeModel *node_model;
   GtkTreeViewColumn *node_name_column;
   GtkTreeViewColumn *node_id_column;
   GtkTreeViewColumn *node_classes_column;
-  GtkWidget *object_title;
   GtkListStore *prop_model;
   GtkWidget *prop_tree;
   GtkTreeViewColumn *prop_name_column;
@@ -141,22 +136,6 @@ row_activated (GtkTreeView             *tv,
 }
 
 static void
-switch_to_node_list (GtkInspectorCssNodeTree *cnt)
-{
-  gtk_stack_set_visible_child_name (GTK_STACK (cnt->priv->stack), "node-list");
-  gtk_widget_show (cnt->priv->prop_list_button);
-  gtk_widget_hide (cnt->priv->node_list_button);
-}
-
-static void
-switch_to_prop_list (GtkInspectorCssNodeTree *cnt)
-{
-  gtk_stack_set_visible_child_name (GTK_STACK (cnt->priv->stack), "prop-list");
-  gtk_widget_show (cnt->priv->node_list_button);
-  gtk_widget_hide (cnt->priv->prop_list_button);
-}
-
-static void
 show_node_popover (GtkInspectorCssNodeTree *cnt,
                    gdouble                  x,
                    gdouble                  y)
@@ -228,7 +207,6 @@ show_node_popover (GtkInspectorCssNodeTree *cnt,
                          "visible", TRUE,
                          "text", _("CSS properties"),
                          NULL);
-  g_signal_connect_swapped (button, "clicked", G_CALLBACK (switch_to_prop_list), cnt);
   gtk_container_add (GTK_CONTAINER (box), button);
 
   gtk_tree_path_free (path);
@@ -331,23 +309,16 @@ gtk_inspector_css_node_tree_class_init (GtkInspectorCssNodeTreeClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/css-node-tree.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, node_tree);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, object_title);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, node_name_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, node_id_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, node_classes_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, prop_name_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, prop_model);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, prop_name_column);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, stack);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, prop_list_button);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, node_list_button);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorCssNodeTree, css_node_info);
 
   gtk_widget_class_bind_template_callback (widget_class, row_activated);
   gtk_widget_class_bind_template_callback (widget_class, selection_changed);
   gtk_widget_class_bind_template_callback (widget_class, button_pressed);
-  gtk_widget_class_bind_template_callback (widget_class, switch_to_node_list);
-  gtk_widget_class_bind_template_callback (widget_class, switch_to_prop_list);
 }
 
 static int
@@ -486,7 +457,6 @@ gtk_inspector_css_node_tree_set_object (GtkInspectorCssNodeTree *cnt,
                                         GObject                 *object)
 {
   GtkInspectorCssNodeTreePrivate *priv;
-  const gchar *title;
   GtkCssNode *node, *root;
   GtkTreePath *path;
   GtkTreeIter iter;
@@ -495,9 +465,6 @@ gtk_inspector_css_node_tree_set_object (GtkInspectorCssNodeTree *cnt,
 
   priv = cnt->priv;
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  gtk_label_set_label (GTK_LABEL (priv->object_title), title);
-
   if (!GTK_IS_WIDGET (object))
     {
       gtk_widget_hide (GTK_WIDGET (cnt));
@@ -506,8 +473,6 @@ gtk_inspector_css_node_tree_set_object (GtkInspectorCssNodeTree *cnt,
 
   gtk_widget_show (GTK_WIDGET (cnt));
 
-  switch_to_node_list (cnt);
-
   root = node = gtk_widget_get_css_node (GTK_WIDGET (object));
   while (gtk_css_node_get_parent (root))
     root = gtk_css_node_get_parent (root);
@@ -585,11 +550,6 @@ gtk_inspector_css_node_tree_set_node (GtkInspectorCssNodeTree *cnt,
                                       GtkCssNode              *node)
 {
   GtkInspectorCssNodeTreePrivate *priv = cnt->priv;
-  GString *s;
-  GType type;
-  const gchar *name;
-  gchar **strv;
-  gint i;
 
   if (priv->node == node)
     return;
@@ -604,37 +564,6 @@ gtk_inspector_css_node_tree_set_node (GtkInspectorCssNodeTree *cnt,
   priv->node = node;
 
   g_signal_connect (node, "style-changed", G_CALLBACK (gtk_inspector_css_node_tree_update_style_cb), cnt);
-
-  s = g_string_new ("");
-  type = gtk_css_node_get_widget_type (node);
-  if (type != G_TYPE_NONE && type != G_TYPE_INVALID)
-    g_string_append (s, g_type_name (type));
-
-  name = gtk_css_node_get_name (node);
-  if (name)
-    {
-      if (s->len > 0)
-        g_string_append (s, " — ");
-      g_string_append (s, name);
-    }
-
-  strv = gtk_css_node_get_classes (node);
-  if (strv[0] != NULL)
-    {
-      strv_sort (strv);
-      if (s->len > 0)
-        g_string_append (s, " — ");
-      for (i = 0; strv[i]; i++)
-        {
-          if (i > 0)
-            g_string_append (s, " ");
-          g_string_append (s, strv[i]);
-        }
-    }
-
-  gtk_label_set_label (GTK_LABEL (cnt->priv->css_node_info), s->str);
-  g_strfreev (strv);
-  g_string_free (s, TRUE);
 }
 
 // vim: set et sw=2 ts=2:
diff --git a/gtk/inspector/css-node-tree.ui b/gtk/inspector/css-node-tree.ui
index cee1aa5..48e227f 100644
--- a/gtk/inspector/css-node-tree.ui
+++ b/gtk/inspector/css-node-tree.ui
@@ -11,65 +11,11 @@
   <template class="GtkInspectorCssNodeTree" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkBox">
+      <object class="GtkPaned" id="paned">
         <property name="visible">1</property>
-        <property name="margin-start">6</property>
-        <property name="margin-end">6</property>
-        <child type="center">
-          <object class="GtkLabel" id="object_title">
-            <property name="visible">1</property>
-            <property name="valign">center</property>
-            <property name="margin">12</property>
-          </object>
-        </child>
-        <child>
-          <object class="GtkButton" id="node_list_button">
-            <property name="valign">center</property>
-            <property name="no-show-all">1</property>
-            <property name="relief">none</property>
-            <property name="tooltip-text" translatable="yes">Show all CSS nodes</property>
-            <signal name="clicked" handler="switch_to_node_list" swapped="1"/>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">1</property>
-                <property name="icon-name">pan-start-symbolic</property>
-                <property name="icon-size">1</property>
-              </object>
-            </child>
-            <style>
-              <class name="image-button"/>
-            </style>
-          </object>
-        </child>
-        <child>
-          <object class="GtkButton" id="prop_list_button">
-            <property name="visible">1</property>
-            <property name="valign">center</property>
-            <property name="no-show-all">1</property>
-            <property name="relief">none</property>
-            <property name="tooltip-text" translatable="yes">Show CSS properties</property>
-            <signal name="clicked" handler="switch_to_prop_list" swapped="1"/>
-            <child>
-              <object class="GtkImage">
-                <property name="visible">1</property>
-                <property name="icon-name">pan-end-symbolic</property>
-                <property name="icon-size">1</property>
-              </object>
-            </child>
-            <style>
-              <class name="image-button"/>
-            </style>
-          </object>
-          <packing>
-            <property name="pack-type">end</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <child>
-      <object class="GtkStack" id="stack">
-        <property name="visible">1</property>
-        <property name="transition-type">slide-left-right</property>
+        <property name="wide-handle">1</property>
+        <property name="orientation">horizontal</property>
+        <property name="position">300</property>
         <child>
           <object class="GtkScrolledWindow">
             <property name="visible">1</property>
@@ -143,33 +89,12 @@
               </object>
             </child>
           </object>
-          <packing>
-            <property name="name">node-list</property>
-          </packing>
         </child>
         <child>
           <object class="GtkBox">
             <property name="visible">1</property>
             <property name="orientation">vertical</property>
             <child>
-              <object class="GtkBox">
-                <property name="visible">1</property>
-                <property name="orientation">horizontal</property>
-                <property name="margin">12</property>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">1</property>
-                    <property name="label" translatable="yes">Node:</property>
-                  </object>
-                </child>
-                <child type="center">
-                  <object class="GtkLabel" id="css_node_info">
-                    <property name="visible">1</property>
-                  </object>
-                </child>
-              </object>
-            </child>
-            <child>
               <object class="GtkScrolledWindow">
                 <property name="visible">1</property>
                 <property name="expand">1</property>
@@ -233,9 +158,6 @@
               </object>
             </child>
           </object>
-          <packing>
-            <property name="name">prop-list</property>
-          </packing>
         </child>
       </object>
     </child>
diff --git a/gtk/inspector/gestures.c b/gtk/inspector/gestures.c
index 5c5ca75..e448d5f 100644
--- a/gtk/inspector/gestures.c
+++ b/gtk/inspector/gestures.c
@@ -53,7 +53,8 @@ gtk_inspector_gestures_init (GtkInspectorGestures *sl)
                 "orientation", GTK_ORIENTATION_VERTICAL,
                 "margin-start", 60,
                 "margin-end", 60,
-                "margin-bottom", 60,
+                "margin-top", 60,
+                "margin-bottom", 30,
                 "spacing", 10,
                 NULL);
 }
@@ -169,7 +170,7 @@ add_gesture_group (GtkInspectorGestures *sl,
       add_gesture (sl, object, listbox, g, phase);
       g_hash_table_remove (hash, g);
     }
-  g_list_free (list); 
+  g_list_free (list);
 
   gtk_container_add (GTK_CONTAINER (sl), frame);
 }
@@ -182,8 +183,6 @@ gtk_inspector_gestures_set_object (GtkInspectorGestures *sl,
   GHashTableIter iter;
   GList *list, *l;
   gint phase;
-  const gchar *title;
-  GtkWidget *label;
 
   clear_all (sl);
   gtk_widget_hide (GTK_WIDGET (sl));
@@ -191,16 +190,6 @@ gtk_inspector_gestures_set_object (GtkInspectorGestures *sl,
   if (!GTK_IS_WIDGET (object))
     return;
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  label = gtk_label_new (title);
-
-  gtk_widget_set_halign (label, GTK_ALIGN_FILL);
-  gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
-  gtk_widget_set_margin_top (label, 12);
-  gtk_widget_set_margin_bottom (label, 30);
-  gtk_widget_show (label);
-  gtk_container_add (GTK_CONTAINER (sl), label);
-
   hash = g_hash_table_new (g_direct_hash, g_direct_equal);
   for (phase = GTK_PHASE_NONE; phase <= GTK_PHASE_TARGET; phase++)
     {
@@ -209,7 +198,7 @@ gtk_inspector_gestures_set_object (GtkInspectorGestures *sl,
         g_hash_table_insert (hash, l->data, GINT_TO_POINTER (phase));
       g_list_free (list);
     }
-      
+
   if (g_hash_table_size (hash))
     gtk_widget_show (GTK_WIDGET (sl));
 
diff --git a/gtk/inspector/gtkstackcombo.c b/gtk/inspector/gtkstackcombo.c
new file mode 100644
index 0000000..bb93565
--- /dev/null
+++ b/gtk/inspector/gtkstackcombo.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 2016 Red Hat, Inc.
+ *
+ * This program 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 program 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 program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include "config.h"
+#include "gtkstackcombo.h"
+#include "gtkbox.h"
+#include "gtkstack.h"
+#include "gtkcomboboxtext.h"
+#include "gtkprivate.h"
+#include "gtkintl.h"
+
+struct _GtkStackCombo
+{
+  GtkBox box;
+
+  GtkComboBox *combo;
+  GtkStack *stack;
+  GBinding *binding;
+};
+
+struct _GtkStackComboClass {
+  GtkBoxClass parent_class;
+};
+
+enum {
+  PROP_0,
+  PROP_STACK
+};
+
+G_DEFINE_TYPE (GtkStackCombo, gtk_stack_combo, GTK_TYPE_BOX)
+
+static void
+gtk_stack_combo_init (GtkStackCombo *self)
+{
+  self->stack = NULL;
+  self->combo = GTK_COMBO_BOX (gtk_combo_box_text_new ());
+  gtk_widget_show (GTK_WIDGET (self->combo));
+  gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->combo), FALSE, FALSE, 0);
+}
+
+static void gtk_stack_combo_set_stack (GtkStackCombo *self,
+                                       GtkStack      *stack);
+
+static void
+rebuild_combo (GtkStackCombo *self)
+{
+  gtk_stack_combo_set_stack (self, self->stack);
+}
+
+static void
+on_child_visible_changed (GtkStackCombo *self)
+{
+  rebuild_combo (self);
+}
+
+static void
+add_child (GtkWidget     *widget,
+           GtkStackCombo *self)
+{
+  g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (on_child_visible_changed), self);
+  g_signal_connect_swapped (widget, "notify::visible", G_CALLBACK (on_child_visible_changed), self);
+
+  if (gtk_widget_get_visible (widget))
+    {
+      char *name, *title;
+
+      gtk_container_child_get (GTK_CONTAINER (self->stack), widget,
+                               "name", &name,
+                              "title", &title,
+                               NULL);
+
+      gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (self->combo), name, title);
+
+      g_free (name);
+      g_free (title);
+    }
+}
+
+static void
+populate_combo (GtkStackCombo *self)
+{
+  gtk_container_foreach (GTK_CONTAINER (self->stack), (GtkCallback)add_child, self);
+}
+
+static void
+clear_combo (GtkStackCombo *self)
+{
+  gtk_combo_box_text_remove_all (GTK_COMBO_BOX_TEXT (self->combo));
+}
+
+static void
+on_stack_child_added (GtkContainer  *container,
+                      GtkWidget     *widget,
+                      GtkStackCombo *self)
+{
+  rebuild_combo (self);
+}
+
+static void
+on_stack_child_removed (GtkContainer  *container,
+                        GtkWidget     *widget,
+                        GtkStackCombo *self)
+{
+  g_signal_handlers_disconnect_by_func (widget, G_CALLBACK (on_child_visible_changed), self);
+  rebuild_combo (self);
+}
+
+static void
+disconnect_stack_signals (GtkStackCombo *self)
+{
+  g_binding_unbind (self->binding);
+  self->binding = NULL;
+  g_signal_handlers_disconnect_by_func (self->stack, on_stack_child_added, self);
+  g_signal_handlers_disconnect_by_func (self->stack, on_stack_child_removed, self);
+  g_signal_handlers_disconnect_by_func (self->stack, disconnect_stack_signals, self);
+}
+
+static void
+connect_stack_signals (GtkStackCombo *self)
+{
+  g_signal_connect_after (self->stack, "add", G_CALLBACK (on_stack_child_added), self);
+  g_signal_connect_after (self->stack, "remove", G_CALLBACK (on_stack_child_removed), self);
+  g_signal_connect_swapped (self->stack, "destroy", G_CALLBACK (disconnect_stack_signals), self);
+  self->binding = g_object_bind_property (self->stack, "visible-child-name", self->combo, "active-id", 
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
+}
+
+static void
+gtk_stack_combo_set_stack (GtkStackCombo *self,
+                           GtkStack      *stack)
+{
+  if (stack)
+    g_object_ref (stack);
+
+  if (self->stack)
+    {
+      disconnect_stack_signals (self);
+      clear_combo (self);
+      g_clear_object (&self->stack);
+    }
+
+  if (stack)
+    {
+      self->stack = stack;
+      populate_combo (self);
+      connect_stack_signals (self);
+    }
+}
+
+static void
+gtk_stack_combo_get_property (GObject    *object,
+                              guint       prop_id,
+                              GValue     *value,
+                              GParamSpec *pspec)
+{
+  GtkStackCombo *self = GTK_STACK_COMBO (object);
+
+  switch (prop_id)
+    {
+    case PROP_STACK:
+      g_value_set_object (value, self->stack);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_stack_combo_set_property (GObject      *object,
+                              guint         prop_id,
+                              const GValue *value,
+                              GParamSpec   *pspec)
+{
+  GtkStackCombo *self = GTK_STACK_COMBO (object);
+
+  switch (prop_id)
+    {
+    case PROP_STACK:
+      if (self->stack != g_value_get_object (value))
+        {
+          gtk_stack_combo_set_stack (self, g_value_get_object (value));
+          g_object_notify (G_OBJECT (self), "stack");
+        }
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    }
+}
+
+static void
+gtk_stack_combo_dispose (GObject *object)
+{
+  GtkStackCombo *self = GTK_STACK_COMBO (object);
+
+  gtk_stack_combo_set_stack (self, NULL);
+
+  G_OBJECT_CLASS (gtk_stack_combo_parent_class)->dispose (object);
+}
+
+static void
+gtk_stack_combo_class_init (GtkStackComboClass *class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+  object_class->get_property = gtk_stack_combo_get_property;
+  object_class->set_property = gtk_stack_combo_set_property;
+  object_class->dispose = gtk_stack_combo_dispose;
+
+  g_object_class_install_property (object_class,
+                                   PROP_STACK,
+                                   g_param_spec_object ("stack",
+                                                        P_("Stack"),
+                                                        P_("Stack"),
+                                                        GTK_TYPE_STACK,
+                                                        GTK_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT));
+
+  gtk_widget_class_set_css_name (widget_class, "stackcombo");
+}
diff --git a/gtk/inspector/gtkstackcombo.h b/gtk/inspector/gtkstackcombo.h
new file mode 100644
index 0000000..9b5738e
--- /dev/null
+++ b/gtk/inspector/gtkstackcombo.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2016 Red Hat, Inc.
+ *
+ * This program 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 program 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 program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __GTK_STACK_COMBO_H__
+#define __GTK_STACK_COMBO_H__
+
+#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
+#error "Only <gtk/gtk.h> can be included directly."
+#endif
+
+#include <gtk/gtkcombobox.h>
+#include <gtk/gtkstack.h>
+
+G_BEGIN_DECLS
+
+#define GTK_TYPE_STACK_COMBO            (gtk_stack_combo_get_type ())
+#define GTK_STACK_COMBO(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_STACK_COMBO, 
GtkStackCombo))
+#define GTK_STACK_COMBO_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_STACK_COMBO, 
GtkStackComboClass))
+#define GTK_IS_STACK_COMBO(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_STACK_COMBO))
+#define GTK_IS_STACK_COMBO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_STACK_COMBO))
+#define GTK_STACK_COMBO_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_STACK_COMBO, 
GtkStackComboClass))
+
+typedef struct _GtkStackCombo              GtkStackCombo;
+typedef struct _GtkStackComboClass         GtkStackComboClass;
+
+GType        gtk_stack_combo_get_type          (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif /* __GTK_STACK_COMBO_H__ */
diff --git a/gtk/inspector/init.c b/gtk/inspector/init.c
index 8e4c216..53a9b9e 100644
--- a/gtk/inspector/init.c
+++ b/gtk/inspector/init.c
@@ -45,6 +45,7 @@
 #include "statistics.h"
 #include "visual.h"
 #include "window.h"
+#include "gtkstackcombo.h"
 
 #include "gtkmagnifierprivate.h"
 
@@ -77,6 +78,7 @@ gtk_inspector_init (void)
   g_type_ensure (GTK_TYPE_INSPECTOR_STATISTICS);
   g_type_ensure (GTK_TYPE_INSPECTOR_VISUAL);
   g_type_ensure (GTK_TYPE_INSPECTOR_WINDOW);
+  g_type_ensure (GTK_TYPE_STACK_COMBO);
 
   if (extension_point == NULL)
     {
diff --git a/gtk/inspector/magnifier.c b/gtk/inspector/magnifier.c
index 5e6893e..f4a0f7e 100644
--- a/gtk/inspector/magnifier.c
+++ b/gtk/inspector/magnifier.c
@@ -23,13 +23,19 @@
 #include "gtkmagnifierprivate.h"
 
 #include "gtklabel.h"
+#include "gtkadjustment.h"
 
+enum
+{
+  PROP_0,
+  PROP_ADJUSTMENT
+};
 
 struct _GtkInspectorMagnifierPrivate
 {
   GtkWidget *object;
   GtkWidget *magnifier;
-  GtkWidget *object_title;
+  GtkAdjustment *adjustment;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorMagnifier, gtk_inspector_magnifier, GTK_TYPE_BOX)
@@ -45,8 +51,6 @@ void
 gtk_inspector_magnifier_set_object (GtkInspectorMagnifier *sl,
                                     GObject              *object)
 {
-  const gchar *title;
-
   sl->priv->object = NULL;
 
   if (!GTK_IS_WIDGET (object) || !gtk_widget_is_visible (GTK_WIDGET (object)))
@@ -56,9 +60,6 @@ gtk_inspector_magnifier_set_object (GtkInspectorMagnifier *sl,
       return;
     }
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  gtk_label_set_label (GTK_LABEL (sl->priv->object_title), title);
-
   gtk_widget_show (GTK_WIDGET (sl));
 
   sl->priv->object = GTK_WIDGET (object);
@@ -68,13 +69,71 @@ gtk_inspector_magnifier_set_object (GtkInspectorMagnifier *sl,
 }
 
 static void
+get_property (GObject    *object,
+              guint       param_id,
+              GValue     *value,
+              GParamSpec *pspec)
+{
+  GtkInspectorMagnifier *sl = GTK_INSPECTOR_MAGNIFIER (object);
+
+  switch (param_id)
+    {
+    case PROP_ADJUSTMENT:
+      g_value_take_object (value, sl->priv->adjustment);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+    }
+}
+
+static void
+set_property (GObject      *object,
+              guint         param_id,
+              const GValue *value,
+              GParamSpec   *pspec)
+{
+  GtkInspectorMagnifier *sl = GTK_INSPECTOR_MAGNIFIER (object);
+
+  switch (param_id)
+    {
+    case PROP_ADJUSTMENT:
+      sl->priv->adjustment = g_value_get_object (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+    }
+}
+
+static void
+constructed (GObject *object)
+{
+  GtkInspectorMagnifier *sl = GTK_INSPECTOR_MAGNIFIER (object);
+
+  g_object_bind_property (sl->priv->adjustment, "value",
+                          sl->priv->magnifier, "magnification",
+                          G_BINDING_SYNC_CREATE);
+}
+
+static void
 gtk_inspector_magnifier_class_init (GtkInspectorMagnifierClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->get_property = get_property;
+  object_class->set_property = set_property;
+  object_class->constructed = constructed;
+
+  g_object_class_install_property (object_class, PROP_ADJUSTMENT,
+      g_param_spec_object ("adjustment", NULL, NULL,
+                           GTK_TYPE_ADJUSTMENT, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/magnifier.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMagnifier, magnifier);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMagnifier, object_title);
 }
 
 // vim: set et sw=2 ts=2:
diff --git a/gtk/inspector/magnifier.ui b/gtk/inspector/magnifier.ui
index b257fdb..e426408 100644
--- a/gtk/inspector/magnifier.ui
+++ b/gtk/inspector/magnifier.ui
@@ -3,38 +3,6 @@
   <template class="GtkInspectorMagnifier" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="orientation">horizontal</property>
-        <property name="spacing">6</property>
-        <property name="margin">6</property>
-        <child>
-          <object class="GtkScale" id="magnification">
-            <property name="visible">True</property>
-            <property name="orientation">horizontal</property>
-            <property name="width-request">150</property>
-            <property name="draw-value">False</property>
-            <property name="adjustment">adjustment</property>
-            <marks>
-              <mark value="1.0" position="bottom"/>
-              <mark value="2.0" position="bottom"/>
-              <mark value="3.0" position="bottom"/>
-              <mark value="4.0" position="bottom"/>
-              <mark value="5.0" position="bottom"/>
-            </marks>
-          </object>
-          <packing>
-            <property name="pack-type">start</property>
-          </packing>
-        </child>
-        <child type="center">
-          <object class="GtkLabel" id="object_title">
-            <property name="visible">True</property>
-          </object>
-        </child>
-      </object>
-    </child>
-    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="hscrollbar-policy">automatic</property>
@@ -45,18 +13,9 @@
           <object class="GtkMagnifier" id="magnifier">
             <property name="visible">True</property>
             <property name="resize">True</property>
-            <property name="magnification" bind-source="adjustment" bind-property="value" 
bind-flags="sync-create"/>
           </object>
         </child>
       </object>
     </child>
   </template>
-  <object class="GtkAdjustment" id="adjustment">
-    <property name="lower">1.0</property>
-    <property name="upper">5.0</property>
-    <property name="page-size">0.0</property>
-    <property name="page-increment">0.1</property>
-    <property name="step-increment">0.1</property>
-    <property name="value">2.0</property>
-  </object>
 </interface>
diff --git a/gtk/inspector/menu.c b/gtk/inspector/menu.c
index 6a9a9d2..8a4d1ad 100644
--- a/gtk/inspector/menu.c
+++ b/gtk/inspector/menu.c
@@ -37,7 +37,6 @@ enum
 struct _GtkInspectorMenuPrivate
 {
   GtkTreeStore *model;
-  GtkWidget *object_title;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorMenu, gtk_inspector_menu, GTK_TYPE_BOX)
@@ -133,13 +132,6 @@ gtk_inspector_menu_set_object (GtkInspectorMenu *sl,
   
   if (G_IS_MENU_MODEL (object))
     add_menu (sl, G_MENU_MODEL (object), NULL);
-
-  if (G_IS_OBJECT (object))
-    {
-      const gchar *title;
-      title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-      gtk_label_set_label (GTK_LABEL (sl->priv->object_title), title);
-    }
 }
 
 static void
@@ -149,7 +141,6 @@ gtk_inspector_menu_class_init (GtkInspectorMenuClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/menu.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMenu, model);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMenu, object_title);
 }
 
 // vim: set et sw=2 ts=2:
diff --git a/gtk/inspector/menu.ui b/gtk/inspector/menu.ui
index 2338d95..970bc6b 100644
--- a/gtk/inspector/menu.ui
+++ b/gtk/inspector/menu.ui
@@ -12,15 +12,6 @@
   <template class="GtkInspectorMenu" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkLabel" id="object_title">
-        <property name="visible">True</property>
-        <property name="halign">fill</property>
-        <property name="valign">center</property>
-        <property name="margin-top">12</property>
-        <property name="margin-bottom">12</property>
-      </object>
-    </child>
-    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="expand">True</property>
diff --git a/gtk/inspector/misc-info.c b/gtk/inspector/misc-info.c
index cc54d05..53182c7 100644
--- a/gtk/inspector/misc-info.c
+++ b/gtk/inspector/misc-info.c
@@ -79,7 +79,6 @@ struct _GtkInspectorMiscInfoPrivate {
   GtkWidget *is_toplevel;
   GtkWidget *child_visible_row;
   GtkWidget *child_visible;
-  GtkWidget *object_title;
 
   guint update_source_id;
   gint64 last_frame;
@@ -393,8 +392,6 @@ void
 gtk_inspector_misc_info_set_object (GtkInspectorMiscInfo *sl,
                                     GObject              *object)
 {
-  const gchar *title;
-
   if (sl->priv->object)
     {
       g_signal_handlers_disconnect_by_func (sl->priv->object, state_flags_changed, sl);
@@ -411,9 +408,6 @@ gtk_inspector_misc_info_set_object (GtkInspectorMiscInfo *sl,
   g_object_weak_ref (G_OBJECT (sl), disconnect_each_other, object);
   g_object_weak_ref (object, disconnect_each_other, sl);
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  gtk_label_set_label (GTK_LABEL (sl->priv->object_title), title);
-
   if (GTK_IS_WIDGET (object))
     {
       gtk_widget_show (sl->priv->refcount_row);
@@ -621,7 +615,6 @@ gtk_inspector_misc_info_class_init (GtkInspectorMiscInfoClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, is_toplevel);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, child_visible_row);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, child_visible);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorMiscInfo, object_title);
 
   gtk_widget_class_bind_template_callback (widget_class, show_default_widget);
   gtk_widget_class_bind_template_callback (widget_class, show_focus_widget);
diff --git a/gtk/inspector/misc-info.ui b/gtk/inspector/misc-info.ui
index 5ed19d3..b37d747 100644
--- a/gtk/inspector/misc-info.ui
+++ b/gtk/inspector/misc-info.ui
@@ -7,18 +7,10 @@
         <property name="orientation">vertical</property>
         <property name="margin-start">60</property>
         <property name="margin-end">60</property>
+        <property name="margin-top">30</property>
         <property name="margin-bottom">60</property>
         <property name="spacing">10</property>
         <child>
-          <object class="GtkLabel" id="object_title">
-            <property name="visible">True</property>
-            <property name="halign">fill</property>
-            <property name="valign">center</property>
-            <property name="margin-top">12</property>
-            <property name="margin-bottom">30</property>
-          </object>
-        </child>
-        <child>
           <object class="GtkFrame">
             <property name="visible">True</property>
             <property name="halign">center</property>
diff --git a/gtk/inspector/object-hierarchy.c b/gtk/inspector/object-hierarchy.c
index 94e0063..6acfea4 100644
--- a/gtk/inspector/object-hierarchy.c
+++ b/gtk/inspector/object-hierarchy.c
@@ -40,7 +40,6 @@ struct _GtkInspectorObjectHierarchyPrivate
 {
   GtkTreeStore *model;
   GtkTreeView *tree;
-  GtkWidget *object_title;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorObjectHierarchy, gtk_inspector_object_hierarchy, GTK_TYPE_BOX)
@@ -60,7 +59,6 @@ gtk_inspector_object_hierarchy_class_init (GtkInspectorObjectHierarchyClass *kla
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gtk/libgtk/inspector/object-hierarchy.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectHierarchy, model);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectHierarchy, tree);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectHierarchy, object_title);
 }
 
 void
@@ -75,7 +73,6 @@ gtk_inspector_object_hierarchy_set_object (GtkInspectorObjectHierarchy *oh,
   GHashTableIter hit;
   GType *ifaces;
   gint i;
-  const gchar *title;
 
   gtk_tree_store_clear (oh->priv->model);
 
@@ -85,9 +82,6 @@ gtk_inspector_object_hierarchy_set_object (GtkInspectorObjectHierarchy *oh,
   interfaces = g_hash_table_new (g_str_hash, g_str_equal);
   type = ((GTypeInstance*)object)->g_class->g_type;
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  gtk_label_set_label (GTK_LABEL (oh->priv->object_title), title);
-
   do
     {
       class_name = g_type_name (type);
diff --git a/gtk/inspector/object-hierarchy.ui b/gtk/inspector/object-hierarchy.ui
index 7db49b1..0f5c61b 100644
--- a/gtk/inspector/object-hierarchy.ui
+++ b/gtk/inspector/object-hierarchy.ui
@@ -8,15 +8,6 @@
   <template class="GtkInspectorObjectHierarchy" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkLabel" id="object_title">
-        <property name="visible">True</property>
-        <property name="halign">fill</property>
-        <property name="valign">center</property>
-        <property name="margin-top">12</property>
-        <property name="margin-bottom">12</property>
-      </object>
-    </child>
-    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="hscrollbar-policy">never</property>
@@ -27,6 +18,7 @@
             <property name="visible">True</property>
             <property name="model">model</property>
             <property name="enable-search">False</property>
+            <property name="headers-visible">False</property>
             <property name="enable-tree-lines">1</property>
             <property name="show-expanders">0</property>
             <property name="level-indentation">18</property>
@@ -37,14 +29,13 @@
             </child>
             <child>
               <object class="GtkTreeViewColumn">
-                <property name="title" translatable="yes">Class Hierarchy</property>
                 <child>
                   <object class="GtkCellRendererText">
                     <property name="scale">0.8</property>
                   </object>
                   <attributes>
                     <attribute name="text">0</attribute>
-                  </attributes> 
+                  </attributes>
                 </child>
               </object>
             </child>
diff --git a/gtk/inspector/prop-list.c b/gtk/inspector/prop-list.c
index e265195..dc8eb84 100644
--- a/gtk/inspector/prop-list.c
+++ b/gtk/inspector/prop-list.c
@@ -51,7 +51,8 @@ enum
 {
   PROP_0,
   PROP_OBJECT_TREE,
-  PROP_CHILD_PROPERTIES
+  PROP_CHILD_PROPERTIES,
+  PROP_SEARCH_ENTRY
 };
 
 struct _GtkInspectorPropListPrivate
@@ -67,7 +68,6 @@ struct _GtkInspectorPropListPrivate
   GtkWidget *tree;
   GtkWidget *search_entry;
   GtkWidget *search_stack;
-  GtkWidget *object_title;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorPropList, gtk_inspector_prop_list, GTK_TYPE_BOX)
@@ -90,7 +90,7 @@ key_press_event (GtkWidget            *window,
 
   if (gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (pl->priv->search_entry), event))
     {
-      gtk_stack_set_visible_child_name (GTK_STACK (pl->priv->search_stack), "search");
+      gtk_stack_set_visible_child (GTK_STACK (pl->priv->search_stack), pl->priv->search_entry);
       return GDK_EVENT_STOP;
     }
   return GDK_EVENT_PROPAGATE;
@@ -114,8 +114,6 @@ gtk_inspector_prop_list_init (GtkInspectorPropList *pl)
   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (pl->priv->model),
                                         COLUMN_NAME,
                                         GTK_SORT_ASCENDING);
-  gtk_tree_view_set_search_entry (GTK_TREE_VIEW (pl->priv->tree),
-                                  GTK_ENTRY (pl->priv->search_entry));
   pl->priv->prop_iters = g_hash_table_new_full (g_str_hash,
                                                 g_str_equal,
                                                 NULL,
@@ -140,6 +138,10 @@ get_property (GObject    *object,
         g_value_set_boolean (value, pl->priv->child_properties);
         break;
 
+      case PROP_SEARCH_ENTRY:
+        g_value_take_object (value, pl->priv->search_entry);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
         break;
@@ -164,6 +166,10 @@ set_property (GObject      *object,
         pl->priv->child_properties = g_value_get_boolean (value);
         break;
 
+      case PROP_SEARCH_ENTRY:
+        pl->priv->search_entry = g_value_get_object (value);
+        break;
+
       default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
         break;
@@ -250,6 +256,20 @@ finalize (GObject *object)
 }
 
 static void
+constructed (GObject *object)
+{
+  GtkInspectorPropList *pl = GTK_INSPECTOR_PROP_LIST (object);
+
+  pl->priv->search_stack = gtk_widget_get_parent (pl->priv->search_entry);
+
+  gtk_tree_view_set_search_entry (GTK_TREE_VIEW (pl->priv->tree),
+                                  GTK_ENTRY (pl->priv->search_entry));
+
+  g_signal_connect (pl->priv->search_entry, "stop-search",
+                    G_CALLBACK (search_close_clicked), pl);
+}
+
+static void
 gtk_inspector_prop_list_class_init (GtkInspectorPropListClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -258,6 +278,7 @@ gtk_inspector_prop_list_class_init (GtkInspectorPropListClass *klass)
   object_class->finalize = finalize;
   object_class->get_property = get_property;
   object_class->set_property = set_property;
+  object_class->constructed = constructed;
 
   g_object_class_install_property (object_class, PROP_OBJECT_TREE,
       g_param_spec_object ("object-tree", "Object Tree", "Object tree",
@@ -266,13 +287,14 @@ gtk_inspector_prop_list_class_init (GtkInspectorPropListClass *klass)
       g_param_spec_boolean ("child-properties", "Child properties", "Child properties",
                             FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
+  g_object_class_install_property (object_class, PROP_SEARCH_ENTRY,
+      g_param_spec_object ("search-entry", "Search Entry", "Search Entry",
+                           GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
   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, model);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, attribute_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, tree);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, search_entry);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, search_stack);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorPropList, object_title);
   gtk_widget_class_bind_template_callback (widget_class, row_activated);
   gtk_widget_class_bind_template_callback (widget_class, search_close_clicked);
   gtk_widget_class_bind_template_callback (widget_class, hierarchy_changed);
@@ -383,7 +405,6 @@ gtk_inspector_prop_list_set_object (GtkInspectorPropList *pl,
   GParamSpec **props;
   guint num_properties;
   guint i;
-  const gchar *title;
 
   if (!object)
     return FALSE;
@@ -393,12 +414,9 @@ gtk_inspector_prop_list_set_object (GtkInspectorPropList *pl,
 
   cleanup_object (pl);
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  gtk_label_set_label (GTK_LABEL (pl->priv->object_title), title);
-
   gtk_entry_set_text (GTK_ENTRY (pl->priv->search_entry), "");
   gtk_stack_set_visible_child_name (GTK_STACK (pl->priv->search_stack), "title");
-  
+
   if (pl->priv->child_properties)
     {
       GtkWidget *parent;
diff --git a/gtk/inspector/prop-list.ui b/gtk/inspector/prop-list.ui
index 2b450fa..3fa1f5c 100644
--- a/gtk/inspector/prop-list.ui
+++ b/gtk/inspector/prop-list.ui
@@ -14,63 +14,6 @@
     <property name="orientation">vertical</property>
     <signal name="hierarchy-changed" handler="hierarchy_changed"/>
     <child>
-      <object class="GtkStack" id="search_stack">
-        <property name="visible">True</property>
-        <property name="hhomogeneous">True</property>
-        <property name="vhomogeneous">True</property>
-        <property name="transition-type">crossfade</property>
-        <child>
-          <object class="GtkBox" id="search_box">
-            <property name="visible">True</property>
-            <property name="orientation">horizontal</property>
-            <property name="spacing">6</property>
-            <property name="margin">6</property>
-            <child type="center">
-              <object class="GtkSearchEntry" id="search_entry">
-                <property name="visible">True</property>
-                <property name="max-width-chars">40</property>
-                <signal name="stop-search" handler="search_close_clicked"/>
-              </object>
-            </child>
-            <child>
-              <object class="GtkButton" id="search_close_button">
-                <property name="visible">True</property>
-                <property name="relief">none</property>
-                <signal name="clicked" handler="search_close_clicked"/>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon-name">window-close-symbolic</property>
-                    <property name="icon-size">1</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="pack-type">end</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="name">search</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="object_title">
-            <property name="visible">True</property>
-            <property name="margin">10</property>
-            <property name="halign">fill</property>
-            <property name="valign">center</property>
-          </object>
-          <packing>
-            <property name="name">title</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="expand">True</property>
diff --git a/gtk/inspector/selector.c b/gtk/inspector/selector.c
index afa2741..b950ac6 100644
--- a/gtk/inspector/selector.c
+++ b/gtk/inspector/selector.c
@@ -36,7 +36,6 @@ struct _GtkInspectorSelectorPrivate
 {
   GtkTreeStore *model;
   GtkTreeView *tree;
-  GtkWidget *object_title;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorSelector, gtk_inspector_selector, GTK_TYPE_BOX)
@@ -56,7 +55,6 @@ gtk_inspector_selector_class_init (GtkInspectorSelectorClass *klass)
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/selector.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSelector, model);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSelector, tree);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSelector, object_title);
 }
 
 void
@@ -67,7 +65,6 @@ gtk_inspector_selector_set_object (GtkInspectorSelector *oh,
   gint i;
   GtkWidget *widget;
   gchar *path, **words;
-  const gchar *title;
 
   gtk_tree_store_clear (oh->priv->model);
 
@@ -77,9 +74,6 @@ gtk_inspector_selector_set_object (GtkInspectorSelector *oh,
       return;
     }
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  gtk_label_set_label (GTK_LABEL (oh->priv->object_title), title);
-
   widget = GTK_WIDGET (object);
 
   path = gtk_widget_path_to_string (gtk_widget_get_path (widget));
diff --git a/gtk/inspector/selector.ui b/gtk/inspector/selector.ui
index 2358bba..db00875 100644
--- a/gtk/inspector/selector.ui
+++ b/gtk/inspector/selector.ui
@@ -8,15 +8,6 @@
   <template class="GtkInspectorSelector" parent="GtkBox">
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkLabel" id="object_title">
-        <property name="visible">True</property>
-        <property name="halign">fill</property>
-        <property name="valign">center</property>
-        <property name="margin-top">12</property>
-        <property name="margin-bottom">12</property>
-      </object>
-    </child>
-    <child>
       <object class="GtkScrolledWindow">
         <property name="visible">True</property>
         <property name="hscrollbar-policy">never</property>
@@ -27,6 +18,7 @@
             <property name="visible">True</property>
             <property name="model">model</property>
             <property name="enable-search">False</property>
+            <property name="headers-visible">False</property>
             <property name="show-expanders">False</property>
             <property name="level-indentation">18</property>
             <child internal-child="selection">
@@ -43,7 +35,7 @@
                   </object>
                   <attributes>
                     <attribute name="text">0</attribute>
-                  </attributes> 
+                  </attributes>
                 </child>
               </object>
             </child>
diff --git a/gtk/inspector/signals-list.c b/gtk/inspector/signals-list.c
index 9cfdc84..523856e 100644
--- a/gtk/inspector/signals-list.c
+++ b/gtk/inspector/signals-list.c
@@ -38,6 +38,13 @@ enum
   COLUMN_HOOK_ID
 };
 
+enum
+{
+  PROP_0,
+  PROP_TRACE_BUTTON,
+  PROP_CLEAR_BUTTON
+};
+
 struct _GtkInspectorSignalsListPrivate
 {
   GtkWidget *view;
@@ -46,7 +53,6 @@ struct _GtkInspectorSignalsListPrivate
   GtkWidget *log_win;
   GtkWidget *trace_button;
   GtkWidget *clear_button;
-  GtkWidget *object_title;
   GtkTreeViewColumn *count_column;
   GtkCellRenderer *count_renderer;
   GObject *object;
@@ -150,14 +156,7 @@ gtk_inspector_signals_list_set_object (GtkInspectorSignalsList *sl,
   sl->priv->object = object;
 
   if (object)
-    {
-      const gchar *title;
-
-      title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-      gtk_label_set_label (GTK_LABEL (sl->priv->object_title), title);
-
-      read_signals_from_object (sl, object);
-    }
+    read_signals_from_object (sl, object);
 }
 
 static void
@@ -338,10 +337,82 @@ clear_log (GtkButton *button, GtkInspectorSignalsList *sl)
 }
 
 static void
+get_property (GObject    *object,
+              guint       param_id,
+              GValue     *value,
+              GParamSpec *pspec)
+{
+  GtkInspectorSignalsList *sl = GTK_INSPECTOR_SIGNALS_LIST (object);
+
+  switch (param_id)
+    {
+    case PROP_TRACE_BUTTON:
+      g_value_take_object (value, sl->priv->trace_button);
+      break;
+
+    case PROP_CLEAR_BUTTON:
+      g_value_take_object (value, sl->priv->trace_button);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+    }
+}
+
+static void
+set_property (GObject      *object,
+              guint         param_id,
+              const GValue *value,
+              GParamSpec   *pspec)
+{
+  GtkInspectorSignalsList *sl = GTK_INSPECTOR_SIGNALS_LIST (object);
+
+  switch (param_id)
+    {
+    case PROP_TRACE_BUTTON:
+      sl->priv->trace_button = g_value_get_object (value);
+      break;
+
+    case PROP_CLEAR_BUTTON:
+      sl->priv->clear_button = g_value_get_object (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+      break;
+    }
+}
+
+static void
+constructed (GObject *object)
+{
+  GtkInspectorSignalsList *sl = GTK_INSPECTOR_SIGNALS_LIST (object);
+
+  g_signal_connect (sl->priv->trace_button, "toggled",
+                    G_CALLBACK (toggle_tracing), sl);
+  g_signal_connect (sl->priv->clear_button, "clicked",
+                    G_CALLBACK (clear_log), sl);
+}
+
+static void
 gtk_inspector_signals_list_class_init (GtkInspectorSignalsListClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
+  object_class->constructed = constructed;
+  object_class->get_property = get_property;
+  object_class->set_property = set_property;
+
+  g_object_class_install_property (object_class, PROP_TRACE_BUTTON,
+      g_param_spec_object ("trace-button", NULL, NULL,
+                           GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (object_class, PROP_CLEAR_BUTTON,
+      g_param_spec_object ("clear-button", NULL, NULL,
+                           GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/signals-list.ui");
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, view);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, model);
@@ -349,11 +420,6 @@ gtk_inspector_signals_list_class_init (GtkInspectorSignalsListClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, log_win);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, count_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, count_renderer);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, trace_button);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, clear_button);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorSignalsList, object_title);
-  gtk_widget_class_bind_template_callback (widget_class, toggle_tracing);
-  gtk_widget_class_bind_template_callback (widget_class, clear_log);
 }
 
 // vim: set et sw=2 ts=2:
diff --git a/gtk/inspector/signals-list.ui b/gtk/inspector/signals-list.ui
index b3c9441..b173c24 100644
--- a/gtk/inspector/signals-list.ui
+++ b/gtk/inspector/signals-list.ui
@@ -20,61 +20,6 @@
         <property name="orientation">vertical</property>
         <property name="visible">True</property>
         <child>
-          <object class="GtkBox">
-            <property name="visible">True</property>
-            <property name="orientation">horizontal</property>
-            <property name="spacing">6</property>
-            <property name="margin">6</property>
-            <child>
-              <object class="GtkToggleButton" id="trace_button">
-                <property name="visible">True</property>
-                <property name="relief">none</property>
-                <property name="tooltip-text" translatable="yes">Trace signal emissions on this 
object</property>
-                <signal name="toggled" handler="toggle_tracing"/>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon-name">media-record-symbolic</property>
-                    <property name="icon-size">1</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="pack-type">start</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="clear_button">
-                <property name="visible">True</property>
-                <property name="relief">none</property>
-                <property name="tooltip-text" translatable="yes">Clear log</property>
-                <signal name="clicked" handler="clear_log"/>
-                <style>
-                  <class name="image-button"/>
-                </style>
-                <child>
-                  <object class="GtkImage">
-                    <property name="visible">True</property>
-                    <property name="icon-name">edit-clear-symbolic</property>
-                    <property name="icon-size">1</property>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="pack-type">start</property>
-              </packing>
-            </child>
-            <child type="center">
-              <object class="GtkLabel" id="object_title">
-                <property name="visible">True</property>
-              </object>
-            </child>
-          </object>
-        </child>
-        <child>
           <object class="GtkScrolledWindow">
             <property name="visible">True</property>
             <property name="expand">True</property>
@@ -88,7 +33,7 @@
                 <property name="enable-grid-lines">vertical</property>
                 <child>
                   <object class="GtkTreeViewColumn">
-                    <property name="title" translatable="yes">Name</property>
+                    <property name="title" translatable="yes">Signal</property>
                     <property name="sort-column-id">0</property>
                     <child>
                       <object class="GtkCellRendererText">
diff --git a/gtk/inspector/size-groups.c b/gtk/inspector/size-groups.c
index 25a452f..eb185ed 100644
--- a/gtk/inspector/size-groups.c
+++ b/gtk/inspector/size-groups.c
@@ -274,8 +274,6 @@ gtk_inspector_size_groups_set_object (GtkInspectorSizeGroups *sl,
                                       GObject                *object)
 {
   GSList *groups, *l;
-  const gchar *title;
-  GtkWidget *label;
 
   clear_view (sl);
 
@@ -285,16 +283,6 @@ gtk_inspector_size_groups_set_object (GtkInspectorSizeGroups *sl,
       return;
     }
 
-  title = (const gchar *)g_object_get_data (object, "gtk-inspector-object-title");
-  label = gtk_label_new (title);
-
-  gtk_widget_set_halign (label, GTK_ALIGN_FILL);
-  gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
-  gtk_widget_set_margin_top (label, 12);
-  gtk_widget_set_margin_bottom (label, 30);
-  gtk_widget_show (label);
-  gtk_container_add (GTK_CONTAINER (sl), label);
-
   groups = _gtk_widget_get_sizegroups (GTK_WIDGET (object));
   if (groups)
     gtk_widget_show (GTK_WIDGET (sl));
@@ -313,6 +301,7 @@ gtk_inspector_size_groups_init (GtkInspectorSizeGroups *sl)
                 "margin-start", 60,
                 "margin-end", 60,
                 "margin-bottom", 60,
+                "margin-bottom", 30,
                 "spacing", 10,
                 NULL);
 }
diff --git a/gtk/inspector/window.c b/gtk/inspector/window.c
index 8edc03a..fcbc33f 100644
--- a/gtk/inspector/window.c
+++ b/gtk/inspector/window.c
@@ -58,10 +58,14 @@ set_selected_object (GtkInspectorWindow *iw,
                      GObject            *selected)
 {
   GList *l;
+  const char *title;
 
   if (!gtk_inspector_prop_list_set_object (GTK_INSPECTOR_PROP_LIST (iw->prop_list), selected))
     return FALSE;
 
+  title = (const char *)g_object_get_data (selected, "gtk-inspector-object-title");
+  gtk_label_set_label (GTK_LABEL (iw->object_title), title);
+
   gtk_inspector_prop_list_set_object (GTK_INSPECTOR_PROP_LIST (iw->child_prop_list), selected);
   gtk_inspector_signals_list_set_object (GTK_INSPECTOR_SIGNALS_LIST (iw->signals_list), selected);
   gtk_inspector_object_hierarchy_set_object (GTK_INSPECTOR_OBJECT_HIERARCHY (iw->object_hierarchy), 
selected);
@@ -131,6 +135,25 @@ open_object_details (GtkWidget *button, GtkInspectorWindow *iw)
   gtk_stack_set_visible_child_name (GTK_STACK (iw->object_buttons), "details");
 }
 
+static gboolean
+translate_visible_child_name (GBinding     *binding,
+                              const GValue *from,
+                              GValue       *to,
+                              gpointer      user_data)
+{
+  GtkInspectorWindow *iw = user_data;
+  const char *name;
+
+  name = g_value_get_string (from);
+
+  if (gtk_stack_get_child_by_name (GTK_STACK (iw->object_start_stack), name))
+    g_value_set_string (to, name);
+  else
+    g_value_set_string (to, "empty");
+
+  return TRUE;
+}
+
 static void
 gtk_inspector_window_init (GtkInspectorWindow *iw)
 {
@@ -139,6 +162,14 @@ gtk_inspector_window_init (GtkInspectorWindow *iw)
 
   gtk_widget_init_template (GTK_WIDGET (iw));
 
+  g_object_bind_property_full (iw->object_details, "visible-child-name",
+                               iw->object_start_stack, "visible-child-name",
+                               G_BINDING_SYNC_CREATE,
+                               translate_visible_child_name,
+                               NULL,
+                               iw,
+                               NULL);
+
   gtk_window_group_add_window (gtk_window_group_new (), GTK_WINDOW (iw));
 
   extension_point = g_io_extension_point_lookup ("gtk-inspector-page");
@@ -188,7 +219,6 @@ gtk_inspector_window_init (GtkInspectorWindow *iw)
 
       g_free (title);
     }
-
 }
 
 static void
@@ -202,6 +232,14 @@ gtk_inspector_window_constructed (GObject *object)
 }
 
 static void
+object_details_changed (GtkWidget          *combo,
+                        GParamSpec         *pspec,
+                        GtkInspectorWindow *iw)
+{
+  gtk_stack_set_visible_child_name (GTK_STACK (iw->object_center_stack), "title");
+}
+
+static void
 gtk_inspector_window_class_init (GtkInspectorWindowClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -216,6 +254,8 @@ gtk_inspector_window_class_init (GtkInspectorWindowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_stack);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_tree);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_details);
+  gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_start_stack);
+  gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_center_stack);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_buttons);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_details_button);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, select_object);
@@ -224,6 +264,7 @@ gtk_inspector_window_class_init (GtkInspectorWindowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, signals_list);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, widget_css_node_tree);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_hierarchy);
+  gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, object_title);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, selector);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, size_groups);
   gtk_widget_class_bind_template_child (widget_class, GtkInspectorWindow, data_list);
@@ -238,6 +279,7 @@ gtk_inspector_window_class_init (GtkInspectorWindowClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, on_object_selected);
   gtk_widget_class_bind_template_callback (widget_class, open_object_details);
   gtk_widget_class_bind_template_callback (widget_class, close_object_details);
+  gtk_widget_class_bind_template_callback (widget_class, object_details_changed);
 }
 
 static GdkScreen *
diff --git a/gtk/inspector/window.h b/gtk/inspector/window.h
index 338d781..8aef581 100644
--- a/gtk/inspector/window.h
+++ b/gtk/inspector/window.h
@@ -50,6 +50,9 @@ typedef struct
   GtkWidget *object_buttons;
   GtkWidget *object_details_button;
   GtkWidget *select_object;
+  GtkWidget *object_start_stack;
+  GtkWidget *object_center_stack;
+  GtkWidget *object_title;
   GtkWidget *prop_list;
   GtkWidget *child_prop_list;
   GtkWidget *selector;
diff --git a/gtk/inspector/window.ui b/gtk/inspector/window.ui
index 52d1898..33592cd 100644
--- a/gtk/inspector/window.ui
+++ b/gtk/inspector/window.ui
@@ -1,26 +1,33 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface domain="gtk30">
+  <object class="GtkAdjustment" id="magnification_adjustment">
+    <property name="lower">1.0</property>
+    <property name="upper">5.0</property>
+    <property name="page-size">0.0</property>
+    <property name="page-increment">0.1</property>
+    <property name="step-increment">0.1</property>
+    <property name="value">2.0</property>
+  </object>
   <template class="GtkInspectorWindow" parent="GtkWindow">
     <property name="default-height">500</property>
     <property name="default-width">800</property>
     <property name="icon">resource:///org/gtk/libgtk/inspector/logo.png</property>
     <child type="titlebar">
       <object class="GtkHeaderBar">
-        <property name="visible">True</property>
-        <property name="show-close-button">True</property>
+        <property name="visible">1</property>
+        <property name="show-close-button">1</property>
         <child>
           <object class="GtkStack" id="button_stack">
-            <property name="visible">True</property>
+            <property name="visible">1</property>
             <property name="visible-child-name" bind-source="top_stack" bind-property="visible-child-name"/>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="orientation">horizontal</property>
+                <property name="visible">1</property>
                 <property name="spacing">6</property>
                 <child>
                   <object class="GtkButton" id="select_object">
-                    <property name="visible">True</property>
-                    <property name="focus-on-click">False</property>
+                    <property name="visible">1</property>
+                    <property name="focus-on-click">0</property>
                     <property name="tooltip-text" translatable="yes">Select an Object</property>
                     <property name="halign">center</property>
                     <property name="valign">center</property>
@@ -30,7 +37,7 @@
                     </style>
                     <child>
                       <object class="GtkImage">
-                        <property name="visible">True</property>
+                        <property name="visible">1</property>
                         <property name="icon-name">find-location-symbolic</property>
                         <property name="icon-size">1</property>
                       </object>
@@ -39,11 +46,11 @@
                 </child>
                 <child>
                   <object class="GtkStack" id="object_buttons">
-                    <property name="visible">True</property>
+                    <property name="visible">1</property>
                     <child>
                       <object class="GtkButton" id="object_details_button">
-                        <property name="visible">True</property>
-                        <property name="focus-on-click">False</property>
+                        <property name="visible">1</property>
+                        <property name="focus-on-click">0</property>
                         <property name="tooltip-text" translatable="yes">Show Details</property>
                         <property name="halign">center</property>
                         <property name="valign">center</property>
@@ -53,7 +60,7 @@
                         </style>
                         <child>
                           <object class="GtkImage">
-                            <property name="visible">True</property>
+                            <property name="visible">1</property>
                             <property name="icon-name">dialog-information-symbolic</property>
                             <property name="icon-size">1</property>
                           </object>
@@ -65,8 +72,8 @@
                     </child>
                     <child>
                       <object class="GtkButton">
-                        <property name="visible">True</property>
-                        <property name="focus-on-click">False</property>
+                        <property name="visible">1</property>
+                        <property name="focus-on-click">0</property>
                         <property name="tooltip-text" translatable="yes">Show all Objects</property>
                         <property name="halign">center</property>
                         <property name="valign">center</property>
@@ -76,7 +83,7 @@
                         </style>
                         <child>
                           <object class="GtkImage">
-                            <property name="visible">True</property>
+                            <property name="visible">1</property>
                             <property name="icon-name">view-list-symbolic</property>
                             <property name="icon-size">1</property>
                           </object>
@@ -95,8 +102,8 @@
             </child>
             <child>
               <object class="GtkToggleButton" id="record_statistics_button">
-                <property name="visible">True</property>
-                <property name="focus-on-click">False</property>
+                <property name="visible">1</property>
+                <property name="focus-on-click">0</property>
                 <property name="tooltip-text" translatable="yes">Collect Statistics</property>
                 <property name="halign">start</property>
                 <property name="valign">center</property>
@@ -105,7 +112,7 @@
                 </style>
                 <child>
                   <object class="GtkImage">
-                    <property name="visible">True</property>
+                    <property name="visible">1</property>
                     <property name="icon-name">media-record-symbolic</property>
                     <property name="icon-size">1</property>
                   </object>
@@ -117,13 +124,13 @@
             </child>
             <child>
               <object class="GtkStack" id="resource_buttons">
-                <property name="visible">True</property>
+                <property name="visible">1</property>
                 <property name="halign">start</property>
                 <property name="valign">center</property>
                 <child>
                   <object class="GtkButton">
-                    <property name="visible">True</property>
-                    <property name="focus-on-click">False</property>
+                    <property name="visible">1</property>
+                    <property name="focus-on-click">0</property>
                     <property name="tooltip-text" translatable="yes">Show Details</property>
                     <property name="halign">center</property>
                     <property name="valign">center</property>
@@ -132,7 +139,7 @@
                     </style>
                     <child>
                       <object class="GtkImage">
-                        <property name="visible">True</property>
+                        <property name="visible">1</property>
                         <property name="icon-name">dialog-information-symbolic</property>
                         <property name="icon-size">1</property>
                       </object>
@@ -144,8 +151,8 @@
                 </child>
                 <child>
                   <object class="GtkButton">
-                    <property name="visible">True</property>
-                    <property name="focus-on-click">False</property>
+                    <property name="visible">1</property>
+                    <property name="focus-on-click">0</property>
                     <property name="tooltip-text" translatable="yes">Show all Resources</property>
                     <property name="halign">center</property>
                     <property name="valign">center</property>
@@ -154,7 +161,7 @@
                     </style>
                     <child>
                       <object class="GtkImage">
-                        <property name="visible">True</property>
+                        <property name="visible">1</property>
                         <property name="icon-name">view-list-symbolic</property>
                         <property name="icon-size">1</property>
                       </object>
@@ -171,7 +178,7 @@
             </child>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
+                <property name="visible">1</property>
               </object>
               <packing>
                 <property name="name">css</property>
@@ -179,7 +186,7 @@
             </child>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
+                <property name="visible">1</property>
               </object>
               <packing>
                 <property name="name">visual</property>
@@ -187,20 +194,17 @@
             </child>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
+                <property name="visible">1</property>
               </object>
               <packing>
                 <property name="name">general</property>
               </packing>
             </child>
           </object>
-          <packing>
-            <property name="pack-type">start</property>
-          </packing>
         </child>
         <child type="title">
           <object class="GtkStackSwitcher">
-            <property name="visible">True</property>
+            <property name="visible">1</property>
             <property name="margin-start">6</property>
             <property name="margin-end">6</property>
             <property name="stack">top_stack</property>
@@ -210,10 +214,10 @@
     </child>
     <child>
       <object class="GtkStack" id="top_stack">
-        <property name="visible">True</property>
+        <property name="visible">1</property>
         <child>
           <object class="GtkStack" id="object_stack">
-            <property name="visible">True</property>
+            <property name="visible">1</property>
             <child>
               <object class="GtkInspectorObjectTree" id="object_tree">
                 <property name="visible">True</property>
@@ -226,143 +230,255 @@
             </child>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
+                <property name="visible">1</property>
                 <property name="orientation">vertical</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="orientation">horizontal</property>
+                    <property name="visible">1</property>
+                    <property name="spacing">10</property>
                     <child>
-                      <object class="GtkStackSidebar">
+                      <object class="GtkStackCombo" id="stackcombo">
                         <property name="visible">True</property>
+                        <property name="margin">6</property>
                         <property name="stack">object_details</property>
                       </object>
                     </child>
                     <child>
-                      <object class="GtkSeparator">
-                        <property name="visible">True</property>
-                        <property name="orientation">vertical</property>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkStack" id="object_details">
+                      <object class="GtkStack" id="object_start_stack">
                         <property name="visible">True</property>
                         <child>
-                          <object class="GtkInspectorMiscInfo" id="misc_info">
-                            <property name="visible">True</property>
-                            <property name="object-tree">object_tree</property>
-                          </object>
-                          <packing>
-                            <property name="name">misc</property>
-                            <property name="title" translatable="yes">Miscellaneous</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorPropList" id="prop_list">
+                          <object class="GtkBox">
                             <property name="visible">True</property>
-                            <property name="child-properties">False</property>
-                            <property name="object-tree">object_tree</property>
                           </object>
                           <packing>
-                            <property name="name">properties</property>
-                            <property name="title" translatable="yes">Properties</property>
+                            <property name="name">empty</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkInspectorSignalsList" id="signals_list">
+                          <object class="GtkBox">
                             <property name="visible">True</property>
+                            <property name="orientation">horizontal</property>
+                            <property name="spacing">6</property>
+                            <property name="margin">6</property>
+                            <child>
+                              <object class="GtkToggleButton" id="signals_trace_button">
+                                <property name="visible">True</property>
+                                <property name="relief">none</property>
+                                <property name="tooltip-text" translatable="yes">Trace signal emissions on 
this object</property>
+                                <style>
+                                  <class name="image-button"/>
+                                </style>
+                                <child>
+                                  <object class="GtkImage">
+                                    <property name="visible">True</property>
+                                    <property name="icon-name">media-record-symbolic</property>
+                                    <property name="icon-size">1</property>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkButton" id="signals_clear_button">
+                                <property name="visible">True</property>
+                                <property name="relief">none</property>
+                                <property name="tooltip-text" translatable="yes">Clear log</property>
+                                <style>
+                                  <class name="image-button"/>
+                                </style>
+                                <child>
+                                  <object class="GtkImage">
+                                    <property name="visible">True</property>
+                                    <property name="icon-name">edit-clear-symbolic</property>
+                                    <property name="icon-size">1</property>
+                                  </object>
+                                </child>
+                              </object>
+                            </child>
                           </object>
                           <packing>
                             <property name="name">signals</property>
-                            <property name="title" translatable="yes">Signals</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorPropList" id="child_prop_list">
-                            <property name="child-properties">True</property>
-                            <property name="object-tree">object_tree</property>
-                          </object>
-                          <packing>
-                            <property name="name">child-properties</property>
-                            <property name="title" translatable="yes">Child Properties</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkInspectorObjectHierarchy" id="object_hierarchy">
+                          <object class="GtkScale">
                             <property name="visible">True</property>
+                            <property name="orientation">horizontal</property>
+                            <property name="width-request">150</property>
+                            <property name="draw-value">False</property>
+                            <property name="adjustment">magnification_adjustment</property>
+                            <marks>
+                              <mark value="1.0" position="bottom"/>
+                              <mark value="2.0" position="bottom"/>
+                              <mark value="3.0" position="bottom"/>
+                              <mark value="4.0" position="bottom"/>
+                              <mark value="5.0" position="bottom"/>
+                            </marks>
                           </object>
                           <packing>
-                            <property name="name">hierarchy</property>
-                            <property name="title" translatable="yes">Hierarchy</property>
+                            <property name="name">magnifier</property>
                           </packing>
                         </child>
+                      </object>
+                    </child>
+                    <child type="center">
+                      <object class="GtkStack" id="object_center_stack">
+                        <property name="visible">1</property>
+                        <property name="transition-type">crossfade</property>
                         <child>
-                          <object class="GtkInspectorSelector" id="selector">
-                            <property name="visible">True</property>
+                          <object class="GtkLabel" id="object_title">
+                            <property name="visible">1</property>
                           </object>
                           <packing>
-                            <property name="name">selector</property>
-                            <property name="title" translatable="yes">Selector</property>
+                            <property name="name">title</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkInspectorCssNodeTree" id="widget_css_node_tree">
-                            <property name="visible">True</property>
+                          <object class="GtkSearchEntry" id="prop_search_entry">
+                            <property name="visible">1</property>
+                            <property name="margin">6</property>
+                            <property name="max-width-chars">40</property>
                           </object>
                           <packing>
-                            <property name="name">css-nodes</property>
-                            <property name="title" translatable="yes">CSS nodes</property>
+                            <property name="name">prop-search</property>
                           </packing>
                         </child>
                         <child>
-                          <object class="GtkInspectorSizeGroups" id="size_groups"/>
-                          <packing>
-                            <property name="name">size-groups</property>
-                            <property name="title" translatable="yes">Size Groups</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorDataList" id="data_list"/>
-                          <packing>
-                            <property name="name">data</property>
-                            <property name="title" translatable="yes">Data</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorActions" id="actions"/>
-                          <packing>
-                            <property name="name">actions</property>
-                            <property name="title" translatable="yes">Actions</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorMenu" id="menu"/>
-                          <packing>
-                            <property name="name">menu</property>
-                            <property name="title" translatable="yes">Menu</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorGestures" id="gestures">
-                            <property name="object-tree">object_tree</property>
-                          </object>
-                          <packing>
-                            <property name="name">gestures</property>
-                            <property name="title" translatable="yes">Gestures</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkInspectorMagnifier" id="magnifier">
+                          <object class="GtkSearchEntry" id="child_prop_search_entry">
+                            <property name="visible">1</property>
+                            <property name="margin">6</property>
+                            <property name="max-width-chars">40</property>
                           </object>
                           <packing>
-                            <property name="name">magnifier</property>
-                            <property name="title" translatable="yes">Magnifier</property>
+                            <property name="name">child-prop-search</property>
                           </packing>
                         </child>
                       </object>
                     </child>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkStack" id="object_details">
+                    <property name="visible">1</property>
+                    <signal name="notify::visible-child" handler="object_details_changed"/>
+                    <child>
+                      <object class="GtkInspectorMiscInfo" id="misc_info">
+                        <property name="visible">True</property>
+                        <property name="object-tree">object_tree</property>
+                      </object>
+                      <packing>
+                        <property name="name">misc</property>
+                        <property name="title" translatable="yes">Miscellaneous</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorPropList" id="prop_list">
+                        <property name="visible">True</property>
+                        <property name="child-properties">False</property>
+                        <property name="object-tree">object_tree</property>
+                        <property name="search-entry">prop_search_entry</property>
+                      </object>
+                      <packing>
+                        <property name="name">properties</property>
+                        <property name="title" translatable="yes">Properties</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorSignalsList" id="signals_list">
+                        <property name="visible">True</property>
+                        <property name="trace-button">signals_trace_button</property>
+                        <property name="clear-button">signals_clear_button</property>
+                      </object>
+                      <packing>
+                        <property name="name">signals</property>
+                        <property name="title" translatable="yes">Signals</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorPropList" id="child_prop_list">
+                        <property name="child-properties">True</property>
+                        <property name="object-tree">object_tree</property>
+                        <property name="search-entry">child_prop_search_entry</property>
+                      </object>
+                      <packing>
+                        <property name="name">child-properties</property>
+                        <property name="title" translatable="yes">Child Properties</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorObjectHierarchy" id="object_hierarchy">
+                        <property name="visible">True</property>
+                      </object>
+                      <packing>
+                        <property name="name">hierarchy</property>
+                        <property name="title" translatable="yes">Class Hierarchy</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorSelector" id="selector">
+                        <property name="visible">True</property>
+                      </object>
+                      <packing>
+                        <property name="name">selector</property>
+                        <property name="title" translatable="yes">CSS Selector</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorCssNodeTree" id="widget_css_node_tree">
+                        <property name="visible">True</property>
+                      </object>
+                      <packing>
+                        <property name="name">css-nodes</property>
+                        <property name="title" translatable="yes">CSS nodes</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorSizeGroups" id="size_groups"/>
+                      <packing>
+                        <property name="name">size-groups</property>
+                        <property name="title" translatable="yes">Size Groups</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorDataList" id="data_list"/>
+                      <packing>
+                        <property name="name">data</property>
+                        <property name="title" translatable="yes">Data</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorActions" id="actions"/>
+                      <packing>
+                        <property name="name">actions</property>
+                        <property name="title" translatable="yes">Actions</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorMenu" id="menu"/>
+                      <packing>
+                        <property name="name">menu</property>
+                        <property name="title" translatable="yes">Menu</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorGestures" id="gestures">
+                        <property name="object-tree">object_tree</property>
+                      </object>
+                      <packing>
+                        <property name="name">gestures</property>
+                        <property name="title" translatable="yes">Gestures</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkInspectorMagnifier" id="magnifier">
+                        <property name="adjustment">magnification_adjustment</property>
+                      </object>
+                      <packing>
+                        <property name="name">magnifier</property>
+                        <property name="title" translatable="yes">Magnifier</property>
+                      </packing>
+                    </child>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="name">object-details</property>



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