[gnome-builder] plugins/c-pack: port completion provider to GTK 4



commit 2b762c4363b0f616edd9db0e4a7b9a9c8a470540
Author: Christian Hergert <chergert redhat com>
Date:   Mon Jul 11 22:15:44 2022 -0700

    plugins/c-pack: port completion provider to GTK 4
    
    This doesn't port everything as we still need indenter porting to GSV.

 src/plugins/c-pack/c-pack-plugin.c             |   9 +-
 src/plugins/c-pack/c-pack.gresource.xml        |   1 +
 src/plugins/c-pack/c-pack.plugin               |   1 -
 src/plugins/c-pack/cpack-completion-item.c     |  42 ++++++++-
 src/plugins/c-pack/cpack-completion-item.h     |   5 +-
 src/plugins/c-pack/cpack-completion-provider.c | 114 +++++++++++++++----------
 src/plugins/c-pack/cpack-completion-results.c  |   2 +-
 src/plugins/c-pack/cpack-editor-page-addin.c   |   3 -
 src/plugins/c-pack/gtk/keybindings.json        |   1 +
 src/plugins/c-pack/meson.build                 |   4 +-
 10 files changed, 125 insertions(+), 57 deletions(-)
---
diff --git a/src/plugins/c-pack/c-pack-plugin.c b/src/plugins/c-pack/c-pack-plugin.c
index 82bd8b2d2..a0e03e4b2 100644
--- a/src/plugins/c-pack/c-pack-plugin.c
+++ b/src/plugins/c-pack/c-pack-plugin.c
@@ -20,24 +20,29 @@
 
 #define G_LOG_DOMAIN "c-pack-plugin"
 
+#include <libpeas/peas.h>
+
 #include <libide-editor.h>
 #include <libide-sourceview.h>
-#include <libpeas/peas.h>
 
+#if 0
 #include "ide-c-indenter.h"
+#endif
 #include "cpack-completion-provider.h"
 #include "cpack-editor-page-addin.h"
 
 _IDE_EXTERN void
 _ide_c_pack_register_types (PeasObjectModule *module)
 {
+#if 0
   peas_object_module_register_extension_type (module,
                                               IDE_TYPE_INDENTER,
                                               IDE_TYPE_C_INDENTER);
+#endif
   peas_object_module_register_extension_type (module,
                                               IDE_TYPE_EDITOR_PAGE_ADDIN,
                                               CPACK_TYPE_EDITOR_PAGE_ADDIN);
   peas_object_module_register_extension_type (module,
-                                              IDE_TYPE_COMPLETION_PROVIDER,
+                                              GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
                                               CPACK_TYPE_COMPLETION_PROVIDER);
 }
diff --git a/src/plugins/c-pack/c-pack.gresource.xml b/src/plugins/c-pack/c-pack.gresource.xml
index 9cda0e405..cc5b10ebd 100644
--- a/src/plugins/c-pack/c-pack.gresource.xml
+++ b/src/plugins/c-pack/c-pack.gresource.xml
@@ -2,5 +2,6 @@
 <gresources>
   <gresource prefix="/plugins/c-pack">
     <file>c-pack.plugin</file>
+    <file>gtk/keybindings.json</file>
   </gresource>
 </gresources>
diff --git a/src/plugins/c-pack/c-pack.plugin b/src/plugins/c-pack/c-pack.plugin
index c99764211..89c4f22ef 100644
--- a/src/plugins/c-pack/c-pack.plugin
+++ b/src/plugins/c-pack/c-pack.plugin
@@ -2,7 +2,6 @@
 Authors=Christian Hergert <christian hergert me>
 Builtin=true
 Copyright=Copyright © 2015-2018 Christian Hergert
-Depends=editor;
 Description=Provides language support for the C programming language.
 Embedded=_ide_c_pack_register_types
 Module=c-pack
diff --git a/src/plugins/c-pack/cpack-completion-item.c b/src/plugins/c-pack/cpack-completion-item.c
index 177050110..f354b3b0b 100644
--- a/src/plugins/c-pack/cpack-completion-item.c
+++ b/src/plugins/c-pack/cpack-completion-item.c
@@ -27,7 +27,7 @@
 #include "cpack-completion-item.h"
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (CpackCompletionItem, cpack_completion_item, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL, NULL))
+                               G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROPOSAL, NULL))
 
 static void
 cpack_completion_item_finalize (GObject *object)
@@ -62,3 +62,43 @@ cpack_completion_item_new (const gchar *word)
 
   return self;
 }
+
+void
+cpack_completion_item_display (CpackCompletionItem     *self,
+                               GtkSourceCompletionCell *cell,
+                               const char              *typed_text)
+{
+  GtkSourceCompletionColumn column;
+
+  g_return_if_fail (CPACK_IS_COMPLETION_ITEM (self));
+  g_return_if_fail (GTK_SOURCE_IS_COMPLETION_CELL (cell));
+
+  column = gtk_source_completion_cell_get_column (cell);
+
+  switch (column)
+    {
+    case GTK_SOURCE_COMPLETION_COLUMN_ICON:
+      gtk_source_completion_cell_set_icon_name (cell, "lang-include-symbolic");
+      break;
+
+    case GTK_SOURCE_COMPLETION_COLUMN_TYPED_TEXT:
+      {
+        PangoAttrList *attrs;
+
+        attrs = gtk_source_completion_fuzzy_highlight (self->name, typed_text);
+        gtk_source_completion_cell_set_text_with_attributes (cell, self->name, attrs);
+        pango_attr_list_unref (attrs);
+
+        break;
+      }
+
+    case GTK_SOURCE_COMPLETION_COLUMN_COMMENT:
+    case GTK_SOURCE_COMPLETION_COLUMN_DETAILS:
+    case GTK_SOURCE_COMPLETION_COLUMN_BEFORE:
+    case GTK_SOURCE_COMPLETION_COLUMN_AFTER:
+    default:
+      gtk_source_completion_cell_set_text (cell, NULL);
+      break;
+    }
+
+}
diff --git a/src/plugins/c-pack/cpack-completion-item.h b/src/plugins/c-pack/cpack-completion-item.h
index 6252b9558..bd649f696 100644
--- a/src/plugins/c-pack/cpack-completion-item.h
+++ b/src/plugins/c-pack/cpack-completion-item.h
@@ -34,6 +34,9 @@ struct _CpackCompletionItem
   gchar  *name;
 };
 
-CpackCompletionItem *cpack_completion_item_new (const gchar *word);
+CpackCompletionItem *cpack_completion_item_new     (const gchar             *word);
+void                 cpack_completion_item_display (CpackCompletionItem     *self,
+                                                    GtkSourceCompletionCell *cell,
+                                                    const char              *typed_text);
 
 G_END_DECLS
diff --git a/src/plugins/c-pack/cpack-completion-provider.c b/src/plugins/c-pack/cpack-completion-provider.c
index d0d29adb3..e53f1238b 100644
--- a/src/plugins/c-pack/cpack-completion-provider.c
+++ b/src/plugins/c-pack/cpack-completion-provider.c
@@ -32,16 +32,32 @@
 struct _CpackCompletionProvider
 {
   IdeObject parent_instance;
+  char *word;
+  char *refilter_word;
 };
 
-static void provider_iface_init (IdeCompletionProviderInterface *iface);
+static void provider_iface_init (GtkSourceCompletionProviderInterface *iface);
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (CpackCompletionProvider, cpack_completion_provider, IDE_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROVIDER, provider_iface_init))
+                               G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROVIDER, 
provider_iface_init))
+
+static void
+cpack_completion_provider_dispose (GObject *object)
+{
+  CpackCompletionProvider *self = (CpackCompletionProvider *)object;
+
+  g_clear_pointer (&self->word, g_free);
+  g_clear_pointer (&self->refilter_word, g_free);
+
+  G_OBJECT_CLASS (cpack_completion_provider_parent_class)->dispose (object);
+}
 
 static void
 cpack_completion_provider_class_init (CpackCompletionProviderClass *klass)
 {
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->dispose = cpack_completion_provider_dispose;
 }
 
 static void
@@ -108,12 +124,13 @@ cpack_completion_provider_get_build_flags_cb (GObject      *object,
 }
 
 static void
-cpack_completion_provider_populate_async (IdeCompletionProvider *provider,
-                                          IdeCompletionContext  *context,
-                                          GCancellable          *cancellable,
-                                          GAsyncReadyCallback    callback,
-                                          gpointer               user_data)
+cpack_completion_provider_populate_async (GtkSourceCompletionProvider *provider,
+                                          GtkSourceCompletionContext  *context,
+                                          GCancellable                *cancellable,
+                                          GAsyncReadyCallback          callback,
+                                          gpointer                     user_data)
 {
+  CpackCompletionProvider *self = (CpackCompletionProvider *)provider;
   g_autoptr(IdeTask) task = NULL;
   g_autofree gchar *prefix = NULL;
   GtkTextIter begin, end;
@@ -123,15 +140,17 @@ cpack_completion_provider_populate_async (IdeCompletionProvider *provider,
   GFile *file = NULL;
 
   g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
 
   task = ide_task_new (provider, cancellable, callback, user_data);
   ide_task_set_source_tag (task, cpack_completion_provider_populate_async);
 
-  ide_completion_context_get_bounds (context, &begin, &end);
+  g_clear_pointer (&self->word, g_free);
 
-  buffer = ide_completion_context_get_buffer (context);
+  gtk_source_completion_context_get_bounds (context, &begin, &end);
+
+  buffer = GTK_TEXT_BUFFER (gtk_source_completion_context_get_buffer (context));
 
   if (gtk_source_buffer_iter_has_context_class (GTK_SOURCE_BUFFER (buffer), &begin, "path"))
     {
@@ -163,6 +182,8 @@ query_filesystem:
 
   g_assert (IDE_IS_BUFFER (buffer));
 
+  self->word = g_strdup (prefix);
+
   /*
    * First step is to get our list of include paths from the CFLAGS for the
    * file. After that, we can start looking for matches on the file-system
@@ -182,7 +203,7 @@ query_filesystem:
 }
 
 static GListModel *
-cpack_completion_provider_populate_finish (IdeCompletionProvider  *self,
+cpack_completion_provider_populate_finish (GtkSourceCompletionProvider  *self,
                                            GAsyncResult           *result,
                                            GError                **error)
 {
@@ -193,32 +214,31 @@ cpack_completion_provider_populate_finish (IdeCompletionProvider  *self,
 }
 
 static void
-cpack_completion_provider_display_proposal (IdeCompletionProvider   *provider,
-                                            IdeCompletionListBoxRow *row,
-                                            IdeCompletionContext    *context,
-                                            const gchar             *typed_text,
-                                            IdeCompletionProposal   *proposal)
+cpack_completion_provider_display (GtkSourceCompletionProvider *provider,
+                                   GtkSourceCompletionContext  *context,
+                                   GtkSourceCompletionProposal *proposal,
+                                   GtkSourceCompletionCell     *cell)
 {
-  g_autofree gchar *markup = NULL;
+  CpackCompletionProvider *self = (CpackCompletionProvider *)provider;
+  const char *typed_text;
 
-  g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_LIST_BOX_ROW (row));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (CPACK_IS_COMPLETION_PROVIDER (self));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (CPACK_IS_COMPLETION_ITEM (proposal));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CELL (cell));
 
-  markup = ide_completion_fuzzy_highlight (CPACK_COMPLETION_ITEM (proposal)->name, typed_text);
+  if (self->refilter_word)
+    typed_text = self->refilter_word;
+  else
+    typed_text = self->word;
 
-  ide_completion_list_box_row_set_icon_name (row, "lang-include-symbolic");
-  ide_completion_list_box_row_set_left (row, NULL);
-  ide_completion_list_box_row_set_center_markup (row, markup);
-  ide_completion_list_box_row_set_right (row, NULL);
+  cpack_completion_item_display (CPACK_COMPLETION_ITEM (proposal), cell, typed_text);
 }
 
 static void
-cpack_completion_provider_activate_proposal (IdeCompletionProvider *provider,
-                                             IdeCompletionContext  *context,
-                                             IdeCompletionProposal *proposal,
-                                             const GdkEventKey     *key)
+cpack_completion_provider_activate (GtkSourceCompletionProvider *provider,
+                                    GtkSourceCompletionContext  *context,
+                                    GtkSourceCompletionProposal *proposal)
 {
   CpackCompletionItem *item = (CpackCompletionItem *)proposal;
   GtkTextBuffer *buffer;
@@ -226,16 +246,16 @@ cpack_completion_provider_activate_proposal (IdeCompletionProvider *provider,
   gsize len;
 
   g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (CPACK_IS_COMPLETION_ITEM (item));
 
-  buffer = ide_completion_context_get_buffer (context);
+  buffer = GTK_TEXT_BUFFER (gtk_source_completion_context_get_buffer (context));
 
   len = strlen (item->name);
 
   gtk_text_buffer_begin_user_action (buffer);
 
-  if (ide_completion_context_get_bounds (context, &begin, &end))
+  if (gtk_source_completion_context_get_bounds (context, &begin, &end))
     gtk_text_buffer_delete (buffer, &begin, &end);
 
   /* don't insert trailing / so user does that to trigger next popup */
@@ -247,33 +267,33 @@ cpack_completion_provider_activate_proposal (IdeCompletionProvider *provider,
   gtk_text_buffer_end_user_action (buffer);
 }
 
-static gboolean
-cpack_completion_provider_refilter (IdeCompletionProvider *provider,
-                                    IdeCompletionContext  *context,
-                                    GListModel            *model)
+static void
+cpack_completion_provider_refilter (GtkSourceCompletionProvider *provider,
+                                    GtkSourceCompletionContext  *context,
+                                    GListModel                  *model)
 {
-  g_autofree gchar *word = NULL;
+  CpackCompletionProvider *self = (CpackCompletionProvider *)provider;
 
   g_assert (CPACK_IS_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (CPACK_IS_COMPLETION_RESULTS (model));
 
-  word = ide_completion_context_get_word (context);
-  cpack_completion_results_refilter (CPACK_COMPLETION_RESULTS (model), word);
+  g_clear_pointer (&self->refilter_word, g_free);
+  self->refilter_word = gtk_source_completion_context_get_word (context);
 
-  return TRUE;
+  cpack_completion_results_refilter (CPACK_COMPLETION_RESULTS (model), self->refilter_word);
 }
 
 static gint
-cpack_completion_provider_get_priority (IdeCompletionProvider *provider,
-                                        IdeCompletionContext  *context)
+cpack_completion_provider_get_priority (GtkSourceCompletionProvider *provider,
+                                        GtkSourceCompletionContext  *context)
 {
   /* we only activate when applicable, so high priority */
   return -100;
 }
 
 static gboolean
-cpack_completion_provider_is_trigger (IdeCompletionProvider *provider,
+cpack_completion_provider_is_trigger (GtkSourceCompletionProvider *provider,
                                       const GtkTextIter     *iter,
                                       gunichar               ch)
 {
@@ -289,13 +309,13 @@ cpack_completion_provider_is_trigger (IdeCompletionProvider *provider,
 }
 
 static void
-provider_iface_init (IdeCompletionProviderInterface *iface)
+provider_iface_init (GtkSourceCompletionProviderInterface *iface)
 {
   iface->populate_async = cpack_completion_provider_populate_async;
   iface->populate_finish = cpack_completion_provider_populate_finish;
   iface->refilter = cpack_completion_provider_refilter;
-  iface->display_proposal = cpack_completion_provider_display_proposal;
-  iface->activate_proposal = cpack_completion_provider_activate_proposal;
+  iface->display = cpack_completion_provider_display;
+  iface->activate = cpack_completion_provider_activate;
   iface->get_priority = cpack_completion_provider_get_priority;
   iface->is_trigger = cpack_completion_provider_is_trigger;
 }
diff --git a/src/plugins/c-pack/cpack-completion-results.c b/src/plugins/c-pack/cpack-completion-results.c
index b4c06d872..50cdd5e8d 100644
--- a/src/plugins/c-pack/cpack-completion-results.c
+++ b/src/plugins/c-pack/cpack-completion-results.c
@@ -176,7 +176,7 @@ cpack_completion_results_refilter (CpackCompletionResults *self,
           const gchar *ele = g_ptr_array_index (self->unfiltered, i);
           guint priority;
 
-          if (ide_completion_fuzzy_match (ele, casefold, &priority))
+          if (gtk_source_completion_fuzzy_match (ele, casefold, &priority))
             {
               Item item = { .word = ele, .priority = priority };
 
diff --git a/src/plugins/c-pack/cpack-editor-page-addin.c b/src/plugins/c-pack/cpack-editor-page-addin.c
index 3074704c1..4c9bd144a 100644
--- a/src/plugins/c-pack/cpack-editor-page-addin.c
+++ b/src/plugins/c-pack/cpack-editor-page-addin.c
@@ -41,13 +41,11 @@ format_decls_cb (GSimpleAction *action,
   g_autofree gchar *input = NULL;
   g_autofree gchar *output = NULL;
   IdeBuffer *buffer;
-  IdeSourceView *sourceview;
   GtkTextIter begin, end;
 
   g_assert (IDE_IS_EDITOR_PAGE (view));
 
   buffer = ide_editor_page_get_buffer (view);
-  sourceview = ide_editor_page_get_view (view);
 
   /* We require a selection */
   if (!gtk_text_buffer_get_selection_bounds (GTK_TEXT_BUFFER (buffer), &begin, &end))
@@ -62,7 +60,6 @@ format_decls_cb (GSimpleAction *action,
       gtk_text_buffer_delete (GTK_TEXT_BUFFER (buffer), &begin, &end);
       gtk_text_buffer_insert (GTK_TEXT_BUFFER (buffer), &begin, output, -1);
       gtk_text_buffer_end_user_action (GTK_TEXT_BUFFER (buffer));
-      g_signal_emit_by_name (sourceview, "reset");
     }
 }
 
diff --git a/src/plugins/c-pack/gtk/keybindings.json b/src/plugins/c-pack/gtk/keybindings.json
new file mode 100644
index 000000000..619aa645d
--- /dev/null
+++ b/src/plugins/c-pack/gtk/keybindings.json
@@ -0,0 +1 @@
+{ "trigger" : "<Control><Shift>f", "action" : "cpack.format-decls", "when" : "inEditorWithLanguage(\"chdr\") 
&& hasSelection()", "phase" : "capture" },
diff --git a/src/plugins/c-pack/meson.build b/src/plugins/c-pack/meson.build
index 0fffd5f9f..676dd1e98 100644
--- a/src/plugins/c-pack/meson.build
+++ b/src/plugins/c-pack/meson.build
@@ -8,9 +8,11 @@ plugins_sources += files([
   'cpack-completion-results.c',
   'cpack-editor-page-addin.c',
   'hdr-format.c',
-  'ide-c-indenter.c',
 ])
 
+# needs to be ported to GtkSourceView 5 and moved there
+# 'ide-c-indenter.c',
+
 plugin_c_pack_resources = gnome.compile_resources(
   'c-pack-resources',
   'c-pack.gresource.xml',


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