[sysprof/wip/chergert/sysprof-3] libsysprof-ui: pan when selection changes
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [sysprof/wip/chergert/sysprof-3] libsysprof-ui: pan when selection changes
- Date: Thu, 16 May 2019 01:58:31 +0000 (UTC)
commit cf124402d00013669aff4730a27b35ef4d72a32c
Author: Christian Hergert <chergert redhat com>
Date: Wed May 15 18:58:22 2019 -0700
libsysprof-ui: pan when selection changes
This helps keep things in view while moving around.
src/libsysprof-ui/sysprof-marks-view.c | 67 +++++++++++++++++++++++++++++---
src/libsysprof-ui/sysprof-zoom-manager.c | 15 +++++++
src/libsysprof-ui/sysprof-zoom-manager.h | 4 ++
3 files changed, 80 insertions(+), 6 deletions(-)
---
diff --git a/src/libsysprof-ui/sysprof-marks-view.c b/src/libsysprof-ui/sysprof-marks-view.c
index dda7acd..ab11029 100644
--- a/src/libsysprof-ui/sysprof-marks-view.c
+++ b/src/libsysprof-ui/sysprof-marks-view.c
@@ -31,6 +31,9 @@ typedef struct
{
SysprofZoomManager *zoom_manager;
+ gint64 capture_begin_time;
+ gint64 capture_end_time;
+
/* Template objects */
GtkScrolledWindow *scroller;
GtkTreeView *tree_view;
@@ -48,6 +51,52 @@ static GParamSpec *properties [N_PROPS];
G_DEFINE_TYPE_WITH_PRIVATE (SysprofMarksView, sysprof_marks_view, GTK_TYPE_BIN)
+static void
+sysprof_marks_view_selection_changed_cb (SysprofMarksView *self,
+ GtkTreeSelection *selection)
+{
+ SysprofMarksViewPrivate *priv = sysprof_marks_view_get_instance_private (self);
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+
+ g_assert (SYSPROF_IS_MARKS_VIEW (self));
+ g_assert (GTK_IS_TREE_SELECTION (selection));
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ GtkAdjustment *adj;
+ gdouble x;
+ gint64 begin_time;
+ gdouble lower;
+ gdouble upper;
+ gdouble value;
+ gdouble page_size;
+ gint width;
+
+ gtk_tree_model_get (model, &iter,
+ SYSPROF_MARKS_MODEL_COLUMN_BEGIN_TIME, &begin_time,
+ -1);
+
+ adj = gtk_scrolled_window_get_hadjustment (priv->scroller);
+ width = gtk_tree_view_column_get_width (priv->duration_column);
+ x = sysprof_zoom_manager_get_offset_at_time (priv->zoom_manager,
+ begin_time - priv->capture_begin_time,
+ width);
+
+ g_object_get (adj,
+ "lower", &lower,
+ "upper", &upper,
+ "value", &value,
+ "page-size", &page_size,
+ NULL);
+
+ if (x < value)
+ gtk_adjustment_set_value (adj, MAX (lower, x - (page_size / 3.0)));
+ else if (x > (value + page_size))
+ gtk_adjustment_set_value (adj, MIN (upper - page_size, (x - (page_size / 3.0))));
+ }
+}
+
static void
sysprof_marks_view_finalize (GObject *object)
{
@@ -139,7 +188,15 @@ sysprof_marks_view_class_init (SysprofMarksViewClass *klass)
static void
sysprof_marks_view_init (SysprofMarksView *self)
{
+ SysprofMarksViewPrivate *priv = sysprof_marks_view_get_instance_private (self);
+
gtk_widget_init_template (GTK_WIDGET (self));
+
+ g_signal_connect_object (gtk_tree_view_get_selection (priv->tree_view),
+ "changed",
+ G_CALLBACK (sysprof_marks_view_selection_changed_cb),
+ self,
+ G_CONNECT_SWAPPED);
}
GtkWidget *
@@ -159,8 +216,6 @@ sysprof_marks_view_load_cb (GObject *object,
SysprofMarksViewPrivate *priv;
SysprofCaptureReader *reader;
SysprofMarksView *self;
- gint64 capture_begin_time;
- gint64 capture_end_time;
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (G_IS_TASK (task));
@@ -177,12 +232,12 @@ sysprof_marks_view_load_cb (GObject *object,
reader = g_task_get_task_data (task);
g_assert (reader != NULL);
- capture_begin_time = sysprof_capture_reader_get_start_time (reader);
- capture_end_time = sysprof_capture_reader_get_end_time (reader);
+ priv->capture_begin_time = sysprof_capture_reader_get_start_time (reader);
+ priv->capture_end_time = sysprof_capture_reader_get_end_time (reader);
g_object_set (priv->duration_cell,
- "capture-begin-time", capture_begin_time,
- "capture-end-time", capture_end_time,
+ "capture-begin-time", priv->capture_begin_time,
+ "capture-end-time", priv->capture_end_time,
"zoom-manager", priv->zoom_manager,
NULL);
diff --git a/src/libsysprof-ui/sysprof-zoom-manager.c b/src/libsysprof-ui/sysprof-zoom-manager.c
index e8f97ef..b903aca 100644
--- a/src/libsysprof-ui/sysprof-zoom-manager.c
+++ b/src/libsysprof-ui/sysprof-zoom-manager.c
@@ -527,3 +527,18 @@ sysprof_zoom_manager_fit_zoom_for_duration (SysprofZoomManager *self,
return (width / DEFAULT_PIXELS_PER_SEC) / (duration / (gdouble)NSEC_PER_SEC);
}
+
+gdouble
+sysprof_zoom_manager_get_offset_at_time (SysprofZoomManager *self,
+ gint64 offset,
+ gint width)
+{
+ gint64 full_duration;
+ gdouble ratio;
+
+ g_return_val_if_fail (SYSPROF_IS_ZOOM_MANAGER (self), 0.0);
+
+ full_duration = sysprof_zoom_manager_get_duration_for_width (self, width);
+ ratio = offset / (gdouble)full_duration;
+ return ratio * width;
+}
diff --git a/src/libsysprof-ui/sysprof-zoom-manager.h b/src/libsysprof-ui/sysprof-zoom-manager.h
index 5b777b2..8b84953 100644
--- a/src/libsysprof-ui/sysprof-zoom-manager.h
+++ b/src/libsysprof-ui/sysprof-zoom-manager.h
@@ -74,5 +74,9 @@ SYSPROF_AVAILABLE_IN_ALL
gdouble sysprof_zoom_manager_fit_zoom_for_duration (SysprofZoomManager *self,
gint64 duration,
gint width);
+SYSPROF_AVAILABLE_IN_ALL
+gdouble sysprof_zoom_manager_get_offset_at_time (SysprofZoomManager *self,
+ gint64 offset,
+ gint width);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]