[gnome-builder] source-view: Use bottom margin to scroll beyond the last line



commit cef7e387649f3627a3931a62a694454728082f69
Author: Joaquim Rocha <me joaquimrocha com>
Date:   Thu Nov 19 21:45:01 2015 +0100

    source-view: Use bottom margin to scroll beyond the last line
    
    The overlay scrollbars can cover the last line which makes it
    difficult to view and select it properly. These changes add a
    bottom margin to allow scrolling beyond the last line.
    
    This bottom margin can be set by using the property "overscroll"
    which receives the number of lines to scroll beyond the end of the
    buffer. If a negative number is given, it counts the lines from the
    top of the viewport (instead of the bottom).

 libide/ide-source-view.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)
---
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index a655167..5d52ea2 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -75,6 +75,7 @@
 #define LARGE_SCROLL_DURATION_MSEC 250
 #define FIXIT_LABEL_LEN_MAX 30
 #define SCROLL_REPLAY_DELAY 1000
+#define DEFAULT_OVERSCROLL_NUM_LINES 1
 
 #define ALL_ACCELS_MASK (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK)
 
@@ -168,6 +169,7 @@ typedef struct
   guint                        show_search_shadow : 1;
   guint                        snippet_completion : 1;
   guint                        waiting_for_capture : 1;
+  gint                         overscroll_num_lines;
 } IdeSourceViewPrivate;
 
 typedef struct
@@ -207,6 +209,7 @@ enum {
   PROP_SHOW_SEARCH_BUBBLES,
   PROP_SHOW_SEARCH_SHADOW,
   PROP_SNIPPET_COMPLETION,
+  PROP_OVERSCROLL,
   LAST_PROP,
 
   /* These are overridden */
@@ -3752,6 +3755,25 @@ ide_source_view_real_reindent (IdeSourceView *self)
 }
 
 static void
+ide_source_view_set_overscroll_num_lines (IdeSourceView *self,
+                                          gint           num_lines)
+{
+  IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
+  gint height = gtk_widget_get_allocated_height (GTK_WIDGET (self));
+  gint new_margin;
+
+  priv->overscroll_num_lines = num_lines;
+  new_margin = priv->overscroll_num_lines * priv->cached_char_height;
+
+  if (new_margin < 0)
+    new_margin = height + new_margin;
+
+  new_margin = CLAMP (new_margin, 0, height);
+
+  g_object_set (self, "bottom-margin", new_margin, NULL);
+}
+
+static void
 ide_source_view_constructed (GObject *object)
 {
   IdeSourceView *self = (IdeSourceView *)object;
@@ -5002,6 +5024,8 @@ ide_source_view_size_allocate (GtkWidget     *widget,
   if (!ide_source_view_do_size_allocate_hack (self, allocation))
     GTK_WIDGET_CLASS (ide_source_view_parent_class)->size_allocate (GTK_WIDGET (self), allocation);
 
+  ide_source_view_set_overscroll_num_lines (self, priv->overscroll_num_lines);
+
   /*
    * If we were in a scroll, and we got a size-allocate, we might need to adjust how far we
    * are scrolling. This could happen while the view is calculating text layout sizes and
@@ -5273,6 +5297,10 @@ ide_source_view_get_property (GObject    *object,
       g_value_set_boolean (value, ide_source_view_get_snippet_completion (self));
       break;
 
+    case PROP_OVERSCROLL:
+      g_value_set_int (value, priv->overscroll_num_lines);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -5370,6 +5398,10 @@ ide_source_view_set_property (GObject      *object,
       ide_source_view_set_snippet_completion (self, g_value_get_boolean (value));
       break;
 
+    case PROP_OVERSCROLL:
+      ide_source_view_set_overscroll_num_lines (self, g_value_get_int (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -5614,6 +5646,17 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
                           FALSE,
                           (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_OVERSCROLL] =
+    g_param_spec_int ("overscroll",
+                      "Overscroll",
+                      "The number of lines to scroll beyond the end of the "
+                      "buffer. A negative number of lines will scroll until "
+                      "only that number of lines is visible",
+                      G_MININT,
+                      G_MAXINT,
+                      DEFAULT_OVERSCROLL_NUM_LINES,
+                      (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_properties (object_class, LAST_PROP, properties);
 
   signals [ACTION] =
@@ -6216,6 +6259,7 @@ ide_source_view_init (IdeSourceView *self)
   priv->font_scale = FONT_SCALE_NORMAL;
   priv->search_direction = GTK_DIR_DOWN;
   priv->command_str = g_string_sized_new (32);
+  priv->overscroll_num_lines = DEFAULT_OVERSCROLL_NUM_LINES;
 
   priv->completion_providers_signals = egg_signal_group_new (IDE_TYPE_EXTENSION_SET_ADAPTER);
 


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