[gtk/emoji-keynav: 2/5] emojichooser: Improve keynav, again



commit 7179e8d5f30a380a186f50e356e1c8036d997ac4
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Apr 13 21:44:09 2020 -0400

    emojichooser: Improve keynav, again
    
    When the focus is moved to one of the Emoji children,
    scroll it into view.

 gtk/gtkemojichooser.c | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
---
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index fbef8b6c77..57c92cb735 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -120,6 +120,16 @@ gtk_emoji_chooser_child_focus (GtkWidget        *widget,
   return GTK_WIDGET_CLASS (gtk_emoji_chooser_child_parent_class)->focus (widget, direction);
 }
 
+static void scroll_to_child (GtkWidget *child);
+
+static gboolean
+gtk_emoji_chooser_child_grab_focus (GtkWidget *widget)
+{
+  gtk_widget_grab_focus_self (widget);
+  scroll_to_child (widget);
+  return TRUE;
+}
+
 static void show_variations (GtkEmojiChooser *chooser,
                              GtkWidget       *child);
 
@@ -141,6 +151,7 @@ gtk_emoji_chooser_child_class_init (GtkEmojiChooserChildClass *class)
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
   widget_class->size_allocate = gtk_emoji_chooser_child_size_allocate;
   widget_class->focus = gtk_emoji_chooser_child_focus;
+  widget_class->grab_focus = gtk_emoji_chooser_child_grab_focus;
 
   gtk_widget_class_install_action (widget_class, "menu.popup", NULL, gtk_emoji_chooser_child_popup_menu);
 
@@ -236,6 +247,33 @@ scroll_to_section (EmojiSection *section)
   gtk_adjustment_animate_to_value (adj, alloc.y - BOX_SPACE);
 }
 
+static void
+scroll_to_child (GtkWidget *child)
+{
+  GtkEmojiChooser *chooser;
+  GtkAdjustment *adj;
+  GtkAllocation alloc;
+  int pos;
+  double value;
+  double page_size;
+
+  chooser = GTK_EMOJI_CHOOSER (gtk_widget_get_ancestor (child, GTK_TYPE_EMOJI_CHOOSER));
+
+  adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (chooser->scrolled_window));
+
+  gtk_widget_get_allocation (child, &alloc);
+
+  value = gtk_adjustment_get_value (adj);
+  page_size = gtk_adjustment_get_page_size (adj);
+
+  gtk_widget_translate_coordinates (child, gtk_widget_get_parent (chooser->recent.box), 0, 0, NULL, &pos);
+
+  if (pos < value)
+    gtk_adjustment_animate_to_value (adj, pos);
+  else if (pos + alloc.height >= value + page_size)
+    gtk_adjustment_animate_to_value (adj, value + ((pos + alloc.height) - (value + page_size)));
+}
+
 static void
 add_emoji (GtkWidget    *box,
            gboolean      prepend,


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