summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-09-19 11:39:25 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-09-19 11:39:25 -0400
commitb033f28a0d01f1dc83b0f1411dda8bd8725daab3 (patch)
tree2855385fca3cf1f5ca8100d66c795cf1840f9876
parent84d82dcda9d1db2c6f738706202230312a4191c7 (diff)
downloadgtk+-wip/font-chooser-filter-spinner.tar.gz
wip: Play with adding a spinner in the search entrywip/font-chooser-filter-spinner
It is not great - FcFontSort is still too choppy to allow a smooth spinner. And the spinner and the clear icon interfere with each other a bit: if the icon is not shown, it makes the spinner appear in the middle nowhere. This would be better if the spinner was a builtin feature of the search entry.
-rw-r--r--gtk/gtkfontchooserwidget.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 0f380f34b9..18c91900fa 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -62,6 +62,7 @@
#include "gtklistview.h"
#include "gtksortlistmodel.h"
#include "gtkstringsorter.h"
+#include "gtkspinner.h"
#include <hb-ot.h>
#if defined(HAVE_PANGOFT) && defined(HAVE_HARFBUZZ)
@@ -112,6 +113,8 @@ struct _GtkFontChooserWidget
GtkCustomFilter *custom_filter;
GtkCustomFilter *user_filter;
GtkFilterListModel *filter_model;
+ GtkWidget *spinner;
+ guint spinner_timeout;
GtkWidget *preview;
GtkWidget *preview2;
@@ -204,6 +207,7 @@ static GtkFontChooserLevel gtk_font_chooser_widget_get_level (GtkFontChooserWidg
static void gtk_font_chooser_widget_set_language (GtkFontChooserWidget *fontchooser,
const char *language);
static void update_font_features (GtkFontChooserWidget *fontchooser);
+static void update_spinner (GtkFontChooserWidget *self);
static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface);
@@ -856,8 +860,14 @@ gtk_font_chooser_widget_dispose (GObject *object)
{
GtkFontChooserWidget *self = GTK_FONT_CHOOSER_WIDGET (object);
+ if (self->spinner_timeout)
+ {
+ g_source_remove (self->spinner_timeout);
+ self->spinner_timeout = 0;
+ }
g_signal_handlers_disconnect_by_func (self->selection, rows_changed_cb, self);
g_signal_handlers_disconnect_by_func (self->filter_model, rows_changed_cb, self);
+ g_signal_handlers_disconnect_by_func (self->filter_model, update_spinner, self);
self->filter_func = NULL;
g_clear_pointer (&self->filter_data, self->filter_data_destroy);
@@ -1237,6 +1247,56 @@ setup_language_list (GtkFontChooserWidget *self)
g_object_unref (factory);
}
+static gboolean
+show_spinner (gpointer data)
+{
+ GtkFontChooserWidget *self = data;
+
+ gtk_spinner_set_spinning (GTK_SPINNER (self->spinner), TRUE);
+ gtk_widget_set_child_visible (self->spinner, TRUE);
+
+ self->spinner_timeout = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+update_spinner (GtkFontChooserWidget *self)
+{
+ guint pending = gtk_filter_list_model_get_pending (self->filter_model);
+
+ if (pending != 0)
+ {
+ if (!self->spinner_timeout)
+ self->spinner_timeout = g_timeout_add (250, show_spinner, self);
+ }
+ else
+ {
+ if (self->spinner_timeout)
+ {
+ g_source_remove (self->spinner_timeout);
+ self->spinner_timeout = 0;
+ }
+ gtk_spinner_set_spinning (GTK_SPINNER (self->spinner), FALSE);
+ gtk_widget_set_child_visible (self->spinner, FALSE);
+ }
+}
+
+static void
+setup_search_entry (GtkFontChooserWidget *self)
+{
+ /* A bit nasty, we insert our spinner into the search entry */
+ self->spinner = gtk_spinner_new ();
+ gtk_widget_set_margin_end (self->spinner, 10);
+ gtk_widget_set_child_visible (self->spinner, FALSE);
+ gtk_widget_insert_before (self->spinner,
+ self->search_entry,
+ gtk_widget_get_last_child (self->search_entry));
+
+ g_signal_connect_swapped (self->filter_model, "notify::pending",
+ G_CALLBACK (update_spinner), self);
+}
+
static void
gtk_font_chooser_widget_init (GtkFontChooserWidget *self)
{
@@ -1276,6 +1336,7 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *self)
gtk_custom_filter_set_filter_func (self->user_filter, user_filter_cb, self, NULL);
setup_language_list (self);
+ setup_search_entry (self);
}
/**