[gnome-builder] BackForwardItem: Use GtkTextMark to track locations



commit b18999814f997559af18e770a82aae3e8538a479
Author: Umang Jain <mailumangjain gmail com>
Date:   Sat Apr 15 10:38:12 2017 +0530

    BackForwardItem: Use GtkTextMark to track locations
    
    https://bugzilla.gnome.org/show_bug.cgi?id=749041

 libide/history/ide-back-forward-item.c      |   48 +++++++++++++++++++++++++-
 libide/history/ide-back-forward-item.h      |    6 +++-
 libide/history/ide-back-forward-list-load.c |    2 +-
 libide/sourceview/ide-source-view.c         |    6 +++-
 4 files changed, 57 insertions(+), 5 deletions(-)
---
diff --git a/libide/history/ide-back-forward-item.c b/libide/history/ide-back-forward-item.c
index 8caff28..8690150 100644
--- a/libide/history/ide-back-forward-item.c
+++ b/libide/history/ide-back-forward-item.c
@@ -23,6 +23,7 @@
 #include "diagnostics/ide-source-location.h"
 #include "files/ide-file.h"
 #include "history/ide-back-forward-item.h"
+#include "ide-macros.h"
 
 #define NUM_LINES_CHAIN_MAX 5
 
@@ -30,6 +31,7 @@ struct _IdeBackForwardItem
 {
   IdeObject  parent_instance;
   IdeUri    *uri;
+  GtkTextMark *mark;
 };
 
 G_DEFINE_TYPE (IdeBackForwardItem, ide_back_forward_item, IDE_TYPE_OBJECT)
@@ -37,18 +39,21 @@ G_DEFINE_TYPE (IdeBackForwardItem, ide_back_forward_item, IDE_TYPE_OBJECT)
 enum {
   PROP_0,
   PROP_URI,
+  PROP_MARK,
   LAST_PROP
 };
 
 static GParamSpec *properties [LAST_PROP];
 
 IdeBackForwardItem *
-ide_back_forward_item_new (IdeContext *context,
-                           IdeUri     *uri)
+ide_back_forward_item_new (IdeContext  *context,
+                          IdeUri      *uri,
+                          GtkTextMark *mark)
 {
   return g_object_new (IDE_TYPE_BACK_FORWARD_ITEM,
                        "context", context,
                        "uri", uri,
+                      "mark", mark,
                        NULL);
 }
 
@@ -76,11 +81,32 @@ ide_back_forward_item_set_uri (IdeBackForwardItem *self,
 }
 
 static void
+ide_back_forward_item_set_mark (IdeBackForwardItem *self,
+                                GtkTextMark        *mark)
+{
+  g_return_if_fail (IDE_IS_BACK_FORWARD_ITEM (self));
+
+  /* Mark can be NULL as in the case of loading on startup */
+  if (ide_set_weak_pointer (&self->mark, mark))
+    g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MARK]);
+}
+
+GtkTextMark *
+ide_back_forward_item_get_mark (IdeBackForwardItem *self)
+{
+  g_return_val_if_fail (IDE_IS_BACK_FORWARD_ITEM (self), NULL);
+
+  return self->mark;
+}
+
+
+static void
 ide_back_forward_item_finalize (GObject *object)
 {
   IdeBackForwardItem *self = (IdeBackForwardItem *)object;
 
   g_clear_pointer (&self->uri, ide_uri_unref);
+  ide_clear_weak_pointer (&self->mark);
 
   G_OBJECT_CLASS (ide_back_forward_item_parent_class)->finalize (object);
 }
@@ -99,6 +125,10 @@ ide_back_forward_item_get_property (GObject    *object,
       g_value_set_boxed (value, ide_back_forward_item_get_uri (self));
       break;
 
+    case PROP_MARK:
+      g_value_set_object (value, ide_back_forward_item_get_mark (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -118,6 +148,10 @@ ide_back_forward_item_set_property (GObject      *object,
       ide_back_forward_item_set_uri (self, g_value_get_boxed (value));
       break;
 
+    case PROP_MARK:
+      ide_back_forward_item_set_mark (self, g_value_get_object (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -152,6 +186,16 @@ ide_back_forward_item_class_init (IdeBackForwardItemClass *klass)
                          G_PARAM_CONSTRUCT_ONLY |
                          G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_MARK] =
+  g_param_spec_object ("mark",
+                       "Mark",
+                       "The GtkTextMark for the location",
+                       GTK_TYPE_TEXT_MARK,
+                       (G_PARAM_READWRITE |
+                        G_PARAM_CONSTRUCT |
+                       G_PARAM_STATIC_STRINGS |
+                       G_PARAM_EXPLICIT_NOTIFY));
+
   g_object_class_install_properties (object_class, LAST_PROP, properties);
 }
 
diff --git a/libide/history/ide-back-forward-item.h b/libide/history/ide-back-forward-item.h
index 20b514d..9c67f9a 100644
--- a/libide/history/ide-back-forward-item.h
+++ b/libide/history/ide-back-forward-item.h
@@ -19,6 +19,8 @@
 #ifndef IDE_BACK_FORWARD_ITEM_H
 #define IDE_BACK_FORWARD_ITEM_H
 
+#include <gtk/gtk.h>
+
 #include "ide-object.h"
 
 #include "util/ide-uri.h"
@@ -30,7 +32,9 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (IdeBackForwardItem, ide_back_forward_item, IDE, BACK_FORWARD_ITEM, IdeObject)
 
 IdeBackForwardItem *ide_back_forward_item_new     (IdeContext         *context,
-                                                   IdeUri             *uri);
+                                                   IdeUri             *uri,
+                                                  GtkTextMark        *mark);
+GtkTextMark        *ide_back_forward_item_get_mark (IdeBackForwardItem *self);
 IdeUri             *ide_back_forward_item_get_uri (IdeBackForwardItem *self);
 gboolean            ide_back_forward_item_chain   (IdeBackForwardItem *self,
                                                    IdeBackForwardItem *other);
diff --git a/libide/history/ide-back-forward-list-load.c b/libide/history/ide-back-forward-list-load.c
index c931c1f..7effcc1 100644
--- a/libide/history/ide-back-forward-list-load.c
+++ b/libide/history/ide-back-forward-list-load.c
@@ -108,7 +108,7 @@ ide_back_forward_list_load_cb (GObject      *object,
           return;
         }
 
-      item = ide_back_forward_item_new (context, uri);
+      item = ide_back_forward_item_new (context, uri, NULL);
       ide_back_forward_list_push (self, item);
     }
 
diff --git a/libide/sourceview/ide-source-view.c b/libide/sourceview/ide-source-view.c
index e6b45f6..b5d7c5b 100644
--- a/libide/sourceview/ide-source-view.c
+++ b/libide/sourceview/ide-source-view.c
@@ -3322,6 +3322,8 @@ ide_source_view_real_jump (IdeSourceView     *self,
   IdeContext *context;
   IdeFile *file;
   IdeUri *uri;
+  GtkTextMark *mark;
+  GtkTextBuffer *buffer;
   gchar *fragment;
   guint line;
   guint line_offset;
@@ -3353,7 +3355,9 @@ ide_source_view_real_jump (IdeSourceView     *self,
   uri = ide_uri_new_from_file (ide_file_get_file (file));
   fragment = g_strdup_printf ("L%u_%u", line + 1, line_offset + 1);
   ide_uri_set_fragment (uri, fragment);
-  item = ide_back_forward_item_new (context, uri);
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self));
+  mark = gtk_text_buffer_create_mark (buffer, NULL, location, FALSE);
+  item = ide_back_forward_item_new (context, uri, mark);
   ide_back_forward_list_push (priv->back_forward_list, item);
 
   g_object_unref (item);


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