[sysprof] libsysprof-ui: add some mark details



commit 9797efbe7d6e16239e119e2354ddab18601b7646
Author: Christian Hergert <chergert redhat com>
Date:   Thu May 16 19:16:15 2019 -0700

    libsysprof-ui: add some mark details

 src/libsysprof-ui/sysprof-capture-view.c     |  74 +++++++
 src/libsysprof-ui/sysprof-details-view.c     |  25 +++
 src/libsysprof-ui/sysprof-details-view.h     |   3 +
 src/libsysprof-ui/ui/sysprof-capture-view.ui |   1 -
 src/libsysprof-ui/ui/sysprof-details-view.ui | 307 ++++++++++++++-------------
 5 files changed, 260 insertions(+), 150 deletions(-)
---
diff --git a/src/libsysprof-ui/sysprof-capture-view.c b/src/libsysprof-ui/sysprof-capture-view.c
index a704a15..a97314f 100644
--- a/src/libsysprof-ui/sysprof-capture-view.c
+++ b/src/libsysprof-ui/sysprof-capture-view.c
@@ -22,6 +22,8 @@
 
 #include "config.h"
 
+#include <glib/gi18n.h>
+
 #include "sysprof-callgraph-view.h"
 #include "sysprof-capture-view.h"
 #include "sysprof-details-view.h"
@@ -29,6 +31,8 @@
 #include "sysprof-ui-private.h"
 #include "sysprof-visualizer-view.h"
 
+#define NSEC_PER_SEC (G_USEC_PER_SEC * 1000L)
+
 typedef struct
 {
   gint64 begin_time;
@@ -42,6 +46,7 @@ typedef struct
 {
   SysprofCaptureReader   *reader;
   GCancellable           *cancellable;
+  GHashTable             *mark_stats;
 
   SysprofCaptureFeatures  features;
 
@@ -122,6 +127,62 @@ sysprof_capture_view_new (void)
   return g_object_new (SYSPROF_TYPE_CAPTURE_VIEW, NULL);
 }
 
+static void
+add_marks_to_details (SysprofCaptureView *self)
+{
+  SysprofCaptureViewPrivate *priv = sysprof_capture_view_get_instance_private (self);
+  GHashTableIter iter;
+  gpointer k, v;
+  guint count = 0;
+
+  g_assert (SYSPROF_IS_CAPTURE_VIEW (self));
+
+  if (priv->mark_stats == NULL)
+    return;
+
+  if (g_hash_table_size (priv->mark_stats) == 0)
+    return;
+
+  g_hash_table_iter_init (&iter, priv->mark_stats);
+  while (count < 100 && g_hash_table_iter_next (&iter, &k, &v))
+    {
+      g_autofree gchar *str = NULL;
+      SysprofMarkStat *st = v;
+      GtkLabel *left_label;
+      GtkLabel *center_label;
+
+      if (st->avg == 0)
+        continue;
+
+      left_label = g_object_new (GTK_TYPE_LABEL,
+                                 "visible", TRUE,
+                                 "xalign", 1.0f,
+                                 "label", st->name,
+                                 "ellipsize", PANGO_ELLIPSIZE_START,
+                                 NULL);
+      gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (left_label)),
+                                   GTK_STYLE_CLASS_DIM_LABEL);
+      str = g_strdup_printf ("<span fgalpha='32767'>Min:</span> %.4lf  "
+                             "<span fgalpha='32767'>Max:</span> %.4lf  "
+                             "<span fgalpha='32767'>Ø:</span> %.4lf",
+                             st->min / (gdouble)NSEC_PER_SEC,
+                             st->max / (gdouble)NSEC_PER_SEC,
+                             st->avg / (gdouble)NSEC_PER_SEC);
+      center_label = g_object_new (GTK_TYPE_LABEL,
+                                   "label", str,
+                                   "use-markup", TRUE,
+                                   "visible", TRUE,
+                                   "xalign", 0.0f,
+                                   NULL);
+
+      sysprof_details_view_add_item (priv->details_view,
+                                     GTK_WIDGET (left_label),
+                                     GTK_WIDGET (center_label));
+
+      count++;
+    }
+}
+
 static void
 sysprof_capture_view_task_completed (SysprofCaptureView *self,
                                      GParamSpec         *pspec,
@@ -348,6 +409,11 @@ sysprof_capture_view_scan_worker (GTask        *task,
 
   sysprof_capture_reader_set_stat (reader, &st_buf);
 
+  g_object_set_data_full (G_OBJECT (task),
+                          "MARK_STAT",
+                          g_steal_pointer (&mark_stats),
+                          (GDestroyNotify) g_hash_table_unref);
+
   if (!g_task_return_error_if_cancelled (task))
     {
       priv->features = features;
@@ -384,6 +450,7 @@ sysprof_capture_view_scan_finish (SysprofCaptureView  *self,
                                   GError             **error)
 {
   SysprofCaptureViewPrivate *priv = sysprof_capture_view_get_instance_private (self);
+  GHashTable *stats;
 
   g_assert (SYSPROF_IS_CAPTURE_VIEW (self));
   g_assert (G_IS_TASK (result));
@@ -391,6 +458,12 @@ sysprof_capture_view_scan_finish (SysprofCaptureView  *self,
   if (!priv->features.has_samples && priv->features.has_marks)
     gtk_stack_set_visible_child_name (priv->stack, "timings");
 
+  g_clear_pointer (&priv->mark_stats, g_hash_table_unref);
+  if ((stats = g_object_get_data (G_OBJECT (result), "MARK_STAT")))
+    priv->mark_stats = g_hash_table_ref (stats);
+
+  add_marks_to_details (self);
+
   return g_task_propagate_boolean (G_TASK (result), error);
 }
 
@@ -671,6 +744,7 @@ sysprof_capture_view_finalize (GObject *object)
   SysprofCaptureView *self = (SysprofCaptureView *)object;
   SysprofCaptureViewPrivate *priv = sysprof_capture_view_get_instance_private (self);
 
+  g_clear_pointer (&priv->mark_stats, g_hash_table_unref);
   g_clear_pointer (&priv->reader, sysprof_capture_reader_unref);
   g_clear_object (&priv->cancellable);
 
diff --git a/src/libsysprof-ui/sysprof-details-view.c b/src/libsysprof-ui/sysprof-details-view.c
index 050a54f..d09ccbb 100644
--- a/src/libsysprof-ui/sysprof-details-view.c
+++ b/src/libsysprof-ui/sysprof-details-view.c
@@ -31,6 +31,10 @@
 struct _SysprofDetailsView
 {
   GtkBin    parent_instance;
+
+  /* Template Objects */
+  GtkBox *left_box;
+  GtkBox *center_box;
   GtkLabel *duration;
   GtkLabel *filename;
   GtkLabel *forks;
@@ -38,6 +42,7 @@ struct _SysprofDetailsView
   GtkLabel *processes;
   GtkLabel *samples;
   GtkLabel *start_time;
+  GtkBox   *vbox;
 };
 
 G_DEFINE_TYPE (SysprofDetailsView, sysprof_details_view, GTK_TYPE_BIN)
@@ -87,6 +92,9 @@ sysprof_details_view_class_init (SysprofDetailsViewClass *klass)
   gtk_widget_class_bind_template_child (widget_class, SysprofDetailsView, processes);
   gtk_widget_class_bind_template_child (widget_class, SysprofDetailsView, samples);
   gtk_widget_class_bind_template_child (widget_class, SysprofDetailsView, start_time);
+  gtk_widget_class_bind_template_child (widget_class, SysprofDetailsView, vbox);
+  gtk_widget_class_bind_template_child (widget_class, SysprofDetailsView, left_box);
+  gtk_widget_class_bind_template_child (widget_class, SysprofDetailsView, center_box);
 }
 
 static void
@@ -150,3 +158,20 @@ sysprof_details_view_set_reader (SysprofDetailsView   *self,
 #undef SET_FRAME_COUNT
     }
 }
+
+void
+sysprof_details_view_add_item (SysprofDetailsView *self,
+                               GtkWidget          *left,
+                               GtkWidget          *center)
+{
+  g_return_if_fail (SYSPROF_IS_DETAILS_VIEW (self));
+  g_return_if_fail (GTK_IS_WIDGET (left));
+  g_return_if_fail (GTK_IS_WIDGET (center));
+
+  gtk_container_add_with_properties (GTK_CONTAINER (self->left_box), left,
+                                     "pack-type", GTK_PACK_START,
+                                     "expand", TRUE,
+                                     "fill", TRUE,
+                                     NULL);
+  gtk_container_add (GTK_CONTAINER (self->center_box), center);
+}
diff --git a/src/libsysprof-ui/sysprof-details-view.h b/src/libsysprof-ui/sysprof-details-view.h
index d11d7f6..defe8bf 100644
--- a/src/libsysprof-ui/sysprof-details-view.h
+++ b/src/libsysprof-ui/sysprof-details-view.h
@@ -32,5 +32,8 @@ G_DECLARE_FINAL_TYPE (SysprofDetailsView, sysprof_details_view, SYSPROF, DETAILS
 GtkWidget *sysprof_details_view_new        (void);
 void       sysprof_details_view_set_reader (SysprofDetailsView   *self,
                                             SysprofCaptureReader *reader);
+void       sysprof_details_view_add_item   (SysprofDetailsView   *self,
+                                            GtkWidget            *left,
+                                            GtkWidget            *center);
 
 G_END_DECLS
diff --git a/src/libsysprof-ui/ui/sysprof-capture-view.ui b/src/libsysprof-ui/ui/sysprof-capture-view.ui
index 1071cc8..4cc195b 100644
--- a/src/libsysprof-ui/ui/sysprof-capture-view.ui
+++ b/src/libsysprof-ui/ui/sysprof-capture-view.ui
@@ -142,7 +142,6 @@
                 </child>
                 <child>
                   <object class="SysprofDetailsView" id="details_view">
-                    <property name="margin">36</property>
                     <property name="visible">true</property>
                   </object>
                   <packing>
diff --git a/src/libsysprof-ui/ui/sysprof-details-view.ui b/src/libsysprof-ui/ui/sysprof-details-view.ui
index f4863a4..87652dd 100644
--- a/src/libsysprof-ui/ui/sysprof-details-view.ui
+++ b/src/libsysprof-ui/ui/sysprof-details-view.ui
@@ -5,169 +5,178 @@
   <template class="SysprofDetailsView" parent="GtkBin">
     <property name="can_focus">False</property>
     <child>
-      <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
+      <object class="GtkScrolledWindow">
+        <property name="hscrollbar-policy">never</property>
+        <property name="propagate-natural-height">true</property>
+        <property name="visible">true</property>
         <child>
-          <object class="GtkBox">
+          <object class="GtkBox" id="vbox">
+            <property name="margin">36</property>
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="vexpand">True</property>
-            <property name="spacing">12</property>
+            <property name="orientation">vertical</property>
             <child>
               <object class="GtkBox">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="halign">end</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">6</property>
+                <property name="spacing">12</property>
                 <child>
-                  <object class="GtkLabel">
+                  <object class="GtkBox" id="left_box">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Filename</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
+                    <property name="halign">end</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Filename</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Captured At</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Duration</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="margin-top">12</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Samples Captured</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Marks Captured</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Processes Captured</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="margin-bottom">12</property>
+                        <property name="label" translatable="yes">Forks Captured</property>
+                        <property name="xalign">1</property>
+                        <style>
+                          <class name="dim-label"/>
+                        </style>
+                      </object>
+                    </child>
                   </object>
+                  <packing>
+                    <property name="pack-type">start</property>
+                    <property name="position">0</property>
+                    <property name="expand">true</property>
+                    <property name="fill">true</property>
+                  </packing>
                 </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Captured At</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Duration</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="margin-top">12</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Samples Captured</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Marks Captured</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Processes Captured</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" translatable="yes">Forks Captured</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-              </object>
-              <packing>
-                <property name="pack-type">start</property>
-                <property name="position">0</property>
-                <property name="expand">true</property>
-                <property name="fill">true</property>
-              </packing>
-            </child>
-            <child type="center">
-              <object class="GtkBox">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">6</property>
-                <child>
-                  <object class="GtkLabel" id="filename">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="ellipsize">start</property>
-                    <property name="xalign">0</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="start_time">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="ellipsize">start</property>
-                    <property name="xalign">0</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="duration">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">0</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="samples">
-                    <property name="margin-top">12</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="ellipsize">start</property>
-                    <property name="xalign">0</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="marks">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="ellipsize">start</property>
-                    <property name="xalign">0</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="processes">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="ellipsize">start</property>
-                    <property name="xalign">0</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="forks">
+                <child type="center">
+                  <object class="GtkBox" id="center_box">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="ellipsize">start</property>
-                    <property name="xalign">0</property>
+                    <property name="orientation">vertical</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <object class="GtkLabel" id="filename">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="ellipsize">start</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="start_time">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="ellipsize">start</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="duration">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="samples">
+                        <property name="margin-top">12</property>
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="ellipsize">start</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="marks">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="ellipsize">start</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="processes">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="ellipsize">start</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkLabel" id="forks">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="ellipsize">start</property>
+                        <property name="margin-bottom">12</property>
+                        <property name="xalign">0</property>
+                      </object>
+                    </child>
                   </object>
                 </child>
               </object>


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