From caa95fcca706c212f919d47a94859c27ec48c985 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Thu, 29 Sep 2016 14:37:00 -0700 Subject: [PATCH] visualizer-view: implement basic panning There are lots of little things that need fixing, such as the ticks positioning, and reusing surfaces as much as possible, but this gets our "MVP" panning in place. --- lib/resources/ui/sp-visualizer-view.ui | 25 ++++++++-- lib/sp-visualizer-view.c | 66 ++++++++++++++++++++++++-- 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/lib/resources/ui/sp-visualizer-view.ui b/lib/resources/ui/sp-visualizer-view.ui index 8dc003bc..638174ef 100644 --- a/lib/resources/ui/sp-visualizer-view.ui +++ b/lib/resources/ui/sp-visualizer-view.ui @@ -12,11 +12,25 @@ - + + vertical true - true - + + external + true + true + + + true + + + + + + + scroll_adjustment + horizontal true @@ -25,4 +39,9 @@ + + 0.0 + 0.0 + 0.0 + diff --git a/lib/sp-visualizer-view.c b/lib/sp-visualizer-view.c index 39f90f33..cb046dbc 100644 --- a/lib/sp-visualizer-view.c +++ b/lib/sp-visualizer-view.c @@ -29,10 +29,11 @@ typedef struct { SpCaptureReader *reader; + SpZoomManager *zoom_manager; SpVisualizerList *list; + GtkAdjustment *scroll_adjustment; SpVisualizerTicks *ticks; - SpZoomManager *zoom_manager; } SpVisualizerViewPrivate; enum { @@ -84,6 +85,41 @@ sp_visualizer_view_row_removed (SpVisualizerView *self, g_signal_emit (self, signals [VISUALIZER_REMOVED], 0, widget); } +static void +sp_visualizer_view_set_time_range (SpVisualizerView *self, + gint64 begin_time, + gint64 end_time) +{ + SpVisualizerViewPrivate *priv = sp_visualizer_view_get_instance_private (self); + + g_assert (SP_IS_VISUALIZER_VIEW (self)); + + if (begin_time < end_time) + { + gint64 tmp = begin_time; + begin_time = end_time; + end_time = tmp; + } + + sp_visualizer_list_set_time_range (priv->list, begin_time, end_time); + sp_visualizer_ticks_set_time_range (priv->ticks, begin_time, end_time); +} + +static void +sp_visualizer_view_adjustment_value_changed (SpVisualizerView *self, + GtkAdjustment *adjustment) +{ + gint64 begin_time; + gint64 end_time; + + g_assert (SP_IS_VISUALIZER_VIEW (self)); + g_assert (GTK_IS_ADJUSTMENT (adjustment)); + + begin_time = gtk_adjustment_get_value (adjustment); + end_time = begin_time + gtk_adjustment_get_page_size (adjustment); + sp_visualizer_view_set_time_range (self, begin_time, end_time); +} + static void sp_visualizer_view_notify_zoom (SpVisualizerView *self, GParamSpec *pspec, @@ -104,8 +140,8 @@ sp_visualizer_view_notify_zoom (SpVisualizerView *self, end_time = begin_time + (NSEC_PER_SEC * 60.0 / zoom); - sp_visualizer_list_set_time_range (priv->list, begin_time, end_time); - sp_visualizer_ticks_set_time_range (priv->ticks, begin_time, end_time); + sp_visualizer_view_set_time_range (self, begin_time, end_time); + gtk_adjustment_set_page_size (priv->scroll_adjustment, end_time - begin_time); } static void @@ -210,6 +246,7 @@ sp_visualizer_view_class_init (SpVisualizerViewClass *klass) gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/sysprof/ui/sp-visualizer-view.ui"); gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, list); + gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, scroll_adjustment); gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, ticks); gtk_widget_class_set_css_name (widget_class, "visualizers"); @@ -233,6 +270,12 @@ sp_visualizer_view_init (SpVisualizerView *self) G_CALLBACK (sp_visualizer_view_row_removed), self, G_CONNECT_SWAPPED); + + g_signal_connect_object (priv->scroll_adjustment, + "value-changed", + G_CALLBACK (sp_visualizer_view_adjustment_value_changed), + self, + G_CONNECT_SWAPPED); } /** @@ -261,9 +304,24 @@ sp_visualizer_view_set_reader (SpVisualizerView *self, if (priv->reader != reader) { g_clear_pointer (&priv->reader, sp_capture_reader_unref); - priv->reader = sp_capture_reader_ref (reader); g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_READER]); sp_visualizer_list_set_reader (priv->list, reader); + if (reader != NULL) + { + gint64 begin_time = 0; + gint64 end_time = 0; + + priv->reader = sp_capture_reader_ref (reader); + begin_time = sp_capture_reader_get_start_time (reader); + end_time = sp_capture_reader_get_end_time (reader); + + g_object_set (priv->scroll_adjustment, + "lower", (gdouble)begin_time, + "upper", (gdouble)end_time, + "value", (gdouble)begin_time, + NULL); + } + if (priv->zoom_manager != NULL) sp_visualizer_view_notify_zoom (self, NULL, priv->zoom_manager); }