[fractal] session: Improve accessibility and focus



commit c11393e3f6c44925348e3667575b36e7e2f85dac
Author: Julian Sparber <julian sparber net>
Date:   Wed Apr 13 15:22:33 2022 +0000

    session: Improve accessibility and focus
    
    Fixes: https://gitlab.gnome.org/GNOME/fractal/-/issues/197
    
    Room history navigation isn't good yet, but this improves navigation by a lot.

 data/resources/ui/content-room-history.ui | 28 ++++++++++++++++++++++++++++
 data/resources/ui/content.ui              |  1 +
 data/resources/ui/room-title.ui           |  2 ++
 data/resources/ui/session.ui              |  4 ++--
 data/resources/ui/sidebar-item.ui         |  1 +
 data/resources/ui/sidebar.ui              | 14 ++++++++++++++
 src/session/content/room_history/mod.rs   |  1 +
 src/session/sidebar/mod.rs                | 21 ++++++++++++++++++++-
 src/session/sidebar/room_row.rs           |  2 ++
 src/window.rs                             |  2 +-
 10 files changed, 72 insertions(+), 4 deletions(-)
---
diff --git a/data/resources/ui/content-room-history.ui b/data/resources/ui/content-room-history.ui
index aeb7d0b88..9e06944b6 100644
--- a/data/resources/ui/content-room-history.ui
+++ b/data/resources/ui/content-room-history.ui
@@ -52,6 +52,9 @@
                   <object class="GtkButton" id="back">
                     <property name="icon-name">go-previous-symbolic</property>
                     <property name="action-name">content.go-back</property>
+                    <accessibility>
+                      <property name="label" translatable="yes">Back</property>
+                    </accessibility>
                   </object>
                 </property>
               </object>
@@ -74,11 +77,17 @@
               <object class="GtkMenuButton" id="room_menu">
                 <property name="icon-name">view-more-symbolic</property>
                 <property name="menu-model">room-menu-model</property>
+                <accessibility>
+                  <property name="label" translatable="yes">Room Settings</property>
+                </accessibility>
               </object>
             </child>
             <child type="end">
               <object class="GtkToggleButton" id="search_content_button">
                 <property name="icon-name">system-search-symbolic</property>
+                <accessibility>
+                  <property name="label" translatable="yes">Toggle Room History Search</property>
+                </accessibility>
               </object>
             </child>
           </object>
@@ -94,6 +103,9 @@
                 <child>
                   <object class="GtkSearchEntry"/>
                 </child>
+                <accessibility>
+                  <property name="label" translatable="yes">Room History Search</property>
+                </accessibility>
               </object>
             </property>
           </object>
@@ -233,6 +245,9 @@
                         <property name="markdown-enabled" bind-source="ContentRoomHistory" 
bind-property="markdown-enabled" bind-flags="sync-create | bidirectional"/>
                       </object>
                     </property>
+                    <accessibility>
+                      <property name="label" translatable="yes">Enable Markdown Formatting</property>
+                    </accessibility>
                   </object>
                 </child>
                 <child>
@@ -251,6 +266,9 @@
                             <property name="top-margin">7</property>
                             <property name="bottom-margin">7</property>
                             <property name="wrap-mode">word</property>
+                            <accessibility>
+                              <property name="label" translatable="yes">Message Entry</property>
+                            </accessibility>
                           </object>
                         </property>
                       </object>
@@ -263,6 +281,9 @@
                     <property name="direction">up</property>
                     <property name="icon-name">view-more-horizontal-symbolic</property>
                     <property name="menu-model">message-menu-model</property>
+                    <accessibility>
+                      <property name="label" translatable="yes">Open Message Menu</property>
+                    </accessibility>
                   </object>
                 </child>
                 <child>
@@ -270,6 +291,9 @@
                     <property name="valign">end</property>
                     <property name="icon-name">emoji-people-symbolic</property>
                     <property name="action-name">room-history.open-emoji</property>
+                    <accessibility>
+                      <property name="label" translatable="yes">Open Emoji Picker</property>
+                    </accessibility>
                   </object>
                 </child>
                 <child>
@@ -282,6 +306,9 @@
                       <class name="suggested-action"/>
                       <class name="circular"/>
                     </style>
+                    <accessibility>
+                      <property name="label" translatable="yes">Send Message</property>
+                    </accessibility>
                   </object>
                 </child>
               </object>
@@ -292,3 +319,4 @@
     </child>
   </template>
 </interface>
+
diff --git a/data/resources/ui/content.ui b/data/resources/ui/content.ui
index 8185b5aab..ae2ede06c 100644
--- a/data/resources/ui/content.ui
+++ b/data/resources/ui/content.ui
@@ -31,6 +31,7 @@
                 <property name="visible">True</property>
                 <property name="hexpand">True</property>
                 <property name="vexpand">True</property>
+                <property name="can-focus">False</property>
                 <property name="icon-name">empty-page</property>
                 <property name="title" translatable="yes">No Room Selected</property>
                 <property name="description" translatable="yes">Join a room to start chatting.</property>
diff --git a/data/resources/ui/room-title.ui b/data/resources/ui/room-title.ui
index 26718b2f4..04ef52cfa 100644
--- a/data/resources/ui/room-title.ui
+++ b/data/resources/ui/room-title.ui
@@ -8,6 +8,7 @@
         <property name="valign">center</property>
         <child>
           <object class="GtkLabel" id="title_label">
+            <property name="focusable">True</property>
             <property name="ellipsize">end</property>
             <property name="halign">center</property>
             <property name="wrap">False</property>
@@ -23,6 +24,7 @@
         </child>
         <child>
           <object class="GtkLabel" id="subtitle_label">
+            <property name="focusable">True</property>
             <property name="ellipsize">end</property>
             <property name="halign">center</property>
             <property name="wrap">False</property>
diff --git a/data/resources/ui/session.ui b/data/resources/ui/session.ui
index f7969d3ef..b67b69a56 100644
--- a/data/resources/ui/session.ui
+++ b/data/resources/ui/session.ui
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <template class="Session" parent="AdwBin">
-    <property name="focusable">true</property>
     <property name="child">
       <object class="GtkStack" id="stack">
         <property name="visible-child">content</property>
@@ -34,9 +33,10 @@
           </object>
         </child>
         <child>
-          <object class="MediaViewer" id="media_viewer" />
+          <object class="MediaViewer" id="media_viewer"/>
         </child>
       </object>
     </property>
   </template>
 </interface>
+
diff --git a/data/resources/ui/sidebar-item.ui b/data/resources/ui/sidebar-item.ui
index 8bbc4c632..c5db8d11c 100644
--- a/data/resources/ui/sidebar-item.ui
+++ b/data/resources/ui/sidebar-item.ui
@@ -3,6 +3,7 @@
   <template class="GtkListItem">
     <property name="child">
       <object class="SidebarRow">
+        <property name="can-focus">False</property>
         <binding name="list-row">
           <lookup name="item">GtkListItem</lookup>
         </binding>
diff --git a/data/resources/ui/sidebar.ui b/data/resources/ui/sidebar.ui
index 3943a1373..4dabb491a 100644
--- a/data/resources/ui/sidebar.ui
+++ b/data/resources/ui/sidebar.ui
@@ -37,6 +37,9 @@
                 <property name="popover">
                   <object class="AccountSwitcher" id="account_switcher"/>
                 </property>
+                <accessibility>
+                  <property name="label" translatable="yes">Switch Accounts</property>
+                </accessibility>
                 <style>
                   <class name="image-button"/>
                 </style>
@@ -56,6 +59,9 @@
               <object class="GtkMenuButton" id="appmenu_button">
                 <property name="icon-name">open-menu-symbolic</property>
                 <property name="menu-model">primary_menu</property>
+                <accessibility>
+                  <property name="label" translatable="yes">App Settings Menu</property>
+                </accessibility>
               </object>
             </child>
             <child type="end">
@@ -63,6 +69,9 @@
                 <property name="icon-name">system-search-symbolic</property>
                 <property name="active" bind-source="room_search" bind-property="search-mode-enabled" 
bind-flags="sync-create"/>
                 <property name="action-name">session.toggle-room-search</property>
+                <accessibility>
+                  <property name="label" translatable="yes">Toggle Room Search</property>
+                </accessibility>
               </object>
             </child>
           </object>
@@ -72,6 +81,10 @@
             <property name="child">
               <object class="GtkSearchEntry" id="room_search_entry"/>
             </property>
+            <accessibility>
+              <property name="label" translatable="yes">Room Search</property>
+              <property name="description" translatable="yes">Search for a room</property>
+            </accessibility>
           </object>
         </child>
         <child>
@@ -92,6 +105,7 @@
                 </property>
                 <accessibility>
                   <property name="label" translatable="yes">Sidebar</property>
+                  <property name="description" translatable="yes">Allows to navigate between rooms</property>
                 </accessibility>
               </object>
             </property>
diff --git a/src/session/content/room_history/mod.rs b/src/session/content/room_history/mod.rs
index 5493dcb42..2b32b174b 100644
--- a/src/session/content/room_history/mod.rs
+++ b/src/session/content/room_history/mod.rs
@@ -491,6 +491,7 @@ impl RoomHistory {
 
         priv_.listview.set_model(model.as_ref());
         priv_.is_loading.set(false);
+        priv_.message_entry.grab_focus();
         priv_.room.replace(room);
         self.update_view();
         self.start_loading();
diff --git a/src/session/sidebar/mod.rs b/src/session/sidebar/mod.rs
index 5ffb35839..c4e4d5596 100644
--- a/src/session/sidebar/mod.rs
+++ b/src/session/sidebar/mod.rs
@@ -228,7 +228,26 @@ mod imp {
         }
     }
 
-    impl WidgetImpl for Sidebar {}
+    impl WidgetImpl for Sidebar {
+        fn focus(&self, widget: &Self::Type, direction_type: gtk::DirectionType) -> bool {
+            // WORKAROUND: This works around the tab behavior `gtk::ListViews have`
+            // See: https://gitlab.gnome.org/GNOME/gtk/-/issues/4840
+            let focus_child = widget
+                .focus_child()
+                .and_then(|w| w.focus_child())
+                .and_then(|w| w.focus_child());
+            if focus_child.map_or(false, |w| w.is::<gtk::ListView>())
+                && matches!(
+                    direction_type,
+                    gtk::DirectionType::TabForward | gtk::DirectionType::TabBackward
+                )
+            {
+                false
+            } else {
+                self.parent_focus(widget, direction_type)
+            }
+        }
+    }
     impl BinImpl for Sidebar {}
 }
 
diff --git a/src/session/sidebar/room_row.rs b/src/session/sidebar/room_row.rs
index 1e7d20da0..53de48e2d 100644
--- a/src/session/sidebar/room_row.rs
+++ b/src/session/sidebar/room_row.rs
@@ -37,6 +37,8 @@ mod imp {
         fn class_init(klass: &mut Self::Class) {
             Self::bind_template(klass);
 
+            klass.set_accessible_role(gtk::AccessibleRole::Group);
+
             klass.install_action("room-row.accept-invite", None, move |widget, _, _| {
                 widget.room().unwrap().set_category(RoomType::Normal)
             });
diff --git a/src/window.rs b/src/window.rs
index 63cde6b73..a53fe7b5f 100644
--- a/src/window.rs
+++ b/src/window.rs
@@ -123,7 +123,7 @@ mod imp {
 
 glib::wrapper! {
     pub struct Window(ObjectSubclass<imp::Window>)
-        @extends gtk::Widget, gtk::Window, gtk::Root, gtk::ApplicationWindow, adw::ApplicationWindow, 
@implements gio::ActionMap, gio::ActionGroup;
+        @extends gtk::Widget, gtk::Window, gtk::Root, gtk::ApplicationWindow, adw::ApplicationWindow, 
@implements gtk::Accessible, gio::ActionMap, gio::ActionGroup;
 }
 
 impl Window {


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