[sysprof/wip/visualizers] visualizer-view: fix time range for ticks
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sysprof/wip/visualizers] visualizer-view: fix time range for ticks
- Date: Fri, 7 Oct 2016 04:05:21 +0000 (UTC)
commit 72a8276fafbe293d7cb3da498856508118e8bf63
Author: Christian Hergert <chergert redhat com>
Date: Thu Oct 6 21:03:01 2016 -0700
visualizer-view: fix time range for ticks
This uses the graph_width to get the proper time range of the
visualizer row. Mostly, this is just complicated because we
the ticks to be an overlay rather than inline with the list
rows.
lib/resources/ui/sp-visualizer-view.ui | 7 +--
lib/sp-visualizer-view.c | 141 ++++++++++++++++++++++++++++++-
2 files changed, 137 insertions(+), 11 deletions(-)
---
diff --git a/lib/resources/ui/sp-visualizer-view.ui b/lib/resources/ui/sp-visualizer-view.ui
index 45ec522..742f9a1 100644
--- a/lib/resources/ui/sp-visualizer-view.ui
+++ b/lib/resources/ui/sp-visualizer-view.ui
@@ -12,7 +12,7 @@
</object>
</child>
<child>
- <object class="GtkScrolledWindow">
+ <object class="GtkScrolledWindow" id="scroller">
<property name="propagate-natural-height">true</property>
<property name="propagate-natural-width">false</property>
<property name="visible">true</property>
@@ -26,9 +26,4 @@
</object>
</child>
</template>
- <object class="GtkAdjustment" id="scroll_adjustment">
- <property name="lower">0.0</property>
- <property name="upper">0.0</property>
- <property name="value">0.0</property>
- </object>
</interface>
diff --git a/lib/sp-visualizer-view.c b/lib/sp-visualizer-view.c
index 5890ed5..e4bd557 100644
--- a/lib/sp-visualizer-view.c
+++ b/lib/sp-visualizer-view.c
@@ -21,10 +21,13 @@
#include <glib/gi18n.h>
#include "sp-visualizer-list.h"
+#include "sp-visualizer-row.h"
+#include "sp-visualizer-row-private.h"
#include "sp-visualizer-ticks.h"
#include "sp-visualizer-view.h"
#define NSEC_PER_SEC G_GINT64_CONSTANT(1000000000)
+#define DEFAULT_PIXELS_PER_SECOND 20
typedef struct
{
@@ -32,7 +35,7 @@ typedef struct
SpZoomManager *zoom_manager;
SpVisualizerList *list;
- GtkAdjustment *scroll_adjustment;
+ GtkScrolledWindow *scroller;
SpVisualizerTicks *ticks;
} SpVisualizerViewPrivate;
@@ -86,6 +89,80 @@ sp_visualizer_view_row_removed (SpVisualizerView *self,
}
static void
+find_row1 (GtkWidget *widget,
+ gpointer data)
+{
+ GtkWidget **row1 = data;
+
+ if (*row1 == NULL && SP_IS_VISUALIZER_ROW (widget))
+ *row1 = widget;
+}
+
+static void
+sp_visualizer_view_update_ticks (SpVisualizerView *self)
+{
+ SpVisualizerViewPrivate *priv = sp_visualizer_view_get_instance_private (self);
+ SpVisualizerRow *row1 = NULL;
+ GtkAdjustment *hadjustment;
+ GtkAllocation alloc;
+ gdouble nsec_per_pixel;
+ gdouble value;
+ gint64 begin_time;
+ gint64 end_time;
+ gint graph_width;
+
+ g_assert (SP_IS_VISUALIZER_VIEW (self));
+
+ if (priv->reader == NULL)
+ return;
+
+ begin_time = sp_capture_reader_get_start_time (priv->reader);
+ end_time = sp_capture_reader_get_end_time (priv->reader);
+
+ gtk_container_foreach (GTK_CONTAINER (priv->list), find_row1, &row1);
+
+ if (!SP_IS_VISUALIZER_ROW (row1))
+ return;
+
+ hadjustment = gtk_scrolled_window_get_hadjustment (priv->scroller);
+ value = gtk_adjustment_get_value (hadjustment);
+
+ gtk_widget_get_allocation (GTK_WIDGET (priv->ticks), &alloc);
+
+ /* In practice, the adjustment is 1.0 per pixel. */
+ graph_width = _sp_visualizer_row_get_graph_width (row1);
+ nsec_per_pixel = (end_time - begin_time) / (gdouble)graph_width;
+ begin_time += value * nsec_per_pixel;
+ end_time = begin_time + (alloc.width * nsec_per_pixel);
+
+ sp_visualizer_ticks_set_time_range (priv->ticks, begin_time, end_time);
+}
+
+static void
+sp_visualizer_view_hadjustment_value_changed (SpVisualizerView *self,
+ GtkAdjustment *adjustment)
+{
+ g_assert (SP_IS_VISUALIZER_VIEW (self));
+ g_assert (GTK_IS_ADJUSTMENT (adjustment));
+
+ sp_visualizer_view_update_ticks (self);
+}
+
+static void
+sp_visualizer_view_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
+{
+ SpVisualizerView *self = (SpVisualizerView *)widget;
+
+ g_assert (SP_IS_VISUALIZER_VIEW (self));
+ g_assert (allocation != NULL);
+
+ GTK_WIDGET_CLASS (sp_visualizer_view_parent_class)->size_allocate (widget, allocation);
+
+ sp_visualizer_view_update_ticks (self);
+}
+
+static void
sp_visualizer_view_finalize (GObject *object)
{
SpVisualizerView *self = (SpVisualizerView *)object;
@@ -153,6 +230,8 @@ sp_visualizer_view_class_init (SpVisualizerViewClass *klass)
object_class->get_property = sp_visualizer_view_get_property;
object_class->set_property = sp_visualizer_view_set_property;
+ widget_class->size_allocate = sp_visualizer_view_size_allocate;
+
properties [PROP_READER] =
g_param_spec_boxed ("reader",
"Reader",
@@ -187,7 +266,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, scroller);
gtk_widget_class_bind_template_child_private (widget_class, SpVisualizerView, ticks);
gtk_widget_class_set_css_name (widget_class, "visualizers");
@@ -197,6 +276,7 @@ static void
sp_visualizer_view_init (SpVisualizerView *self)
{
SpVisualizerViewPrivate *priv = sp_visualizer_view_get_instance_private (self);
+ GtkAdjustment *hadjustment;
gtk_widget_init_template (GTK_WIDGET (self));
@@ -211,6 +291,14 @@ sp_visualizer_view_init (SpVisualizerView *self)
G_CALLBACK (sp_visualizer_view_row_removed),
self,
G_CONNECT_SWAPPED);
+
+ hadjustment = gtk_scrolled_window_get_hadjustment (priv->scroller);
+
+ g_signal_connect_object (hadjustment,
+ "value-changed",
+ G_CALLBACK (sp_visualizer_view_hadjustment_value_changed),
+ self,
+ G_CONNECT_SWAPPED);
}
/**
@@ -239,9 +327,22 @@ sp_visualizer_view_set_reader (SpVisualizerView *self,
if (priv->reader != reader)
{
g_clear_pointer (&priv->reader, sp_capture_reader_unref);
+
if (reader != NULL)
- priv->reader = sp_capture_reader_ref (reader);
+ {
+ gint64 begin_time;
+
+ priv->reader = sp_capture_reader_ref (reader);
+
+ begin_time = sp_capture_reader_get_start_time (priv->reader);
+
+ sp_visualizer_ticks_set_epoch (priv->ticks, begin_time);
+ sp_visualizer_ticks_set_time_range (priv->ticks, begin_time, begin_time);
+ }
+
sp_visualizer_list_set_reader (priv->list, reader);
+ sp_visualizer_view_update_ticks (self);
+
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_READER]);
}
}
@@ -275,6 +376,17 @@ buildable_iface_init (GtkBuildableIface *iface)
iface->add_child = sp_visualizer_view_add_child;
}
+static void
+sp_visualizer_view_zoom_manager_notify_zoom (SpVisualizerView *self,
+ GParamSpec *pspec,
+ SpZoomManager *zoom_manager)
+{
+ g_assert (SP_IS_VISUALIZER_VIEW (self));
+ g_assert (SP_IS_ZOOM_MANAGER (zoom_manager));
+
+ sp_visualizer_view_update_ticks (self);
+}
+
/**
* sp_visualizer_view_get_zoom_manager:
*
@@ -299,10 +411,29 @@ sp_visualizer_view_set_zoom_manager (SpVisualizerView *self,
g_return_if_fail (SP_IS_VISUALIZER_VIEW (self));
g_return_if_fail (!zoom_manager || SP_IS_ZOOM_MANAGER (zoom_manager));
- if (g_set_object (&priv->zoom_manager, zoom_manager))
+ if (priv->zoom_manager != zoom_manager)
{
+ if (priv->zoom_manager != NULL)
+ {
+ g_signal_handlers_disconnect_by_func (priv->zoom_manager,
+ G_CALLBACK (sp_visualizer_view_zoom_manager_notify_zoom),
+ self);
+ g_clear_object (&priv->zoom_manager);
+ }
+
+ if (zoom_manager != NULL)
+ {
+ priv->zoom_manager = g_object_ref (zoom_manager);
+ g_signal_connect_object (priv->zoom_manager,
+ "notify::zoom",
+ G_CALLBACK (sp_visualizer_view_zoom_manager_notify_zoom),
+ self,
+ G_CONNECT_SWAPPED);
+ }
+
sp_visualizer_list_set_zoom_manager (priv->list, zoom_manager);
- g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ZOOM_MANAGER]);
gtk_widget_queue_resize (GTK_WIDGET (self));
+
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ZOOM_MANAGER]);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]