[gnome-builder] source-view: add a select-inner signal



commit aa22a50e957bb35a52ba5d8ab65740c79a66d2c5
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Thu Oct 22 23:42:33 2015 +0200

    source-view: add a select-inner signal
    
    we need this to define some textobject bindings in vim css.
    This signal trigger the ide_source_view_select_inner function

 libide/ide-source-view-movements.c |   36 ++++++++++++++++++++++++++++++++++
 libide/ide-source-view-movements.h |    6 +++++
 libide/ide-source-view.c           |   38 ++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 0 deletions(-)
---
diff --git a/libide/ide-source-view-movements.c b/libide/ide-source-view-movements.c
index c212aee..9c948ef 100644
--- a/libide/ide-source-view-movements.c
+++ b/libide/ide-source-view-movements.c
@@ -786,6 +786,7 @@ bracket_predicate (gunichar ch,
     state->depth += (state->direction == GTK_DIR_RIGHT) ? -1 : 1;
 
   return (state->depth == 0);
+
 }
 
 /* find the matching char position in 'depth' outer levels */
@@ -1631,3 +1632,38 @@ _ide_source_view_apply_movement (IdeSourceView         *self,
   if (!mv.ignore_scroll_to_insert)
     ide_source_view_scroll_mark_onscreen (self, insert, TRUE, 0.5, 0.5);
 }
+
+void
+_ide_source_view_select_inner (IdeSourceView *self,
+                               gunichar       inner_left,
+                               gunichar       inner_right,
+                               guint          count,
+                               gboolean       exclusive)
+{
+  GtkTextBuffer *buffer;
+  GtkTextMark *insert;
+  GtkTextIter start;
+  GtkTextIter end;
+
+  g_return_if_fail (IDE_IS_SOURCE_VIEW (self));
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (self));
+  insert = gtk_text_buffer_get_insert (buffer);
+  gtk_text_buffer_get_iter_at_mark (buffer, &start, insert);
+
+  count = MAX (1, count);
+
+  if (match_char_with_depth (&start, inner_left, inner_right, GTK_DIR_LEFT, count, !exclusive))
+    {
+      end = start;
+      if (exclusive)
+        gtk_text_iter_backward_char (&end);
+
+      if (match_char_with_depth (&end, inner_left, inner_right, GTK_DIR_RIGHT, 1, exclusive))
+        {
+          gtk_text_buffer_select_range (buffer, &start, &end);
+          gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW (self), insert);
+        }
+
+    }
+}
diff --git a/libide/ide-source-view-movements.h b/libide/ide-source-view-movements.h
index c80235e..72a7dc4 100644
--- a/libide/ide-source-view-movements.h
+++ b/libide/ide-source-view-movements.h
@@ -33,6 +33,12 @@ void _ide_source_view_apply_movement (IdeSourceView         *source_view,
                                       gunichar               search_char,
                                       gint                  *target_offset);
 
+void _ide_source_view_select_inner   (IdeSourceView *self,
+                                      gunichar       inner_left,
+                                      gunichar       inner_right,
+                                      guint          count,
+                                      gboolean       exclusive);
+
 G_END_DECLS
 
 #endif /* IDE_SOURCE_VIEW_HELPER_H */
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index 680e69c..ae52b62 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -120,6 +120,8 @@ typedef struct
   gunichar                     modifier;
   gunichar                     search_char;
   guint                        count;
+  gunichar                     inner_left;
+  gunichar                     inner_right;
 
   guint                        delayed_scroll_replay;
 
@@ -247,6 +249,7 @@ enum {
   SAVE_COMMAND,
   SAVE_INSERT_MARK,
   SAVE_SEARCH_CHAR,
+  SELECT_INNER,
   SELECTION_THEATRIC,
   SET_MODE,
   SET_OVERWRITE,
@@ -3444,6 +3447,28 @@ ide_source_view_real_save_search_char (IdeSourceView *self)
 }
 
 static void
+ide_source_view_real_select_inner (IdeSourceView *self,
+                                   const gchar   *inner_left,
+                                   const gchar   *inner_right,
+                                   gboolean       exclusive)
+{
+  IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
+  gunichar unichar_inner_left;
+  gunichar unichar_inner_right;
+
+  g_assert (IDE_IS_SOURCE_VIEW (self));
+
+  unichar_inner_left = g_utf8_get_char (inner_left);
+  unichar_inner_right = g_utf8_get_char (inner_right);
+
+  _ide_source_view_select_inner (self,
+                                 unichar_inner_left,
+                                 unichar_inner_right,
+                                 priv->count,
+                                 exclusive);
+}
+
+static void
 ide_source_view__completion_hide_cb (IdeSourceView       *self,
                                      GtkSourceCompletion *completion)
 {
@@ -5359,6 +5384,7 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
   klass->save_command = ide_source_view_real_save_command;
   klass->save_insert_mark = ide_source_view_real_save_insert_mark;
   klass->save_search_char = ide_source_view_real_save_search_char;
+  klass->select_inner = ide_source_view_real_select_inner;
   klass->selection_theatric = ide_source_view_real_selection_theatric;
   klass->set_mode = ide_source_view_real_set_mode;
   klass->set_overwrite = ide_source_view_real_set_overwrite;
@@ -6005,6 +6031,18 @@ ide_source_view_class_init (IdeSourceViewClass *klass)
                   G_TYPE_NONE,
                   0);
 
+  signals [SELECT_INNER] =
+    g_signal_new ("select-inner",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                  G_STRUCT_OFFSET (IdeSourceViewClass, select_inner),
+                  NULL, NULL, NULL,
+                  G_TYPE_NONE,
+                  3,
+                  G_TYPE_STRING,
+                  G_TYPE_STRING,
+                  G_TYPE_BOOLEAN);
+
   signals [SELECTION_THEATRIC] =
     g_signal_new ("selection-theatric",
                   G_TYPE_FROM_CLASS (klass),


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