[tepl] LanguageChooserWidget: handle ::key-press-event on the GtkSearchEntry
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] LanguageChooserWidget: handle ::key-press-event on the GtkSearchEntry
- Date: Wed, 4 Nov 2020 16:43:10 +0000 (UTC)
commit f3d944174816a98d072aac96370b4aa11dc9db9e
Author: Sébastien Wilmet <swilmet gnome org>
Date: Tue Nov 3 21:57:06 2020 +0100
LanguageChooserWidget: handle ::key-press-event on the GtkSearchEntry
tepl/tepl-language-chooser-widget.c | 91 +++++++++++++++++++++++++++++++++++++
1 file changed, 91 insertions(+)
---
diff --git a/tepl/tepl-language-chooser-widget.c b/tepl/tepl-language-chooser-widget.c
index f27ed5d..281f540 100644
--- a/tepl/tepl-language-chooser-widget.c
+++ b/tepl/tepl-language-chooser-widget.c
@@ -292,6 +292,92 @@ list_box_row_activated_cb (GtkListBox *list_box,
emit_language_activated_for_row (chooser_widget, list_box_row);
}
+static void
+move_selection (TeplLanguageChooserWidget *chooser_widget,
+ gint how_many)
+{
+ GtkListBoxRow *selected_row;
+ GtkListBoxRow **filtered_children = NULL;
+ gint n_filtered_children;
+ gint pos;
+ gint selected_row_pos = 0;
+ gboolean found = FALSE;
+ gint new_row_to_select_pos;
+ GtkListBoxRow *new_row_to_select;
+
+ selected_row = gtk_list_box_get_selected_row (chooser_widget->priv->list_box);
+ if (selected_row == NULL || !filter_cb (selected_row, chooser_widget))
+ {
+ select_first_row (chooser_widget);
+ return;
+ }
+
+ filtered_children = tepl_utils_list_box_get_filtered_children (chooser_widget->priv->list_box,
+ filter_cb,
+ chooser_widget,
+ &n_filtered_children);
+
+ if (filtered_children == NULL)
+ {
+ goto out;
+ }
+
+ for (pos = 0; filtered_children[pos] != NULL; pos++)
+ {
+ GtkListBoxRow *cur_row = filtered_children[pos];
+
+ if (cur_row == selected_row)
+ {
+ selected_row_pos = pos;
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ g_warn_if_reached ();
+ goto out;
+ }
+
+ new_row_to_select_pos = selected_row_pos + how_many;
+ new_row_to_select_pos = CLAMP (new_row_to_select_pos, 0, n_filtered_children - 1);
+ new_row_to_select = filtered_children[new_row_to_select_pos];
+ gtk_list_box_select_row (chooser_widget->priv->list_box, new_row_to_select);
+
+out:
+ g_free (filtered_children);
+}
+
+static gboolean
+search_entry_key_press_event_cb (GtkWidget *search_entry,
+ GdkEventKey *event,
+ TeplLanguageChooserWidget *chooser_widget)
+{
+ if (event->keyval == GDK_KEY_Down)
+ {
+ move_selection (chooser_widget, 1);
+ return GDK_EVENT_STOP;
+ }
+ else if (event->keyval == GDK_KEY_Up)
+ {
+ move_selection (chooser_widget, -1);
+ return GDK_EVENT_STOP;
+ }
+ else if (event->keyval == GDK_KEY_Page_Down)
+ {
+ move_selection (chooser_widget, 5);
+ return GDK_EVENT_STOP;
+ }
+ else if (event->keyval == GDK_KEY_Page_Up)
+ {
+ move_selection (chooser_widget, -5);
+ return GDK_EVENT_STOP;
+ }
+
+ return GDK_EVENT_PROPAGATE;
+}
+
static void
tepl_language_chooser_widget_init (TeplLanguageChooserWidget *chooser_widget)
{
@@ -337,6 +423,11 @@ tepl_language_chooser_widget_init (TeplLanguageChooserWidget *chooser_widget)
G_CALLBACK (search_entry_activate_cb),
chooser_widget);
+ g_signal_connect (chooser_widget->priv->search_entry,
+ "key-press-event",
+ G_CALLBACK (search_entry_key_press_event_cb),
+ chooser_widget);
+
g_signal_connect (chooser_widget->priv->list_box,
"row-activated",
G_CALLBACK (list_box_row_activated_cb),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]