[sysprof] rectangles: add basic tooltip support



commit 9381ae3070ef8d1173dbb0b55ebc57d97412d8d0
Author: Christian Hergert <chergert redhat com>
Date:   Wed May 16 16:33:46 2018 +0100

    rectangles: add basic tooltip support
    
    We definitely want to do something better, but this at least allows testing
    some data which is useful now to see what is going on.

 lib/util/rectangles.c                    |   30 +++++++++++++++++++++++++++++
 lib/util/rectangles.h                    |   31 +++++++++++++++++------------
 lib/visualizers/sp-mark-visualizer-row.c |   21 ++++++++++++++++++++
 3 files changed, 69 insertions(+), 13 deletions(-)
---
diff --git a/lib/util/rectangles.c b/lib/util/rectangles.c
index 14ff26b..653cc98 100644
--- a/lib/util/rectangles.c
+++ b/lib/util/rectangles.c
@@ -200,3 +200,33 @@ rectangles_set_end_time (Rectangles *self,
   /* We might not know the real end time until we've exhausted the stream */
   self->end_time = end_time;
 }
+
+gboolean
+rectangles_query_tooltip (Rectangles  *self,
+                          GtkTooltip  *tooltip,
+                          const gchar *group,
+                          gint         x,
+                          gint         y)
+{
+  g_assert (self != NULL);
+  g_assert (GTK_IS_TOOLTIP (tooltip));
+
+  /* TODO: Sort, binary search, etc. */
+
+  for (guint i = 0; i < self->rectangles->len; i++)
+    {
+      const Rectangle *r = &g_array_index (self->rectangles, Rectangle, i);
+
+      if (r->area.x <= x &&
+          r->area.y <= y &&
+          r->area.x + r->area.width >= x &&
+          r->area.y + r->area.height >= y)
+        {
+          g_autofree gchar *text = g_strdup_printf ("%s:%s: %s", group, r->name, r->message);
+          gtk_tooltip_set_text (tooltip, text);
+          return TRUE;
+        }
+    }
+
+  return FALSE;
+}
diff --git a/lib/util/rectangles.h b/lib/util/rectangles.h
index 944b7a1..e733392 100644
--- a/lib/util/rectangles.h
+++ b/lib/util/rectangles.h
@@ -26,18 +26,23 @@ G_BEGIN_DECLS
 
 typedef struct _Rectangles Rectangles;
 
-Rectangles *rectangles_new          (gint64       begin_time,
-                                    gint64       end_time);
-void        rectangles_free         (Rectangles  *self);
-void        rectangles_draw         (Rectangles  *self,
-                                     GtkWidget   *widget,
-                                     cairo_t     *cr);
-void        rectangles_add          (Rectangles  *self,
-                                     gint64       begin_time,
-                                     gint64       end_time,
-                                     const gchar *name,
-                                     const gchar *message);
-void        rectangles_set_end_time (Rectangles  *self,
-                                     gint64       end_time);
+Rectangles *rectangles_new           (gint64       begin_time,
+                                      gint64       end_time);
+void        rectangles_free          (Rectangles  *self);
+void        rectangles_draw          (Rectangles  *self,
+                                      GtkWidget   *widget,
+                                      cairo_t     *cr);
+void        rectangles_add           (Rectangles  *self,
+                                      gint64       begin_time,
+                                      gint64       end_time,
+                                      const gchar *name,
+                                      const gchar *message);
+void        rectangles_set_end_time  (Rectangles  *self,
+                                      gint64       end_time);
+gboolean    rectangles_query_tooltip (Rectangles  *self,
+                                      GtkTooltip  *tooltip,
+                                      const gchar *group,
+                                      gint         x,
+                                      gint         y);
 
 G_END_DECLS
diff --git a/lib/visualizers/sp-mark-visualizer-row.c b/lib/visualizers/sp-mark-visualizer-row.c
index 413e715..16e0581 100644
--- a/lib/visualizers/sp-mark-visualizer-row.c
+++ b/lib/visualizers/sp-mark-visualizer-row.c
@@ -118,6 +118,24 @@ sp_mark_visualizer_row_worker (GTask        *task,
 }
 
 static gboolean
+sp_mark_visualizer_row_query_tooltip (GtkWidget  *widget,
+                                      gint        x,
+                                      gint        y,
+                                      gboolean    keyboard_mode,
+                                      GtkTooltip *tooltip)
+{
+  SpMarkVisualizerRow *self = (SpMarkVisualizerRow *)widget;
+  SpMarkVisualizerRowPrivate *priv = sp_mark_visualizer_row_get_instance_private (self);
+
+  g_assert (SP_IS_MARK_VISUALIZER_ROW (self));
+
+  if (priv->rectangles == NULL)
+    return FALSE;
+
+  return rectangles_query_tooltip (priv->rectangles, tooltip, priv->group, x, y);
+}
+
+static gboolean
 sp_mark_visualizer_row_draw (GtkWidget *widget,
                              cairo_t   *cr)
 {
@@ -282,6 +300,7 @@ sp_mark_visualizer_row_class_init (SpMarkVisualizerRowClass *klass)
   object_class->set_property = sp_mark_visualizer_row_set_property;
 
   widget_class->draw = sp_mark_visualizer_row_draw;
+  widget_class->query_tooltip = sp_mark_visualizer_row_query_tooltip;
 
   visualizer_class->set_reader = sp_mark_visualizer_row_set_reader;
 
@@ -308,6 +327,8 @@ sp_mark_visualizer_row_init (SpMarkVisualizerRow *self)
   SpMarkVisualizerRowPrivate *priv = sp_mark_visualizer_row_get_instance_private (self);
   PangoAttrList *attrs = pango_attr_list_new ();
 
+  gtk_widget_set_has_tooltip (GTK_WIDGET (self), TRUE);
+
   pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_SMALL * PANGO_SCALE_SMALL));
 
   priv->label = g_object_new (GTK_TYPE_LABEL,


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