[libadwaita/wip/exalm/expander: 3/3] expander-row: Fix focus




commit 6cfd3f8c310e6652862b1f8053ff0dd030bd2106
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Tue Jan 18 13:42:45 2022 +0500

    expander-row: Fix focus
    
    Fixes https://gitlab.gnome.org/GNOME/libadwaita/-/issues/391

 src/adw-expander-row.c  | 37 +++++++++++++++++++++++++++++--------
 src/adw-expander-row.ui |  2 ++
 2 files changed, 31 insertions(+), 8 deletions(-)
---
diff --git a/src/adw-expander-row.c b/src/adw-expander-row.c
index 3ba175a9..60eb6776 100644
--- a/src/adw-expander-row.c
+++ b/src/adw-expander-row.c
@@ -9,6 +9,7 @@
 
 #include "adw-action-row.h"
 #include "adw-macros-private.h"
+#include "adw-widget-utils-private.h"
 
 /**
  * AdwExpanderRow:
@@ -81,6 +82,30 @@ enum {
 
 static GParamSpec *props[LAST_PROP];
 
+static void
+activate_cb (AdwExpanderRow *self)
+{
+  AdwExpanderRowPrivate *priv = adw_expander_row_get_instance_private (self);
+
+  adw_expander_row_set_expanded (self, !priv->expanded);
+}
+
+static gboolean
+keynav_failed_cb (AdwExpanderRow   *self,
+                  GtkDirectionType  direction)
+{
+  GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (self)));
+
+  if (!toplevel)
+    return FALSE;
+
+  if (direction != GTK_DIR_UP && direction != GTK_DIR_DOWN)
+    return FALSE;
+
+  return gtk_widget_child_focus (toplevel, direction == GTK_DIR_UP ?
+                                 GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD);
+}
+
 static void
 adw_expander_row_get_property (GObject    *object,
                                guint       prop_id,
@@ -139,14 +164,6 @@ adw_expander_row_set_property (GObject      *object,
   }
 }
 
-static void
-activate_cb (AdwExpanderRow *self)
-{
-  AdwExpanderRowPrivate *priv = adw_expander_row_get_instance_private (self);
-
-  adw_expander_row_set_expanded (self, !priv->expanded);
-}
-
 static void
 adw_expander_row_class_init (AdwExpanderRowClass *klass)
 {
@@ -156,6 +173,9 @@ adw_expander_row_class_init (AdwExpanderRowClass *klass)
   object_class->get_property = adw_expander_row_get_property;
   object_class->set_property = adw_expander_row_set_property;
 
+  widget_class->focus = adw_widget_focus_child;
+  widget_class->grab_focus = adw_widget_grab_focus_child;
+
   /**
    * AdwExpanderRow:subtitle: (attributes org.gtk.Property.get=adw_expander_row_get_subtitle 
org.gtk.Property.set=adw_expander_row_set_subtitle)
    *
@@ -237,6 +257,7 @@ adw_expander_row_class_init (AdwExpanderRowClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, AdwExpanderRow, image);
   gtk_widget_class_bind_template_child_private (widget_class, AdwExpanderRow, enable_switch);
   gtk_widget_class_bind_template_callback (widget_class, activate_cb);
+  gtk_widget_class_bind_template_callback (widget_class, keynav_failed_cb);
 }
 
 #define NOTIFY(func, prop) \
diff --git a/src/adw-expander-row.ui b/src/adw-expander-row.ui
index 58fe456b..9f59d3e1 100644
--- a/src/adw-expander-row.ui
+++ b/src/adw-expander-row.ui
@@ -18,6 +18,7 @@
                  by clicking it or via keyboard. Activating the row should
                  toggle its expansion. -->
             <signal name="row-activated" handler="activate_cb" after="yes" swapped="yes"/>
+            <signal name="keynav-failed" handler="keynav_failed_cb" swapped="yes"/>
             <child>
               <object class="AdwActionRow" id="action_row">
                 <!-- The header row must be activatable to toggle expansion by
@@ -64,6 +65,7 @@
             <child>
               <object class="GtkListBox" id="list">
                 <property name="selection-mode">none</property>
+                <signal name="keynav-failed" handler="keynav_failed_cb" swapped="yes"/>
                 <style>
                   <class name="nested"/>
                 </style>


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