[gnome-builder] code: add API to request all views scroll to iter



commit 26fbc408fd3eaeb241224fa2506a6b269f6905b0
Author: Christian Hergert <chergert redhat com>
Date:   Tue Mar 5 16:33:00 2019 -0800

    code: add API to request all views scroll to iter
    
    This can be useful when loading a buffer, to ensure that all
    the views jump to the insertion point after load.

 src/libide/code/ide-buffer-private.h    | 63 +++++++++++++++++----------------
 src/libide/code/ide-buffer.c            | 31 ++++++++++++++++
 src/libide/sourceview/ide-source-view.c | 19 ++++++++++
 3 files changed, 82 insertions(+), 31 deletions(-)
---
diff --git a/src/libide/code/ide-buffer-private.h b/src/libide/code/ide-buffer-private.h
index 836fda7d7..56e969916 100644
--- a/src/libide/code/ide-buffer-private.h
+++ b/src/libide/code/ide-buffer-private.h
@@ -29,36 +29,37 @@
 
 G_BEGIN_DECLS
 
-void                    _ide_buffer_manager_buffer_loaded (IdeBufferManager     *self,
-                                                           IdeBuffer            *buffer);
-void                    _ide_buffer_manager_buffer_saved  (IdeBufferManager     *self,
-                                                           IdeBuffer            *buffer);
-void                    _ide_buffer_cancel_cursor_restore (IdeBuffer            *self);
-gboolean                _ide_buffer_can_restore_cursor    (IdeBuffer            *self);
-IdeExtensionSetAdapter *_ide_buffer_get_addins            (IdeBuffer            *self);
-IdeBuffer              *_ide_buffer_new                   (IdeBufferManager     *self,
-                                                           GFile                *file,
-                                                           gboolean              is_temporary);
-void                    _ide_buffer_attach                (IdeBuffer            *self,
-                                                           IdeObject            *parent);
-void                    _ide_buffer_load_file_async       (IdeBuffer            *self,
-                                                           GCancellable         *cancellable,
-                                                           IdeNotification     **notif,
-                                                           GAsyncReadyCallback   callback,
-                                                           gpointer              user_data);
-gboolean                _ide_buffer_load_file_finish      (IdeBuffer            *self,
-                                                           GAsyncResult         *result,
-                                                           GError              **error);
-void                    _ide_buffer_line_flags_changed    (IdeBuffer            *self);
-void                    _ide_buffer_set_changed_on_volume (IdeBuffer            *self,
-                                                           gboolean              changed_on_volume);
-void                    _ide_buffer_set_read_only         (IdeBuffer            *self,
-                                                           gboolean              read_only);
-IdeHighlightEngine     *_ide_buffer_get_highlight_engine  (IdeBuffer            *self);
-void                    _ide_buffer_set_failure           (IdeBuffer            *self,
-                                                           const GError         *error);
-void                    _ide_buffer_sync_to_unsaved_files (IdeBuffer            *self);
-void                    _ide_buffer_set_file              (IdeBuffer            *self,
-                                                           GFile                *file);
+void                    _ide_buffer_manager_buffer_loaded    (IdeBufferManager     *self,
+                                                              IdeBuffer            *buffer);
+void                    _ide_buffer_manager_buffer_saved     (IdeBufferManager     *self,
+                                                              IdeBuffer            *buffer);
+void                    _ide_buffer_cancel_cursor_restore    (IdeBuffer            *self);
+gboolean                _ide_buffer_can_restore_cursor       (IdeBuffer            *self);
+IdeExtensionSetAdapter *_ide_buffer_get_addins               (IdeBuffer            *self);
+IdeBuffer              *_ide_buffer_new                      (IdeBufferManager     *self,
+                                                              GFile                *file,
+                                                              gboolean              is_temporary);
+void                    _ide_buffer_attach                   (IdeBuffer            *self,
+                                                              IdeObject            *parent);
+void                    _ide_buffer_load_file_async          (IdeBuffer            *self,
+                                                              GCancellable         *cancellable,
+                                                              IdeNotification     **notif,
+                                                              GAsyncReadyCallback   callback,
+                                                              gpointer              user_data);
+gboolean                _ide_buffer_load_file_finish         (IdeBuffer            *self,
+                                                              GAsyncResult         *result,
+                                                              GError              **error);
+void                    _ide_buffer_line_flags_changed       (IdeBuffer            *self);
+void                    _ide_buffer_set_changed_on_volume    (IdeBuffer            *self,
+                                                              gboolean              changed_on_volume);
+void                    _ide_buffer_set_read_only            (IdeBuffer            *self,
+                                                              gboolean              read_only);
+IdeHighlightEngine     *_ide_buffer_get_highlight_engine     (IdeBuffer            *self);
+void                    _ide_buffer_set_failure              (IdeBuffer            *self,
+                                                              const GError         *error);
+void                    _ide_buffer_sync_to_unsaved_files    (IdeBuffer            *self);
+void                    _ide_buffer_set_file                 (IdeBuffer            *self,
+                                                              GFile                *file);
+void                    _ide_buffer_request_scroll_to_cursor (IdeBuffer            *self);
 
 G_END_DECLS
diff --git a/src/libide/code/ide-buffer.c b/src/libide/code/ide-buffer.c
index cf511df58..3d0e60489 100644
--- a/src/libide/code/ide-buffer.c
+++ b/src/libide/code/ide-buffer.c
@@ -144,6 +144,7 @@ enum {
   CURSOR_MOVED,
   LINE_FLAGS_CHANGED,
   LOADED,
+  REQUEST_SCROLL_TO_INSERT,
   N_SIGNALS
 };
 
@@ -903,6 +904,27 @@ ide_buffer_class_init (IdeBufferClass *klass)
   g_signal_set_va_marshaller (signals [LOADED],
                               G_TYPE_FROM_CLASS (klass),
                               g_cclosure_marshal_VOID__VOIDv);
+
+  /**
+   * IdeBuffer::request-scroll-to-insert:
+   *
+   * Requests that attached views scroll to insert location.
+   *
+   * This is generally only used when loading a buffer.
+   *
+   * Since: 3.32
+   */
+  signals [REQUEST_SCROLL_TO_INSERT] =
+    g_signal_new_class_handler ("request-scroll-to-insert",
+                                G_TYPE_FROM_CLASS (klass),
+                                G_SIGNAL_RUN_LAST,
+                                NULL,
+                                NULL, NULL,
+                                g_cclosure_marshal_VOID__VOID,
+                                G_TYPE_NONE, 0);
+  g_signal_set_va_marshaller (signals [REQUEST_SCROLL_TO_INSERT],
+                              G_TYPE_FROM_CLASS (klass),
+                              g_cclosure_marshal_VOID__VOIDv);
 }
 
 static void
@@ -3771,3 +3793,12 @@ settle_finish (IdeBuffer     *self,
 
   IDE_RETURN (ret);
 }
+
+void
+_ide_buffer_request_scroll_to_cursor (IdeBuffer *self)
+{
+  g_return_if_fail (IDE_IS_MAIN_THREAD ());
+  g_return_if_fail (IDE_IS_BUFFER (self));
+
+  g_signal_emit (self, signals [REQUEST_SCROLL_TO_INSERT], 0);
+}
diff --git a/src/libide/sourceview/ide-source-view.c b/src/libide/sourceview/ide-source-view.c
index 6c5ad3e94..4dbdbe8e7 100644
--- a/src/libide/sourceview/ide-source-view.c
+++ b/src/libide/sourceview/ide-source-view.c
@@ -836,6 +836,20 @@ ide_source_view__buffer_notify_style_scheme_cb (IdeSourceView *self,
     }
 }
 
+static void
+ide_source_view__buffer_request_scroll_to_insert_cb (IdeSourceView *self,
+                                                     IdeBuffer     *buffer)
+{
+  GtkTextMark *mark;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (IDE_IS_SOURCE_VIEW (self));
+  g_assert (IDE_IS_BUFFER (buffer));
+
+  mark = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (buffer));
+  gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (self), mark);
+}
+
 static void
 ide_source_view__buffer_changed_cb (IdeSourceView *self,
                                     IdeBuffer     *buffer)
@@ -6520,6 +6534,11 @@ ide_source_view_init (IdeSourceView *self)
                                    G_CALLBACK (ide_source_view__buffer_changed_cb),
                                    self,
                                    G_CONNECT_SWAPPED);
+  dzl_signal_group_connect_object (priv->buffer_signals,
+                                   "request-scroll-to-insert",
+                                   G_CALLBACK (ide_source_view__buffer_request_scroll_to_insert_cb),
+                                   self,
+                                   G_CONNECT_SWAPPED);
   dzl_signal_group_connect_object (priv->buffer_signals,
                                    "line-flags-changed",
                                    G_CALLBACK (ide_source_view__buffer_line_flags_changed_cb),


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