[gtk+] inspector: Avoid a split pane for resources



commit ee99ca661015dc455a5892eff7b43d6d8136c572
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Oct 10 20:20:02 2014 -0400

    inspector: Avoid a split pane for resources
    
    There is not much room in the inspector window; squeezing a
    tree and a detailed view in the same page is not great. Instead,
    make the details a separate page.

 gtk/inspector/resource-list.c    |  191 +++++++++++-----------
 gtk/inspector/resource-list.ui   |  334 +++++++++++++++++++++-----------------
 gtk/inspector/resource-list.ui.h |    2 +-
 3 files changed, 285 insertions(+), 242 deletions(-)
---
diff --git a/gtk/inspector/resource-list.c b/gtk/inspector/resource-list.c
index f036972..756c82e 100644
--- a/gtk/inspector/resource-list.c
+++ b/gtk/inspector/resource-list.c
@@ -40,12 +40,12 @@ struct _GtkInspectorResourceListPrivate
   GtkTextBuffer *buffer;
   GtkWidget *image;
   GtkWidget *content;
+  GtkWidget *name_label;
   GtkWidget *type;
   GtkWidget *type_label;
-  GtkWidget *count;
-  GtkWidget *count_label;
   GtkWidget *size_label;
   GtkWidget *info_grid;
+  GtkWidget *stack;
   GtkTreeViewColumn *count_column;
   GtkCellRenderer *count_renderer;
   GtkTreeViewColumn *size_column;
@@ -116,110 +116,105 @@ load_resources_recurse (GtkInspectorResourceList *sl,
 
 }
 
-static void
-selection_changed (GtkTreeSelection         *selection,
-                   GtkInspectorResourceList *rl)
+static gboolean
+populate_details (GtkInspectorResourceList *rl,
+                  GtkTreePath              *tree_path)
 {
   GtkTreeIter iter;
-
-  if (gtk_tree_selection_get_selected (selection, NULL, &iter))
+  gchar *path;
+  gchar *name;
+  GBytes *bytes;
+  gchar *type;
+  gconstpointer data;
+  gint count;
+  gsize size;
+  GError *error = NULL;
+  gchar *markup;
+
+
+  gtk_tree_model_get_iter (GTK_TREE_MODEL (rl->priv->model), &iter, tree_path);
+ 
+  gtk_tree_model_get (GTK_TREE_MODEL (rl->priv->model), &iter,
+                      COLUMN_PATH, &path,
+                      COLUMN_NAME, &name,
+                      COLUMN_COUNT, &count,
+                      COLUMN_SIZE, &size,
+                      -1);
+
+   if (g_str_has_suffix (path, "/"))
+     {
+       g_free (path);
+       g_free (name);
+       return FALSE;
+     }
+
+  markup = g_strconcat ("<span face='Monospace' size='small'>", path, "</span>", NULL);
+  gtk_label_set_markup (GTK_LABEL (rl->priv->name_label), markup);
+  g_free (markup);
+
+  bytes = g_resources_lookup_data (path, 0, &error);
+  if (bytes == NULL)
     {
-      gchar *path;
-      gchar *name;
-      GBytes *bytes;
-      gchar *type;
-      gconstpointer data;
-      gint count;
-      gsize size;
-      GError *error = NULL;
-
-      gtk_widget_hide (rl->priv->info_grid);
-
-      gtk_tree_model_get (GTK_TREE_MODEL (rl->priv->model), &iter,
-                          COLUMN_PATH, &path,
-                          COLUMN_NAME, &name,
-                          COLUMN_COUNT, &count,
-                          COLUMN_SIZE, &size,
-                          -1);
+      gtk_text_buffer_set_text (rl->priv->buffer, error->message, -1);
+      g_error_free (error);
+      gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+    }
+  else
+    {
+      gchar *text;
 
-      if (g_str_has_suffix (path, "/"))
-        {
-          gchar *text;
+      data = g_bytes_get_data (bytes, &size);
+      type = g_content_type_guess (name, data, size, NULL);
 
-          text = g_strdup_printf ("%d", count);
-          gtk_label_set_text (GTK_LABEL (rl->priv->count_label), text);
-          g_free (text);
+      text = g_content_type_get_description (type);
+      gtk_label_set_text (GTK_LABEL (rl->priv->type_label), text);
+      g_free (text);
 
-          text = g_format_size (size);
-          gtk_label_set_text (GTK_LABEL (rl->priv->size_label), text);
-          g_free (text);
+      text = g_format_size (size);
+      gtk_label_set_text (GTK_LABEL (rl->priv->size_label), text);
+      g_free (text);
        
-          gtk_widget_hide (rl->priv->type);
-          gtk_widget_hide (rl->priv->type_label);
-          gtk_widget_show (rl->priv->count);
-          gtk_widget_show (rl->priv->count_label);
-          gtk_widget_show (rl->priv->info_grid);
-
-          gtk_text_buffer_set_text (rl->priv->buffer, "", -1);
+      if (g_content_type_is_a (type, "text/*"))
+        {
+          gtk_text_buffer_set_text (rl->priv->buffer, data, -1);
           gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
-          goto out;
         }
-      bytes = g_resources_lookup_data (path, 0, &error);
-      if (bytes == NULL)
+      else if (g_content_type_is_a (type, "image/*"))
         {
-          gtk_text_buffer_set_text (rl->priv->buffer, error->message, -1);
-          g_error_free (error);
-          gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+          gtk_image_set_from_resource (GTK_IMAGE (rl->priv->image), path);
+          gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "image");
         }
       else
         {
-          gchar *text;
+          gtk_text_buffer_set_text (rl->priv->buffer, "", 0);
+          gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
+        }
 
-          data = g_bytes_get_data (bytes, &size);
-          type = g_content_type_guess (name, data, size, NULL);
+      g_free (type);
+      g_bytes_unref (bytes);
+    }
 
-          text = g_content_type_get_description (type);
-          gtk_label_set_text (GTK_LABEL (rl->priv->type_label), text);
-          g_free (text);
+  g_free (path);
+  g_free (name);
 
-          text = g_format_size (size);
-          gtk_label_set_text (GTK_LABEL (rl->priv->size_label), text);
-          g_free (text);
-       
-          gtk_widget_show (rl->priv->type);
-          gtk_widget_show (rl->priv->type_label);
-          gtk_widget_hide (rl->priv->count);
-          gtk_widget_hide (rl->priv->count_label);
-          gtk_widget_show (rl->priv->info_grid);
-          
-          if (g_content_type_is_a (type, "text/*"))
-            {
-              gtk_text_buffer_set_text (rl->priv->buffer, data, -1);
-              gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
-            }
-          else if (g_content_type_is_a (type, "image/*"))
-            {
-              gtk_image_set_from_resource (GTK_IMAGE (rl->priv->image), path);
-              gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "image");
-            }
-          else
-            {
-              gtk_text_buffer_set_text (rl->priv->buffer, "", 0);
-              gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
-            }
-
-          g_free (type);
-          g_bytes_unref (bytes);
-        }
-out:
-      g_free (path);
-      g_free (name);
-    }
-  else
-    {
-      gtk_text_buffer_set_text (rl->priv->buffer, "", -1);
-      gtk_stack_set_visible_child_name (GTK_STACK (rl->priv->content), "text");
-    }
+  return TRUE;
+}
+
+static void
+row_activated (GtkTreeView              *treeview,
+               GtkTreePath              *path,
+               GtkTreeViewColumn        *column,
+               GtkInspectorResourceList *sl)
+{
+  if (populate_details (sl, path))  
+    gtk_stack_set_visible_child_name (GTK_STACK (sl->priv->stack), "details");
+}
+
+static void
+close_details (GtkWidget                *button,
+               GtkInspectorResourceList *sl)
+{
+  gtk_stack_set_visible_child_name (GTK_STACK (sl->priv->stack), "list");
 }
 
 static void
@@ -269,6 +264,14 @@ size_data_func (GtkTreeViewColumn *col,
 }
 
 static void
+on_map (GtkWidget *widget)
+{
+  GtkInspectorResourceList *sl = GTK_INSPECTOR_RESOURCE_LIST (widget);
+
+  gtk_stack_set_visible_child_name (GTK_STACK (sl->priv->stack), "list");
+}
+
+static void
 gtk_inspector_resource_list_init (GtkInspectorResourceList *sl)
 {
   sl->priv = gtk_inspector_resource_list_get_instance_private (sl);
@@ -279,6 +282,7 @@ gtk_inspector_resource_list_init (GtkInspectorResourceList *sl)
   gtk_tree_view_column_set_cell_data_func (sl->priv->size_column,
                                            sl->priv->size_renderer,
                                            size_data_func, sl, NULL);
+  g_signal_connect (sl, "map", G_CALLBACK (on_map), NULL);
   load_resources (sl);
 }
 
@@ -292,18 +296,19 @@ gtk_inspector_resource_list_class_init (GtkInspectorResourceListClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, buffer);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, content);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, image);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, name_label);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, type_label);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, type);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, count_label);
-  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, count);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, size_label);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, info_grid);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, count_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, count_renderer);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, size_column);
   gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, size_renderer);
+  gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorResourceList, stack);
 
-  gtk_widget_class_bind_template_callback (widget_class, selection_changed);
+  gtk_widget_class_bind_template_callback (widget_class, row_activated);
+  gtk_widget_class_bind_template_callback (widget_class, close_details);
 }
 
 // vim: set et sw=2 ts=2:
diff --git a/gtk/inspector/resource-list.ui b/gtk/inspector/resource-list.ui
index f452e74..823ae97 100644
--- a/gtk/inspector/resource-list.ui
+++ b/gtk/inspector/resource-list.ui
@@ -14,190 +14,228 @@
   <template class="GtkInspectorResourceList" parent="GtkBox">
     <property name="orientation">horizontal</property>
     <child>
-      <object class="GtkScrolledWindow">
+      <object class="GtkStack" id="stack">
         <property name="visible">True</property>
-        <property name="expand">True</property>
-        <property name="hscrollbar-policy">automatic</property>
-        <property name="vscrollbar-policy">always</property>
-        <property name="shadow-type">in</property>
+        <property name="transition-type">none</property>
         <child>
-          <object class="GtkTreeView">
+          <object class="GtkScrolledWindow">
             <property name="visible">True</property>
-            <property name="model">model</property>
-            <child internal-child="selection">
-              <object class="GtkTreeSelection">
-                <property name="mode">single</property>
-                <signal name="changed" handler="selection_changed"/>
-              </object>
-            </child>
+            <property name="expand">True</property>
+            <property name="hscrollbar-policy">automatic</property>
+            <property name="vscrollbar-policy">always</property>
+            <property name="shadow-type">in</property>
             <child>
-              <object class="GtkTreeViewColumn">
-                <property name="title" translatable="yes">Path</property>
-                <property name="sort-column-id">0</property>
+              <object class="GtkTreeView">
+                <property name="visible">True</property>
+                <property name="model">model</property>
+                <property name="activate-on-single-click">True</property>
+                <signal name="row-activated" handler="row_activated"/>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection">
+                    <property name="mode">none</property>
+                  </object>
+                </child>
                 <child>
-                  <object class="GtkCellRendererText">
-                    <property name="scale">0.8</property>
+                  <object class="GtkTreeViewColumn">
+                    <property name="title" translatable="yes">Path</property>
+                    <property name="sort-column-id">0</property>
+                    <child>
+                      <object class="GtkCellRendererText">
+                        <property name="scale">0.8</property>
+                      </object>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
                   </object>
-                  <attributes>
-                    <attribute name="text">0</attribute>
-                  </attributes>
                 </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkTreeViewColumn" id="count_column">
-                <property name="title" translatable="yes">Count</property>
-                <property name="sort-column-id">1</property>
                 <child>
-                  <object class="GtkCellRendererText" id="count_renderer">
-                    <property name="scale">0.8</property>
+                  <object class="GtkTreeViewColumn" id="count_column">
+                    <property name="title" translatable="yes">Count</property>
+                    <property name="sort-column-id">1</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="count_renderer">
+                        <property name="scale">0.8</property>
+                      </object>
+                    </child>
                   </object>
                 </child>
-              </object>
-            </child>
-            <child>
-              <object class="GtkTreeViewColumn" id="size_column">
-                <property name="title" translatable="yes">Size</property>
-                <property name="sort-column-id">2</property>
                 <child>
-                  <object class="GtkCellRendererText" id="size_renderer">
-                    <property name="scale">0.8</property>
+                  <object class="GtkTreeViewColumn" id="size_column">
+                    <property name="title" translatable="yes">Size</property>
+                    <property name="sort-column-id">2</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="size_renderer">
+                        <property name="scale">0.8</property>
+                      </object>
+                    </child>
                   </object>
                 </child>
               </object>
             </child>
           </object>
-        </child>
-      </object>
-    </child>
-    <child>
-      <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="orientation">vertical</property>
-        <child>
-          <object class="GtkGrid" id="info_grid">
-            <property name="row-spacing">10</property>
-            <property name="column-spacing">10</property>
-            <property name="margin">20</property>
-            <child>
-              <object class="GtkLabel" id="type">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Type:</property>
-                <property name="halign">end</property>
-                <property name="valign">baseline</property>
-              </object>
-              <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="type_label">
-                <property name="visible">True</property>
-                <property name="halign">start</property>
-                <property name="valign">baseline</property>
-              </object>
-              <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="count">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Count:</property>
-                <property name="halign">end</property>
-                <property name="valign">baseline</property>
-              </object>
-              <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="count_label">
-                <property name="visible">True</property>
-                <property name="halign">start</property>
-                <property name="valign">baseline</property>
-              </object>
-              <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel">
-                <property name="visible">True</property>
-                <property name="label" translatable="yes">Size:</property>
-                <property name="halign">end</property>
-                <property name="valign">baseline</property>
-              </object>
-              <packing>
-                <property name="left-attach">0</property>
-                <property name="top-attach">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkLabel" id="size_label">
-                <property name="visible">True</property>
-                <property name="halign">start</property>
-                <property name="valign">baseline</property>
-              </object>
-              <packing>
-                <property name="left-attach">1</property>
-                <property name="top-attach">2</property>
-              </packing>
-            </child>
-          </object>
+          <packing>
+            <property name="name">list</property>
+          </packing>
         </child>
         <child>
-          <object class="GtkStack" id="content">
+          <object class="GtkBox">
             <property name="visible">True</property>
+            <property name="orientation">vertical</property>
             <child>
-              <object class="GtkScrolledWindow">
+              <object class="GtkGrid" id="info_grid">
                 <property name="visible">True</property>
-                <property name="expand">True</property>
-                <property name="hscrollbar-policy">automatic</property>
-                <property name="vscrollbar-policy">automatic</property>
-                <property name="shadow-type">in</property>
-                <style>
-                  <class name="view"/>
-                </style>
+                <property name="row-spacing">10</property>
+                <property name="column-spacing">10</property>
+                <property name="margin">10</property>
+                <child>
+                  <object class="GtkLabel" id="name">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Name:</property>
+                    <property name="halign">end</property>
+                    <property name="valign">baseline</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">0</property>
+                    <property name="top-attach">0</property>
+                  </packing>
+                </child>
                 <child>
-                  <object class="GtkTextView">
+                  <object class="GtkLabel" id="name_label">
                     <property name="visible">True</property>
-                    <property name="editable">False</property>
-                    <property name="buffer">buffer</property>
+                    <property name="halign">start</property>
+                    <property name="valign">baseline</property>
+                    <property name="selectable">True</property>
                   </object>
+                  <packing>
+                    <property name="left-attach">1</property>
+                    <property name="top-attach">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="type">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Type:</property>
+                    <property name="halign">end</property>
+                    <property name="valign">baseline</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">0</property>
+                    <property name="top-attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="type_label">
+                    <property name="visible">True</property>
+                    <property name="halign">start</property>
+                    <property name="valign">baseline</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">1</property>
+                    <property name="top-attach">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">Size:</property>
+                    <property name="halign">end</property>
+                    <property name="valign">baseline</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">0</property>
+                    <property name="top-attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="size_label">
+                    <property name="visible">True</property>
+                    <property name="halign">start</property>
+                    <property name="valign">baseline</property>
+                  </object>
+                  <packing>
+                    <property name="left-attach">1</property>
+                    <property name="top-attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton">
+                    <property name="visible">True</property>
+                    <property name="halign">start</property>
+                    <property name="valign">start</property>
+                    <signal name="clicked" handler="close_details"/>
+                    <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="left-attach">-1</property>
+                    <property name="top-attach">0</property>
+                    <property name="height">3</property>
+                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="name">text</property>
-              </packing>
             </child>
             <child>
-              <object class="GtkScrolledWindow">
+              <object class="GtkStack" id="content">
                 <property name="visible">True</property>
-                <property name="expand">True</property>
-                <property name="hscrollbar-policy">automatic</property>
-                <property name="vscrollbar-policy">automatic</property>
-                <property name="shadow-type">in</property>
-                <style>
-                  <class name="view"/>
-                </style>
                 <child>
-                  <object class="GtkImage" id="image">
+                  <object class="GtkScrolledWindow">
+                    <property name="visible">True</property>
+                    <property name="expand">True</property>
+                    <property name="hscrollbar-policy">automatic</property>
+                    <property name="vscrollbar-policy">automatic</property>
+                    <property name="shadow-type">in</property>
+                    <style>
+                      <class name="view"/>
+                    </style>
+                    <child>
+                      <object class="GtkTextView">
+                        <property name="visible">True</property>
+                        <property name="editable">False</property>
+                        <property name="buffer">buffer</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="name">text</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkScrolledWindow">
                     <property name="visible">True</property>
-                    <property name="halign">center</property>
-                    <property name="valign">center</property>
+                    <property name="expand">True</property>
+                    <property name="hscrollbar-policy">automatic</property>
+                    <property name="vscrollbar-policy">automatic</property>
+                    <property name="shadow-type">in</property>
+                    <style>
+                      <class name="view"/>
+                    </style>
+                    <child>
+                      <object class="GtkImage" id="image">
+                        <property name="visible">True</property>
+                        <property name="halign">center</property>
+                        <property name="valign">center</property>
+                      </object>
+                    </child>
                   </object>
+                  <packing>
+                    <property name="name">image</property>
+                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="name">image</property>
-              </packing>
             </child>
           </object>
+          <packing>
+            <property name="name">details</property>
+          </packing>
         </child>
       </object>
     </child>
diff --git a/gtk/inspector/resource-list.ui.h b/gtk/inspector/resource-list.ui.h
index 4379194..254dd87 100644
--- a/gtk/inspector/resource-list.ui.h
+++ b/gtk/inspector/resource-list.ui.h
@@ -1,6 +1,6 @@
 N_("Path");
 N_("Count");
 N_("Size");
+N_("Name:");
 N_("Type:");
-N_("Count:");
 N_("Size:");


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