diff options
author | Christian Hergert <chergert@redhat.com> | 2021-03-08 16:13:14 -0800 |
---|---|---|
committer | Christian Hergert <chergert@redhat.com> | 2021-03-10 13:02:10 -0800 |
commit | a074ac96297d5172294f09ddc63752bc49610f83 (patch) | |
tree | 707328aba03686bb4583478b5aa7dcf2365dfc35 /tests | |
parent | bf6bf85160c04c81b3fbfd64d15c6878dc578584 (diff) | |
download | gtksourceview-a074ac96297d5172294f09ddc63752bc49610f83.tar.gz |
hover: add GtkSourceHover support
This adds support for a GtkSourceHover, GtkSourceHoverProvider,
GtkSourceHoverContext, and GtkSourceHoverDisplay objects. These can
be used to provide interactive tooltips to code similar to those
used by various editors integrating with language servers.
Applications can register GtkSourceHoverProviders which can populate the
contents of a GtkSourceHoverDisplay by adding widgets to it from their
synchronous populate, or asynchronous populate_async() callbacks.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test-widget.c | 75 | ||||
-rw-r--r-- | tests/test-widget.ui | 11 |
2 files changed, 84 insertions, 2 deletions
diff --git a/tests/test-widget.c b/tests/test-widget.c index 2ee4521f..ec00016c 100644 --- a/tests/test-widget.c +++ b/tests/test-widget.c @@ -22,7 +22,11 @@ #include <string.h> #include <gtksourceview/gtksource.h> +#define TEST_TYPE_WIDGET (test_widget_get_type()) +#define TEST_TYPE_HOVER_PROVIDER (test_hover_provider_get_type()) + G_DECLARE_FINAL_TYPE (TestWidget, test_widget, TEST, WIDGET, GtkGrid) +G_DECLARE_FINAL_TYPE (TestHoverProvider, test_hover_provider, TEST, HOVER_PROVIDER, GObject) struct _TestWidget { @@ -44,9 +48,16 @@ struct _TestWidget GtkWidget *top; }; -GType test_widget_get_type (void); +struct _TestHoverProvider +{ + GObject parent_instance; +}; + +static void hover_provider_iface_init (GtkSourceHoverProviderInterface *iface); G_DEFINE_TYPE (TestWidget, test_widget, GTK_TYPE_GRID) +G_DEFINE_TYPE_WITH_CODE (TestHoverProvider, test_hover_provider, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_HOVER_PROVIDER, hover_provider_iface_init)) #define MARK_TYPE_1 "one" #define MARK_TYPE_2 "two" @@ -946,6 +957,31 @@ enable_snippets_toggled_cb (TestWidget *self, gtk_source_view_set_enable_snippets (self->view, enabled); } +static GtkSourceHoverProvider * +create_hover_provider (void) +{ + return g_object_new (TEST_TYPE_HOVER_PROVIDER, NULL); +} + +static void +enable_hover_toggled_cb (TestWidget *self, + GtkCheckButton *button) +{ + static GtkSourceHoverProvider *test_hover_provider; + GtkSourceHover *hover = gtk_source_view_get_hover (self->view); + gboolean enabled = gtk_check_button_get_active (button); + + if (test_hover_provider == NULL) + { + test_hover_provider = create_hover_provider (); + } + + if (enabled) + gtk_source_hover_add_provider (hover, test_hover_provider); + else + gtk_source_hover_remove_provider (hover, test_hover_provider); +} + static void test_widget_dispose (GObject *object) { @@ -985,6 +1021,7 @@ test_widget_class_init (TestWidgetClass *klass) gtk_widget_class_bind_template_callback (widget_class, forward_string_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, smart_home_end_changed_cb); gtk_widget_class_bind_template_callback (widget_class, enable_snippets_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, enable_hover_toggled_cb); gtk_widget_class_bind_template_child (widget_class, TestWidget, view); gtk_widget_class_bind_template_child (widget_class, TestWidget, map); @@ -1120,6 +1157,41 @@ test_widget_new (void) return g_object_new (test_widget_get_type (), NULL); } +static gboolean +test_hover_provider_populate (GtkSourceHoverProvider *provider, + GtkSourceHoverContext *context, + GtkSourceHoverDisplay *display, + GError **error) +{ + GtkTextIter begin, end; + + if (gtk_source_hover_context_get_bounds (context, &begin, &end)) + { + gchar *text = gtk_text_iter_get_slice (&begin, &end); + GtkWidget *label = gtk_label_new (text); + gtk_source_hover_display_append (display, label); + g_free (text); + } + + return TRUE; +} + +static void +hover_provider_iface_init (GtkSourceHoverProviderInterface *iface) +{ + iface->populate = test_hover_provider_populate; +} + +static void +test_hover_provider_class_init (TestHoverProviderClass *klass) +{ +} + +static void +test_hover_provider_init (TestHoverProvider *self) +{ +} + static void setup_search_paths (void) { @@ -1140,7 +1212,6 @@ setup_search_paths (void) gtk_source_language_manager_set_search_path (languages, langs_path); } - int main (int argc, char *argv[]) { diff --git a/tests/test-widget.ui b/tests/test-widget.ui index 1d5f7460..ca6d7d10 100644 --- a/tests/test-widget.ui +++ b/tests/test-widget.ui @@ -229,6 +229,17 @@ </object> </child> <child> + <object class="GtkCheckButton" id="enable_hover"> + <property name="label">Enable hoverers</property> + <property name="can-focus">1</property> + <signal name="toggled" handler="enable_hover_toggled_cb" object="TestWidget" swapped="yes"/> + <layout> + <property name="row">14</property> + <property name="column">0</property> + </layout> + </object> + </child> + <child> <object class="GtkGrid" id="grid10"> <layout> <property name="column">0</property> |