diff --git a/lib/util/rectangles.c b/lib/util/rectangles.c index 14ff26be..653cc985 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 944b7a1c..e733392c 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 413e715b..16e05811 100644 --- a/lib/visualizers/sp-mark-visualizer-row.c +++ b/lib/visualizers/sp-mark-visualizer-row.c @@ -117,6 +117,24 @@ sp_mark_visualizer_row_worker (GTask *task, g_task_return_pointer (task, g_steal_pointer (&state->rects), (GDestroyNotify)rectangles_free); } +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,