[gtksourceview/wip/chergert/gsv-gtk4] snippets: implement refilter for completion results



commit deabd14e887ecf1cec99ef1c9b2714f795c35dbf
Author: Christian Hergert <chergert redhat com>
Date:   Sat Sep 12 20:53:54 2020 -0700

    snippets: implement refilter for completion results

 .../snippets/gtksourcecompletionsnippets.c         | 44 +++++++++++++++++++++-
 .../snippets/gtksourcecompletionsnippetsproposal.c | 15 ++++++++
 2 files changed, 57 insertions(+), 2 deletions(-)
---
diff --git a/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippets.c 
b/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippets.c
index abaf7227..a1356f82 100644
--- a/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippets.c
+++ b/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippets.c
@@ -32,8 +32,6 @@
 #include <gtksourceview/gtksourcesnippetmanager.h>
 #include <gtksourceview/gtksourceview.h>
 
-#include <gtksourceview/completion-providers/words/gtksourcecompletionwordsutils-private.h>
-
 #include "gtksourcecompletionsnippets.h"
 #include "gtksourcecompletionsnippetsproposal-private.h"
 
@@ -297,6 +295,47 @@ gtk_source_completion_snippets_display (GtkSourceCompletionProvider *provider,
        }
 }
 
+static void
+gtk_source_completion_snippets_refilter (GtkSourceCompletionProvider *provider,
+                                         GtkSourceCompletionContext  *context,
+                                         GListModel                  *model)
+{
+       GtkFilterListModel *filter_model;
+       GtkExpression *expression;
+       GtkStringFilter *filter;
+       gchar *word;
+
+       g_assert (GTK_SOURCE_IS_COMPLETION_PROVIDER (provider));
+       g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
+       g_assert (G_IS_LIST_MODEL (model));
+
+       word = gtk_source_completion_context_get_word (context);
+
+       if (GTK_IS_FILTER_LIST_MODEL (model))
+       {
+               model = gtk_filter_list_model_get_model (GTK_FILTER_LIST_MODEL (model));
+       }
+
+       if (!word || !word[0])
+       {
+               gtk_source_completion_context_set_proposals_for_provider (context, provider, model);
+               g_free (word);
+               return;
+       }
+
+       expression = gtk_property_expression_new (GTK_SOURCE_TYPE_COMPLETION_SNIPPETS_PROPOSAL, NULL, 
"trigger");
+       filter = gtk_string_filter_new (g_steal_pointer (&expression));
+       gtk_string_filter_set_search (GTK_STRING_FILTER (filter), word);
+       filter_model = gtk_filter_list_model_new (g_object_ref (model),
+                                                 GTK_FILTER (g_steal_pointer (&filter)));
+       gtk_filter_list_model_set_incremental (filter_model, TRUE);
+       gtk_source_completion_context_set_proposals_for_provider (context, provider, G_LIST_MODEL 
(filter_model));
+
+       g_clear_object (&filter_model);
+       g_free (word);
+}
+
+
 static void
 completion_provider_iface_init (GtkSourceCompletionProviderInterface *iface)
 {
@@ -305,6 +344,7 @@ completion_provider_iface_init (GtkSourceCompletionProviderInterface *iface)
        iface->populate = gtk_source_completion_snippets_populate;
        iface->activate = gtk_source_completion_snippets_activate;
        iface->display = gtk_source_completion_snippets_display;
+       iface->refilter = gtk_source_completion_snippets_refilter;
 }
 
 static void
diff --git a/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippetsproposal.c 
b/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippetsproposal.c
index a8469f8a..1bf69bbd 100644
--- a/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippetsproposal.c
+++ b/gtksourceview/completion-providers/snippets/gtksourcecompletionsnippetsproposal.c
@@ -37,6 +37,7 @@ G_DEFINE_TYPE_WITH_CODE (GtkSourceCompletionSnippetsProposal,
 enum {
        PROP_0,
        PROP_SNIPPET,
+       PROP_TRIGGER,
        N_PROPS
 };
 
@@ -66,6 +67,13 @@ gtk_source_completion_snippets_proposal_get_property (GObject    *object,
                g_value_set_object (value, self->snippet);
                break;
 
+       case PROP_TRIGGER:
+               if (self->snippet != NULL)
+               {
+                       g_value_set_string (value, gtk_source_snippet_get_trigger (self->snippet));
+               }
+               break;
+
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                break;
@@ -110,6 +118,13 @@ gtk_source_completion_snippets_proposal_class_init (GtkSourceCompletionSnippetsP
                                      G_PARAM_CONSTRUCT_ONLY |
                                      G_PARAM_STATIC_STRINGS));
 
+       properties [PROP_TRIGGER] =
+               g_param_spec_string ("trigger",
+                                    "Trigger",
+                                    "The trigger for the snippet",
+                                    NULL,
+                                    (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
        g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 


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