[gnome-builder/wip/file-marks] file-marks: scroll to last position in file when opening.



commit 028312e635009ae93f1cb84b9c51218445f18752
Author: Christian Hergert <christian hergert me>
Date:   Wed Oct 8 15:00:02 2014 -0700

    file-marks: scroll to last position in file when opening.

 src/editor/gb-editor-commands.c |  100 ++++++++++++++++++++++++++++++++++++--
 1 files changed, 94 insertions(+), 6 deletions(-)
---
diff --git a/src/editor/gb-editor-commands.c b/src/editor/gb-editor-commands.c
index 2370e32..7262ec1 100644
--- a/src/editor/gb-editor-commands.c
+++ b/src/editor/gb-editor-commands.c
@@ -21,6 +21,7 @@
 #include <glib/gi18n.h>
 
 #include "gb-editor-commands.h"
+#include "gb-editor-file-marks.h"
 #include "gb-editor-navigation-item.h"
 #include "gb-editor-tab.h"
 #include "gb-editor-tab-private.h"
@@ -41,6 +42,63 @@ typedef struct
   gboolean         requires_tab;
 } GbEditorCommandsEntry;
 
+static gboolean
+delayed_scroll_to_iter_cb (gpointer user_data)
+{
+  GbEditorTab *tab = user_data;
+  GtkTextIter iter;
+  guint line;
+  guint line_offset;
+
+  g_return_val_if_fail (GB_IS_EDITOR_TAB (tab), G_SOURCE_REMOVE);
+
+  line = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tab), "scroll-line"));
+  line_offset = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (tab),
+                                                    "scroll-line-offset"));
+
+  gtk_text_buffer_get_iter_at_line (GTK_TEXT_BUFFER (tab->priv->document),
+                                    &iter, line);
+
+  for (; line_offset; line_offset--)
+    {
+      if (gtk_text_iter_ends_line (&iter) ||
+          !gtk_text_iter_forward_char (&iter))
+        {
+          gtk_text_buffer_get_end_iter (GTK_TEXT_BUFFER (tab->priv->document),
+                                        &iter);
+          break;
+        }
+    }
+
+  gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (tab->priv->source_view), &iter,
+                                0.0, TRUE, 0.5, 0.5);
+
+  g_object_set_data (G_OBJECT (tab), "scroll-line", NULL);
+  g_object_set_data (G_OBJECT (tab), "scroll-line-offset", NULL);
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+delayed_scroll_to_iter (GbEditorTab       *tab,
+                        const GtkTextIter *iter)
+{
+  guint line;
+  guint line_offset;
+
+  g_return_if_fail (GB_IS_EDITOR_TAB (tab));
+
+  line = gtk_text_iter_get_line (iter);
+  line_offset = gtk_text_iter_get_line_offset (iter);
+
+  g_object_set_data (G_OBJECT (tab), "scroll-line",
+                     GINT_TO_POINTER (line));
+  g_object_set_data (G_OBJECT (tab), "scroll-line-offset",
+                     GINT_TO_POINTER (line_offset));
+
+  g_timeout_add (250, delayed_scroll_to_iter_cb, g_object_ref (tab));
+}
+
 /**
  * gb_editor_commands_reformat:
  * @tab: A #GbEditorTab.
@@ -360,9 +418,13 @@ on_load_cb (GtkSourceFileLoader *loader,
             GAsyncResult        *result,
             GbEditorTab         *tab)
 {
-  GtkTextIter begin;
-  GtkTextIter end;
+  GbEditorFileMarks *marks;
+  GbEditorFileMark *mark;
+  GtkSourceFile *source_file;
+  GtkTextBuffer *buffer;
+  GFile *file;
   GError *error = NULL;
+  GtkTextIter iter;
 
   g_return_if_fail (GTK_SOURCE_IS_FILE_LOADER (loader));
   g_return_if_fail (G_IS_ASYNC_RESULT (result));
@@ -382,10 +444,36 @@ on_load_cb (GtkSourceFileLoader *loader,
       g_clear_error (&error);
     }
 
-  gtk_text_buffer_get_bounds (GTK_TEXT_BUFFER (tab->priv->document),
-                              &begin, &end);
-  gtk_text_buffer_select_range (GTK_TEXT_BUFFER (tab->priv->document),
-                                &begin, &begin);
+  buffer = GTK_TEXT_BUFFER (tab->priv->document);
+  source_file = gtk_source_file_loader_get_file (loader);
+  file = gtk_source_file_get_location (source_file);
+  marks = gb_editor_file_marks_get_default ();
+  mark = gb_editor_file_marks_get_for_file (marks, file);
+
+  if (mark)
+    {
+      guint line;
+      guint column;
+
+      line = gb_editor_file_mark_get_line (mark);
+      column = gb_editor_file_mark_get_column (mark);
+      gtk_text_buffer_get_iter_at_line (buffer, &iter, line);
+
+      if (gtk_text_iter_get_line (&iter) == line)
+        {
+          for (; column; column--)
+            if (gtk_text_iter_ends_line (&iter) ||
+                !gtk_text_iter_forward_char (&iter))
+              break;
+        }
+    }
+  else
+    gtk_text_buffer_get_start_iter (buffer, &iter);
+
+  gtk_text_buffer_select_range (buffer, &iter, &iter);
+
+  if (gtk_widget_get_realized (GTK_WIDGET (tab->priv->source_view)))
+    delayed_scroll_to_iter (tab, &iter);
 
   gtk_source_gutter_renderer_set_visible (tab->priv->change_renderer, TRUE);
 


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