[sysprof] libsysprof-ui: pan when selection changes



commit 3210926f150e432249324c3715f8b6708ad0baf5
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]