[gnome-builder/wip/gtk4-port] plugins/html-completion: port to GTK 4



commit c10f34da6a40ce28b25d83cf68c38349eaeb8d7b
Author: Christian Hergert <chergert redhat com>
Date:   Tue Apr 19 14:37:08 2022 -0700

    plugins/html-completion: port to GTK 4

 .../html-completion/html-completion-plugin.c       |   4 +-
 .../html-completion/ide-html-completion-provider.c | 187 +++++++++++----------
 src/plugins/html-completion/ide-html-proposal.c    |  16 +-
 src/plugins/html-completion/ide-html-proposal.h    |   2 +-
 src/plugins/html-completion/ide-html-proposals.c   |   8 +-
 src/plugins/meson.build                            |   2 +-
 6 files changed, 112 insertions(+), 107 deletions(-)
---
diff --git a/src/plugins/html-completion/html-completion-plugin.c 
b/src/plugins/html-completion/html-completion-plugin.c
index fb2781ed6..5a2b9acdb 100644
--- a/src/plugins/html-completion/html-completion-plugin.c
+++ b/src/plugins/html-completion/html-completion-plugin.c
@@ -20,8 +20,8 @@
 
 #include "config.h"
 
-#include <libide-sourceview.h>
 #include <libpeas/peas.h>
+#include <gtksourceview/gtksource.h>
 
 #include "ide-html-completion-provider.h"
 
@@ -29,6 +29,6 @@ _IDE_EXTERN void
 _ide_html_completion_register_types (PeasObjectModule *module)
 {
   peas_object_module_register_extension_type (module,
-                                              IDE_TYPE_COMPLETION_PROVIDER,
+                                              GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
                                               IDE_TYPE_HTML_COMPLETION_PROVIDER);
 }
diff --git a/src/plugins/html-completion/ide-html-completion-provider.c 
b/src/plugins/html-completion/ide-html-completion-provider.c
index af01b6d6e..8a8b11682 100644
--- a/src/plugins/html-completion/ide-html-completion-provider.c
+++ b/src/plugins/html-completion/ide-html-completion-provider.c
@@ -1,6 +1,6 @@
 /* ide-html-completion-provider.c
  *
- * Copyright 2014-2019 Christian Hergert <christian hergert me>
+ * Copyright 2014-2022 Christian Hergert <christian hergert me>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,6 +20,8 @@
 
 #define G_LOG_DOMAIN "html-completion"
 
+#include "config.h"
+
 #include "ide-html-completion-provider.h"
 #include "ide-html-proposal.h"
 #include "ide-html-proposals.h"
@@ -30,12 +32,12 @@ struct _IdeHtmlCompletionProvider
   IdeHtmlProposals *proposals;
 };
 
-static void completion_provider_init (IdeCompletionProviderInterface *iface);
+static void completion_provider_init (GtkSourceCompletionProviderInterface *iface);
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (IdeHtmlCompletionProvider,
-                         ide_html_completion_provider,
-                         G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROVIDER, completion_provider_init))
+                               ide_html_completion_provider,
+                               G_TYPE_OBJECT,
+                               G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROVIDER, 
completion_provider_init))
 
 static gboolean
 in_element (const GtkTextIter *iter)
@@ -239,17 +241,17 @@ get_element (const GtkTextIter *iter)
 }
 
 static void
-whereami (IdeCompletionContext  *context,
-          IdeHtmlProposalKind   *kind,
-          gchar                **element)
+whereami (GtkSourceCompletionContext  *context,
+          IdeHtmlProposalKind         *kind,
+          gchar                      **element)
 {
   GtkTextIter begin, end;
 
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (kind != NULL);
   g_assert (element != NULL);
 
-  ide_completion_context_get_bounds (context, &begin, &end);
+  gtk_source_completion_context_get_bounds (context, &begin, &end);
 
   *kind = get_mode (&begin);
   *element = NULL;
@@ -258,7 +260,7 @@ whereami (IdeCompletionContext  *context,
     {
     case IDE_HTML_PROPOSAL_ELEMENT_START:
     case IDE_HTML_PROPOSAL_ELEMENT_END:
-      *element = ide_completion_context_get_word (context);
+      *element = gtk_source_completion_context_get_word (context);
       break;
 
     case IDE_HTML_PROPOSAL_ATTRIBUTE_NAME:
@@ -274,12 +276,22 @@ whereami (IdeCompletionContext  *context,
     }
 }
 
+static gboolean
+is_language (GtkSourceCompletionContext *context,
+             const char                 *language_id)
+{
+  GtkSourceLanguage *language = gtk_source_completion_context_get_language (context);
+
+  return language != NULL &&
+         ide_str_equal0 (language_id, gtk_source_language_get_id (language));
+}
+
 static void
-ide_html_completion_provider_populate_async (IdeCompletionProvider *provider,
-                                             IdeCompletionContext  *context,
-                                             GCancellable          *cancellable,
-                                             GAsyncReadyCallback    callback,
-                                             gpointer               user_data)
+ide_html_completion_provider_populate_async (GtkSourceCompletionProvider *provider,
+                                             GtkSourceCompletionContext  *context,
+                                             GCancellable                *cancellable,
+                                             GAsyncReadyCallback          callback,
+                                             gpointer                     user_data)
 {
   IdeHtmlCompletionProvider *self = (IdeHtmlCompletionProvider *)provider;
   g_autoptr(IdeTask) task = NULL;
@@ -288,19 +300,19 @@ ide_html_completion_provider_populate_async (IdeCompletionProvider *provider,
   g_autofree gchar *word = NULL;
   g_autofree gchar *casefold = NULL;
 
-  g_assert (IDE_IS_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_PROVIDER (provider));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
 
   task = ide_task_new (self, cancellable, callback, user_data);
   ide_task_set_source_tag (task, ide_html_completion_provider_populate_async);
 
-  if (ide_completion_context_is_language (context, "css"))
+  if (is_language (context, "css"))
     kind = IDE_HTML_PROPOSAL_CSS_PROPERTY;
   else
     whereami (context, &kind, &element);
 
-  if ((word = ide_completion_context_get_word (context)))
+  if ((word = gtk_source_completion_context_get_word (context)))
     casefold = g_utf8_casefold (word, -1);
 
   if (self->proposals == NULL)
@@ -312,7 +324,7 @@ ide_html_completion_provider_populate_async (IdeCompletionProvider *provider,
 }
 
 static GListModel *
-ide_html_completion_provider_populate_finish (IdeCompletionProvider  *provider,
+ide_html_completion_provider_populate_finish (GtkSourceCompletionProvider  *provider,
                                               GAsyncResult           *result,
                                               GError                **error)
 {
@@ -322,10 +334,10 @@ ide_html_completion_provider_populate_finish (IdeCompletionProvider  *provider,
   return ide_task_propagate_object (IDE_TASK (result), error);
 }
 
-static gboolean
-ide_html_completion_provider_refilter (IdeCompletionProvider *provider,
-                                       IdeCompletionContext  *context,
-                                       GListModel            *proposals)
+static void
+ide_html_completion_provider_refilter (GtkSourceCompletionProvider *provider,
+                                       GtkSourceCompletionContext  *context,
+                                       GListModel                  *proposals)
 {
   IdeHtmlProposalKind kind = 0;
   g_autofree gchar *element = NULL;
@@ -333,126 +345,119 @@ ide_html_completion_provider_refilter (IdeCompletionProvider *provider,
   g_autofree gchar *casefold = NULL;
 
   g_assert (IDE_IS_HTML_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (IDE_IS_HTML_PROPOSALS (proposals));
 
-  if (ide_completion_context_is_language (context, "css"))
+  if (is_language (context, "css"))
     kind = IDE_HTML_PROPOSAL_CSS_PROPERTY;
   else
     whereami (context, &kind, &element);
 
-  if ((word = ide_completion_context_get_word (context)))
+  if ((word = gtk_source_completion_context_get_word (context)))
     casefold = g_utf8_casefold (word, -1);
 
   ide_html_proposals_refilter (IDE_HTML_PROPOSALS (proposals), kind, element, casefold);
-
-  return TRUE;
 }
 
 static void
-ide_html_completion_provider_activate_proposal (IdeCompletionProvider *provider,
-                                                IdeCompletionContext  *context,
-                                                IdeCompletionProposal *proposal,
-                                                const GdkEventKey     *key)
+ide_html_completion_provider_activate (GtkSourceCompletionProvider *provider,
+                                       GtkSourceCompletionContext  *context,
+                                       GtkSourceCompletionProposal *proposal)
 {
-  g_autoptr(IdeSnippet) snippet = NULL;
+  g_autoptr(GtkSourceSnippet) snippet = NULL;
   IdeHtmlProposal *item = (IdeHtmlProposal *)proposal;
   IdeHtmlProposalKind kind;
   GtkTextBuffer *buffer;
-  GtkTextView *view;
+  GtkSourceView *view;
   GtkTextIter begin, end;
 
   g_assert (IDE_IS_HTML_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (IDE_IS_HTML_PROPOSAL (item));
 
   snippet = ide_html_proposal_get_snippet (item);
   kind = ide_html_proposal_get_kind (item);
 
-  buffer = ide_completion_context_get_buffer (context);
-  view = ide_completion_context_get_view (context);
+  buffer = GTK_TEXT_BUFFER (gtk_source_completion_context_get_buffer (context));
+  view = gtk_source_completion_context_get_view (context);
 
   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);
 
   if (kind == IDE_HTML_PROPOSAL_ELEMENT_START && gtk_text_iter_get_char (&begin) != '>')
     {
-      g_autoptr(IdeSnippetChunk) chunk1 = ide_snippet_chunk_new ();
-      g_autoptr(IdeSnippetChunk) chunk2 = ide_snippet_chunk_new ();
+      g_autoptr(GtkSourceSnippetChunk) chunk1 = gtk_source_snippet_chunk_new ();
+      g_autoptr(GtkSourceSnippetChunk) chunk2 = gtk_source_snippet_chunk_new ();
 
-      ide_snippet_chunk_set_tab_stop (chunk1, 0);
-      ide_snippet_chunk_set_spec (chunk2, ">");
+      gtk_source_snippet_chunk_set_focus_position (chunk1, 0);
+      gtk_source_snippet_chunk_set_spec (chunk2, ">");
 
-      ide_snippet_add_chunk (snippet, chunk1);
-      ide_snippet_add_chunk (snippet, chunk2);
+      gtk_source_snippet_add_chunk (snippet, chunk1);
+      gtk_source_snippet_add_chunk (snippet, chunk2);
     }
 
   if (kind == IDE_HTML_PROPOSAL_CSS_PROPERTY)
     {
-      g_autoptr(IdeSnippetChunk) chunk1 = ide_snippet_chunk_new ();
-      g_autoptr(IdeSnippetChunk) chunk2 = ide_snippet_chunk_new ();
-      g_autoptr(IdeSnippetChunk) chunk3 = ide_snippet_chunk_new ();
+      g_autoptr(GtkSourceSnippetChunk) chunk1 = gtk_source_snippet_chunk_new ();
+      g_autoptr(GtkSourceSnippetChunk) chunk2 = gtk_source_snippet_chunk_new ();
+      g_autoptr(GtkSourceSnippetChunk) chunk3 = gtk_source_snippet_chunk_new ();
 
-      ide_snippet_chunk_set_spec (chunk1, ": ");
-      ide_snippet_chunk_set_tab_stop (chunk2, 0);
-      ide_snippet_chunk_set_spec (chunk3, ";");
+      gtk_source_snippet_chunk_set_spec (chunk1, ": ");
+      gtk_source_snippet_chunk_set_focus_position (chunk2, 0);
+      gtk_source_snippet_chunk_set_spec (chunk3, ";");
 
-      ide_snippet_add_chunk (snippet, chunk1);
-      ide_snippet_add_chunk (snippet, chunk2);
-      ide_snippet_add_chunk (snippet, chunk3);
+      gtk_source_snippet_add_chunk (snippet, chunk1);
+      gtk_source_snippet_add_chunk (snippet, chunk2);
+      gtk_source_snippet_add_chunk (snippet, chunk3);
     }
 
-  ide_source_view_push_snippet (IDE_SOURCE_VIEW (view), snippet, &begin);
+  gtk_source_view_push_snippet (view, snippet, &begin);
 
   gtk_text_buffer_end_user_action (buffer);
 }
 
 static void
-ide_html_completion_provider_display_proposal (IdeCompletionProvider   *provider,
-                                               IdeCompletionListBoxRow *row,
-                                               IdeCompletionContext    *context,
-                                               const gchar             *typed_text,
-                                               IdeCompletionProposal   *proposal)
+ide_html_completion_provider_display (GtkSourceCompletionProvider *provider,
+                                      GtkSourceCompletionContext  *context,
+                                      GtkSourceCompletionProposal *proposal,
+                                      GtkSourceCompletionCell     *cell)
 {
-  g_autofree gchar *markup = NULL;
-  const gchar *word;
-  IdeHtmlProposalKind kind;
+  GtkSourceCompletionColumn column;
 
   g_assert (IDE_IS_HTML_COMPLETION_PROVIDER (provider));
-  g_assert (IDE_IS_COMPLETION_LIST_BOX_ROW (row));
-  g_assert (IDE_IS_COMPLETION_CONTEXT (context));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CONTEXT (context));
   g_assert (IDE_IS_HTML_PROPOSAL (proposal));
+  g_assert (GTK_SOURCE_IS_COMPLETION_CELL (cell));
 
-  word = ide_html_proposal_get_word (IDE_HTML_PROPOSAL (proposal));
-  markup = ide_completion_fuzzy_highlight (word, typed_text);
-  kind = ide_html_proposal_get_kind (IDE_HTML_PROPOSAL (proposal));
+  column = gtk_source_completion_cell_get_column (cell);
 
-  switch (kind)
+  if (column == GTK_SOURCE_COMPLETION_COLUMN_ICON)
     {
-    case IDE_HTML_PROPOSAL_CSS_PROPERTY:
-      /* probably could use something css specific */
-      ide_completion_list_box_row_set_icon_name (row, "ui-property-symbolic");
-      break;
+      IdeHtmlProposalKind kind = ide_html_proposal_get_kind (IDE_HTML_PROPOSAL (proposal));
 
-    case IDE_HTML_PROPOSAL_ELEMENT_START:
-    case IDE_HTML_PROPOSAL_ELEMENT_END:
-    case IDE_HTML_PROPOSAL_ATTRIBUTE_NAME:
-    case IDE_HTML_PROPOSAL_ATTRIBUTE_VALUE:
-    case IDE_HTML_PROPOSAL_NONE:
-    default:
-      ide_completion_list_box_row_set_icon_name (row, NULL);
-      break;
+      if (kind == IDE_HTML_PROPOSAL_CSS_PROPERTY)
+        gtk_source_completion_cell_set_icon_name (cell, "ui-property-symbolic");
+      else
+        gtk_source_completion_cell_set_icon_name (cell, NULL);
     }
+  else if (column == GTK_SOURCE_COMPLETION_COLUMN_TYPED_TEXT)
+    {
+      g_autofree char *typed_text = gtk_source_completion_context_get_word (context);
+      const gchar *word = ide_html_proposal_get_word (IDE_HTML_PROPOSAL (proposal));
+      g_autoptr(PangoAttrList) attrs = gtk_source_completion_fuzzy_highlight (word, typed_text);
 
-  ide_completion_list_box_row_set_left (row, NULL);
-  ide_completion_list_box_row_set_right (row, NULL);
-  ide_completion_list_box_row_set_center_markup (row, markup);
+      gtk_source_completion_cell_set_text_with_attributes (cell, word, attrs);
+    }
+  else
+    {
+      gtk_source_completion_cell_set_text (cell, NULL);
+    }
 }
 
 static gint
-ide_html_completion_provider_get_priority (IdeCompletionProvider *provider,
-                                           IdeCompletionContext  *context)
+ide_html_completion_provider_get_priority (GtkSourceCompletionProvider *provider,
+                                           GtkSourceCompletionContext  *context)
 {
   return 200;
 }
@@ -467,7 +472,7 @@ in_comment (const GtkTextIter *iter)
 }
 
 static gboolean
-ide_html_completion_provider_is_trigger (IdeCompletionProvider *provider,
+ide_html_completion_provider_is_trigger (GtkSourceCompletionProvider *provider,
                                          const GtkTextIter     *iter,
                                          gunichar               ch)
 {
@@ -510,13 +515,13 @@ ide_html_completion_provider_init (IdeHtmlCompletionProvider *self)
 }
 
 static void
-completion_provider_init (IdeCompletionProviderInterface *iface)
+completion_provider_init (GtkSourceCompletionProviderInterface *iface)
 {
   iface->populate_async = ide_html_completion_provider_populate_async;
   iface->populate_finish = ide_html_completion_provider_populate_finish;
   iface->refilter = ide_html_completion_provider_refilter;
-  iface->activate_proposal = ide_html_completion_provider_activate_proposal;
-  iface->display_proposal = ide_html_completion_provider_display_proposal;
+  iface->activate = ide_html_completion_provider_activate;
+  iface->display = ide_html_completion_provider_display;
   iface->get_priority = ide_html_completion_provider_get_priority;
   iface->is_trigger = ide_html_completion_provider_is_trigger;
 }
diff --git a/src/plugins/html-completion/ide-html-proposal.c b/src/plugins/html-completion/ide-html-proposal.c
index 08820bcd3..567899cb5 100644
--- a/src/plugins/html-completion/ide-html-proposal.c
+++ b/src/plugins/html-completion/ide-html-proposal.c
@@ -32,7 +32,7 @@ struct _IdeHtmlProposal
 };
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (IdeHtmlProposal, ide_html_proposal, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL, NULL))
+                         G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROPOSAL, NULL))
 
 static void
 ide_html_proposal_class_init (IdeHtmlProposalClass *klass)
@@ -59,18 +59,18 @@ ide_html_proposal_new (const gchar         *word,
   return self;
 }
 
-IdeSnippet *
+GtkSourceSnippet *
 ide_html_proposal_get_snippet (IdeHtmlProposal *self)
 {
-  g_autoptr(IdeSnippet) snippet = NULL;
-  g_autoptr(IdeSnippetChunk) chunk = NULL;
+  g_autoptr(GtkSourceSnippet) snippet = NULL;
+  g_autoptr(GtkSourceSnippetChunk) chunk = NULL;
 
   g_return_val_if_fail (IDE_IS_HTML_PROPOSAL (self), NULL);
 
-  snippet = ide_snippet_new (NULL, NULL);
-  chunk = ide_snippet_chunk_new ();
-  ide_snippet_chunk_set_spec (chunk, self->word);
-  ide_snippet_add_chunk (snippet, chunk);
+  snippet = gtk_source_snippet_new (NULL, NULL);
+  chunk = gtk_source_snippet_chunk_new ();
+  gtk_source_snippet_chunk_set_spec (chunk, self->word);
+  gtk_source_snippet_add_chunk (snippet, chunk);
 
   return g_steal_pointer (&snippet);
 }
diff --git a/src/plugins/html-completion/ide-html-proposal.h b/src/plugins/html-completion/ide-html-proposal.h
index 1d50c07cb..a1e9848dc 100644
--- a/src/plugins/html-completion/ide-html-proposal.h
+++ b/src/plugins/html-completion/ide-html-proposal.h
@@ -33,7 +33,7 @@ G_DECLARE_FINAL_TYPE (IdeHtmlProposal, ide_html_proposal, IDE, HTML_PROPOSAL, GO
 IdeHtmlProposal     *ide_html_proposal_new         (const gchar         *word,
                                                     IdeHtmlProposalKind  kind);
 const gchar         *ide_html_proposal_get_word    (IdeHtmlProposal     *word);
-IdeSnippet          *ide_html_proposal_get_snippet (IdeHtmlProposal     *self);
+GtkSourceSnippet    *ide_html_proposal_get_snippet (IdeHtmlProposal     *self);
 IdeHtmlProposalKind  ide_html_proposal_get_kind    (IdeHtmlProposal     *self);
 
 G_END_DECLS
diff --git a/src/plugins/html-completion/ide-html-proposals.c 
b/src/plugins/html-completion/ide-html-proposals.c
index e84dffb8f..234d6e659 100644
--- a/src/plugins/html-completion/ide-html-proposals.c
+++ b/src/plugins/html-completion/ide-html-proposals.c
@@ -110,7 +110,7 @@ ide_html_proposals_refilter (IdeHtmlProposals    *self,
         {
           guint priority;
 
-          if (ide_completion_fuzzy_match (html_elements[i], casefold, &priority))
+          if (gtk_source_completion_fuzzy_match (html_elements[i], casefold, &priority))
             {
               Item item = { html_elements[i], kind, priority };
               g_array_append_val (self->items, item);
@@ -125,7 +125,7 @@ ide_html_proposals_refilter (IdeHtmlProposals    *self,
         {
           guint priority;
 
-          if (ide_completion_fuzzy_match (html_attributes_shared[i], casefold, &priority))
+          if (gtk_source_completion_fuzzy_match (html_attributes_shared[i], casefold, &priority))
             {
               Item item = { html_attributes_shared[i], kind, priority };
               g_array_append_val (self->items, item);
@@ -139,7 +139,7 @@ ide_html_proposals_refilter (IdeHtmlProposals    *self,
           if (strcmp (html_attributes[i].element, element) != 0)
             continue;
 
-          if (ide_completion_fuzzy_match (html_attributes[i].attr, casefold, &priority))
+          if (gtk_source_completion_fuzzy_match (html_attributes[i].attr, casefold, &priority))
             {
               Item item = { html_attributes[i].attr, kind, priority };
               g_array_append_val (self->items, item);
@@ -152,7 +152,7 @@ ide_html_proposals_refilter (IdeHtmlProposals    *self,
         {
           guint priority;
 
-          if (ide_completion_fuzzy_match (css_properties[i], casefold, &priority))
+          if (gtk_source_completion_fuzzy_match (css_properties[i], casefold, &priority))
             {
               Item item = { css_properties[i], kind, priority };
               g_array_append_val (self->items, item);
diff --git a/src/plugins/meson.build b/src/plugins/meson.build
index e24de0fe3..d42eec374 100644
--- a/src/plugins/meson.build
+++ b/src/plugins/meson.build
@@ -84,7 +84,7 @@ subdir('greeter')
 #subdir('grep')
 #subdir('gvls')
 #subdir('history')
-#subdir('html-completion')
+subdir('html-completion')
 #subdir('html-preview')
 #subdir('intelephense')
 #subdir('jedi-language-server')


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