[gnome-builder] sourceview: add IdeSourceScrollAlign



commit dbbdc8af37c1856f7ee8a95788dc27b366aeba4c
Author: Christian Hergert <chergert redhat com>
Date:   Tue Nov 21 16:41:13 2017 -0800

    sourceview: add IdeSourceScrollAlign
    
    This flags-like enum is created to allow choosing to scroll
    X, Y, or both X and Y.
    
    It does not follow the typical mask-style of flags because we
    want it to stay compatible with TRUE/FALSE as the parameter
    original provided. So we just use a simple macro to determine
    if X or Y should be scrolled.

 src/libide/sourceview/ide-source-view-movements.c |    4 +-
 src/libide/sourceview/ide-source-view.c           |   47 +++++++++++---------
 src/libide/sourceview/ide-source-view.h           |   14 +++++-
 3 files changed, 40 insertions(+), 25 deletions(-)
---
diff --git a/src/libide/sourceview/ide-source-view-movements.c 
b/src/libide/sourceview/ide-source-view-movements.c
index 7e2f258..f4102a3 100644
--- a/src/libide/sourceview/ide-source-view-movements.c
+++ b/src/libide/sourceview/ide-source-view-movements.c
@@ -45,6 +45,7 @@ typedef struct
    */
   guint                 *target_column;
   IdeSourceViewMovement  type;                        /* Type of movement */
+  IdeSourceScrollAlign   scroll_align;                /* How to align the post-movement scroll */
   GtkTextIter            insert;                      /* Current insert cursor location */
   GtkTextIter            selection;                   /* Current selection cursor location */
   gint                   count;                       /* Repeat count for movement */
@@ -1994,6 +1995,7 @@ _ide_source_view_apply_movement (IdeSourceView         *self,
   mv.self = self;
   mv.target_column = target_column;
   mv.type = movement;
+  mv.scroll_align = IDE_SOURCE_SCROLL_BOTH;
   mv.extend_selection = extend_selection;
   mv.exclusive = exclusive;
   mv.count = count;
@@ -2334,7 +2336,7 @@ _ide_source_view_apply_movement (IdeSourceView         *self,
     ide_source_view_get_visual_position (mv.self, &line, target_column);
 
   if (!mv.ignore_scroll_to_insert)
-    ide_source_view_scroll_mark_onscreen (self, insert, TRUE, xalign, 0.5);
+    ide_source_view_scroll_mark_onscreen (self, insert, mv.scroll_align, xalign, 0.5);
 
   /* Emit a jump if we moved more than JUMP_THRESHOLD lines */
   gtk_text_buffer_get_iter_at_mark (buffer, &after_insert, insert);
diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c
index 7808c25..7c61578 100644
--- a/src/libide/sourceview/ide-source-view.c
+++ b/src/libide/sourceview/ide-source-view.c
@@ -88,6 +88,11 @@
   IDE_TRACE_MSG ("%s = Rectangle(x=%d, y=%d, width=%d, height=%d)", \
                  name, (rect)->x, (rect)->y, (rect)->width, (rect)->height)
 
+#define SCROLL_X(align) \
+  (((align) == IDE_SOURCE_SCROLL_BOTH) || ((align) == IDE_SOURCE_SCROLL_X))
+#define SCROLL_Y(align) \
+  (((align) == IDE_SOURCE_SCROLL_BOTH) || ((align) == IDE_SOURCE_SCROLL_Y))
+
 typedef struct
 {
   IdeBuffer                   *buffer;
@@ -7381,11 +7386,11 @@ ide_source_view_get_visible_rect (IdeSourceView *self,
 }
 
 void
-ide_source_view_scroll_mark_onscreen (IdeSourceView *self,
-                                      GtkTextMark   *mark,
-                                      gboolean       use_align,
-                                      gdouble        alignx,
-                                      gdouble        aligny)
+ide_source_view_scroll_mark_onscreen (IdeSourceView        *self,
+                                      GtkTextMark          *mark,
+                                      IdeSourceScrollAlign  use_align,
+                                      gdouble               alignx,
+                                      gdouble               aligny)
 {
   GtkTextView *text_view = (GtkTextView *)self;
   GtkTextBuffer *buffer;
@@ -7497,13 +7502,13 @@ ide_source_view__vadj_animation_completed (IdeSourceView *self)
  * https://developer.gnome.org/gtk3/stable/GtkTextView.html#gtk-text-view-scroll-to-iter
  */
 void
-ide_source_view_scroll_to_iter (IdeSourceView     *self,
-                                const GtkTextIter *iter,
-                                gdouble            within_margin,
-                                gboolean           use_align,
-                                gdouble            xalign,
-                                gdouble            yalign,
-                                gboolean           animate_scroll)
+ide_source_view_scroll_to_iter (IdeSourceView        *self,
+                                const GtkTextIter    *iter,
+                                gdouble               within_margin,
+                                IdeSourceScrollAlign  use_align,
+                                gdouble               xalign,
+                                gdouble               yalign,
+                                gboolean              animate_scroll)
 {
   IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
   GtkTextView *text_view = (GtkTextView *)self;
@@ -7580,7 +7585,7 @@ ide_source_view_scroll_to_iter (IdeSourceView     *self,
 
   /* Vertical alignment */
   scroll_dest = current_y_scroll;
-  if (use_align)
+  if (SCROLL_Y (use_align))
     {
       scroll_dest = rect.y + (rect.height * yalign) - (screen.height * yalign);
 
@@ -7629,7 +7634,7 @@ ide_source_view_scroll_to_iter (IdeSourceView     *self,
 
   /* Horizontal alignment */
   scroll_dest = current_x_scroll;
-  if (use_align)
+  if (SCROLL_X (use_align))
     {
       scroll_dest = rect.x + (rect.width * xalign) - (screen.width * xalign);
 
@@ -7724,13 +7729,13 @@ ignore_animation:
 }
 
 void
-ide_source_view_scroll_to_mark (IdeSourceView *self,
-                                GtkTextMark   *mark,
-                                gdouble        within_margin,
-                                gboolean       use_align,
-                                gdouble        xalign,
-                                gdouble        yalign,
-                                gboolean       animate_scroll)
+ide_source_view_scroll_to_mark (IdeSourceView        *self,
+                                GtkTextMark          *mark,
+                                gdouble               within_margin,
+                                IdeSourceScrollAlign  use_align,
+                                gdouble               xalign,
+                                gdouble               yalign,
+                                gboolean              animate_scroll)
 {
   GtkTextBuffer *buffer;
   GtkTextIter iter;
diff --git a/src/libide/sourceview/ide-source-view.h b/src/libide/sourceview/ide-source-view.h
index d083963..9a11133 100644
--- a/src/libide/sourceview/ide-source-view.h
+++ b/src/libide/sourceview/ide-source-view.h
@@ -226,6 +226,14 @@ typedef enum
   IDE_SOURCE_VIEW_MOVEMENT_PREVIOUS_MATCH_SEARCH_CHAR,
 } IdeSourceViewMovement;
 
+typedef enum
+{
+  IDE_SOURCE_SCROLL_NONE = 0,
+  IDE_SOURCE_SCROLL_BOTH = 1,
+  IDE_SOURCE_SCROLL_X    = 1 << 1,
+  IDE_SOURCE_SCROLL_Y    = 1 << 2,
+} IdeSourceScrollAlign;
+
 struct _IdeSourceViewClass
 {
   GtkSourceViewClass parent_class;
@@ -466,14 +474,14 @@ void                        ide_source_view_clear_search              (IdeSource
 IDE_AVAILABLE_IN_ALL
 void                        ide_source_view_scroll_mark_onscreen      (IdeSourceView              *self,
                                                                        GtkTextMark                *mark,
-                                                                       gboolean                    use_align,
+                                                                       IdeSourceScrollAlign        use_align,
                                                                        gdouble                     alignx,
                                                                        gdouble                     aligny);
 IDE_AVAILABLE_IN_ALL
 void                        ide_source_view_scroll_to_mark            (IdeSourceView              *self,
                                                                        GtkTextMark                *mark,
                                                                        gdouble                     
within_margin,
-                                                                       gboolean                    use_align,
+                                                                       IdeSourceScrollAlign        use_align,
                                                                        gdouble                     xalign,
                                                                        gdouble                     yalign,
                                                                        gboolean                    
animate_scroll);
@@ -481,7 +489,7 @@ IDE_AVAILABLE_IN_ALL
 void                        ide_source_view_scroll_to_iter            (IdeSourceView              *self,
                                                                        const GtkTextIter          *iter,
                                                                        gdouble                     
within_margin,
-                                                                       gboolean                    use_align,
+                                                                       IdeSourceScrollAlign        use_align,
                                                                        gdouble                     xalign,
                                                                        gdouble                     yalign,
                                                                        gboolean                    
animate_scroll);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]