[gnome-builder] completion: add helper to remove common prefix
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] completion: add helper to remove common prefix
- Date: Sun, 14 Mar 2021 22:37:07 +0000 (UTC)
commit 4718ab52bbd8d609ada961779a4de8b5b6727860
Author: Christian Hergert <chergert redhat com>
Date: Sun Mar 14 15:36:13 2021 -0700
completion: add helper to remove common prefix
Not exactly the best implementation, but seems to do the job.
Related #1416
src/libide/sourceview/ide-completion.c | 70 ++++++++++++++++++++++++++++++++++
src/libide/sourceview/ide-completion.h | 52 +++++++++++++------------
2 files changed, 98 insertions(+), 24 deletions(-)
---
diff --git a/src/libide/sourceview/ide-completion.c b/src/libide/sourceview/ide-completion.c
index 3ecd7da6c..e69b50a3c 100644
--- a/src/libide/sourceview/ide-completion.c
+++ b/src/libide/sourceview/ide-completion.c
@@ -1790,3 +1790,73 @@ ide_completion_fuzzy_highlight (const gchar *haystack,
return g_string_free (ret, FALSE);
}
+
+static gboolean
+find_suffix_match (const GtkTextIter *limit,
+ const GtkTextIter *end,
+ GtkTextIter *found_start,
+ GtkTextIter *found_end,
+ const char *prefix,
+ gsize n_chars)
+{
+ g_autofree gchar *copy = g_malloc (n_chars * 4 + 1);
+ GtkTextIter mb, me;
+
+ g_utf8_strncpy (copy, prefix, n_chars);
+
+ g_print ("%s\n", prefix);
+
+ if (gtk_text_iter_backward_search (end, copy, GTK_TEXT_SEARCH_TEXT_ONLY, &mb, &me, limit))
+ {
+ if (gtk_text_iter_equal (&me, end))
+ {
+ *found_start = mb;
+ *found_end = me;
+ return TRUE;
+ }
+
+ g_print ("Blah\n");
+ }
+
+ return FALSE;
+}
+
+void
+ide_completion_remove_common_prefix (IdeCompletion *self,
+ GtkTextIter *begin,
+ const gchar *prefix)
+{
+ GtkTextIter rm_begin;
+ GtkTextIter rm_end;
+ GtkTextIter line_start;
+ GtkTextIter found_start, found_end;
+ gboolean found = FALSE;
+ gsize len;
+ gsize count = 1;
+
+ g_return_if_fail (IDE_IS_COMPLETION (self));
+ g_return_if_fail (self->context != NULL);
+ g_return_if_fail (begin != NULL);
+
+ if (prefix == NULL || prefix[0] == 0)
+ return;
+
+ len = g_utf8_strlen (prefix, -1);
+ line_start = *begin;
+ gtk_text_iter_set_line_offset (&line_start, 0);
+
+ while (count <= len &&
+ find_suffix_match (&line_start, begin, &found_start, &found_end, prefix, count))
+ {
+ rm_begin = found_start;
+ rm_end = found_end;
+ count++;
+ found = TRUE;
+ }
+
+ if (found)
+ {
+ gtk_text_buffer_delete (gtk_text_iter_get_buffer (begin), &rm_begin, &rm_end);
+ *begin = rm_begin;
+ }
+}
diff --git a/src/libide/sourceview/ide-completion.h b/src/libide/sourceview/ide-completion.h
index 9b31bf166..89906a534 100644
--- a/src/libide/sourceview/ide-completion.h
+++ b/src/libide/sourceview/ide-completion.h
@@ -38,44 +38,48 @@ IDE_AVAILABLE_IN_3_32
G_DECLARE_FINAL_TYPE (IdeCompletion, ide_completion, IDE, COMPLETION, GObject)
IDE_AVAILABLE_IN_3_32
-IdeCompletionDisplay *ide_completion_get_display (IdeCompletion *self);
+IdeCompletionDisplay *ide_completion_get_display (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-GtkSourceView *ide_completion_get_view (IdeCompletion *self);
+GtkSourceView *ide_completion_get_view (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-GtkTextBuffer *ide_completion_get_buffer (IdeCompletion *self);
+GtkTextBuffer *ide_completion_get_buffer (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_block_interactive (IdeCompletion *self);
+void ide_completion_block_interactive (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_unblock_interactive (IdeCompletion *self);
+void ide_completion_unblock_interactive (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_add_provider (IdeCompletion *self,
- IdeCompletionProvider *provider);
+void ide_completion_add_provider (IdeCompletion *self,
+ IdeCompletionProvider *provider);
IDE_AVAILABLE_IN_3_32
-void ide_completion_remove_provider (IdeCompletion *self,
- IdeCompletionProvider *provider);
+void ide_completion_remove_provider (IdeCompletion *self,
+ IdeCompletionProvider *provider);
IDE_AVAILABLE_IN_3_32
-guint ide_completion_get_n_rows (IdeCompletion *self);
+guint ide_completion_get_n_rows (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_set_n_rows (IdeCompletion *self,
- guint n_rows);
+void ide_completion_set_n_rows (IdeCompletion *self,
+ guint n_rows);
IDE_AVAILABLE_IN_3_32
-void ide_completion_hide (IdeCompletion *self);
+void ide_completion_hide (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_show (IdeCompletion *self);
+void ide_completion_show (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_cancel (IdeCompletion *self);
+void ide_completion_cancel (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-gboolean ide_completion_is_visible (IdeCompletion *self);
+gboolean ide_completion_is_visible (IdeCompletion *self);
IDE_AVAILABLE_IN_3_32
-void ide_completion_move_cursor (IdeCompletion *self,
- GtkMovementStep step,
- gint direction);
+void ide_completion_move_cursor (IdeCompletion *self,
+ GtkMovementStep step,
+ gint direction);
IDE_AVAILABLE_IN_3_32
-gboolean ide_completion_fuzzy_match (const gchar *haystack,
- const gchar *casefold_needle,
- guint *priority);
+gboolean ide_completion_fuzzy_match (const gchar *haystack,
+ const gchar *casefold_needle,
+ guint *priority);
IDE_AVAILABLE_IN_3_32
-gchar *ide_completion_fuzzy_highlight (const gchar *haystack,
- const gchar *casefold_query);
+gchar *ide_completion_fuzzy_highlight (const gchar *haystack,
+ const gchar *casefold_query);
+IDE_AVAILABLE_IN_3_40
+void ide_completion_remove_common_prefix (IdeCompletion *self,
+ GtkTextIter *begin,
+ const gchar *prefix);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]