columnviewrow: Add accessible-label and -description
authorAntónio Fernandes <antoniof@gnome.org>
Wed, 21 Jun 2023 09:24:54 +0000 (10:24 +0100)
committerAntónio Fernandes <antoniof@gnome.org>
Wed, 21 Jun 2023 09:27:39 +0000 (10:27 +0100)
Echoing the same changes introduced for GtkListItem by these commits:
df8d28f5fead251b725cf4cfe7d6da7cc429eb21
f2b682dd9cd87b3b4cd2f1f662c5a06624b294a2

Resolves https://gitlab.gnome.org/GNOME/gtk/-/issues/5903

gtk/gtkcolumnviewcellwidget.c
gtk/gtkcolumnviewrow.c
gtk/gtkcolumnviewrow.h
gtk/gtkcolumnviewrowprivate.h
gtk/gtkcolumnviewrowwidget.c

index eb3ab7835e3226b064e808a315cad0907fd4c656..d34f4195b85c5fe273c55d910b0abb5349094fb8 100644 (file)
@@ -156,6 +156,9 @@ gtk_column_view_cell_widget_teardown_object (GtkListFactoryWidget *fw,
 
   gtk_widget_set_focusable (GTK_WIDGET (self), FALSE);
 
+  gtk_accessible_reset_property (GTK_ACCESSIBLE (self), GTK_ACCESSIBLE_PROPERTY_LABEL);
+  gtk_accessible_reset_property (GTK_ACCESSIBLE (self), GTK_ACCESSIBLE_PROPERTY_DESCRIPTION);
+
   gtk_column_view_cell_do_notify (cell,
                                   gtk_list_item_base_get_item (GTK_LIST_ITEM_BASE (self)) != NULL,
                                   gtk_list_item_base_get_position (GTK_LIST_ITEM_BASE (self)) != GTK_INVALID_LIST_POSITION,
index 1570d626a05abd9e6aec0fe1974115ef38b6102c..23aac2a70188fb98a772f77e631a4cda4c840c5c 100644 (file)
@@ -20,6 +20,7 @@
 #include "config.h"
 
 #include "gtkcolumnviewrowprivate.h"
+#include "gtkaccessible.h"
 
 
 /**
@@ -42,6 +43,8 @@ struct _GtkColumnViewRowClass
 enum
 {
   PROP_0,
+  PROP_ACCESSIBLE_DESCRIPTION,
+  PROP_ACCESSIBLE_LABEL,
   PROP_ACTIVATABLE,
   PROP_FOCUSABLE,
   PROP_ITEM,
@@ -56,6 +59,17 @@ G_DEFINE_TYPE (GtkColumnViewRow, gtk_column_view_row, G_TYPE_OBJECT)
 
 static GParamSpec *properties[N_PROPS] = { NULL, };
 
+static void
+gtk_column_view_row_dispose (GObject *object)
+{
+  GtkColumnViewRow *self = GTK_COLUMN_VIEW_ROW (object);
+
+  g_clear_pointer (&self->accessible_description, g_free);
+  g_clear_pointer (&self->accessible_label, g_free);
+
+  G_OBJECT_CLASS (gtk_column_view_row_parent_class)->dispose (object);
+}
+
 static void
 gtk_column_view_row_get_property (GObject    *object,
                                   guint       property_id,
@@ -66,6 +80,14 @@ gtk_column_view_row_get_property (GObject    *object,
 
   switch (property_id)
     {
+    case PROP_ACCESSIBLE_DESCRIPTION:
+      g_value_set_string (value, self->accessible_description);
+      break;
+
+    case PROP_ACCESSIBLE_LABEL:
+      g_value_set_string (value, self->accessible_label);
+      break;
+
     case PROP_ACTIVATABLE:
       g_value_set_boolean (value, self->activatable);
       break;
@@ -113,6 +135,14 @@ gtk_column_view_row_set_property (GObject      *object,
 
   switch (property_id)
     {
+    case PROP_ACCESSIBLE_DESCRIPTION:
+      gtk_column_view_row_set_accessible_description (self, g_value_get_string (value));
+      break;
+
+    case PROP_ACCESSIBLE_LABEL:
+      gtk_column_view_row_set_accessible_label (self, g_value_get_string (value));
+      break;
+
     case PROP_ACTIVATABLE:
       gtk_column_view_row_set_activatable (self, g_value_get_boolean (value));
       break;
@@ -136,9 +166,34 @@ gtk_column_view_row_class_init (GtkColumnViewRowClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 
+  gobject_class->dispose = gtk_column_view_row_dispose;
   gobject_class->get_property = gtk_column_view_row_get_property;
   gobject_class->set_property = gtk_column_view_row_set_property;
 
+  /**
+   * GtkColumnViewRow:accessible-description: (attributes org.gtk.Property.get=gtk_column_view_row_get_accessible_description org.gtk.Property.set=gtk_column_view_row_set_accessible_description)
+   *
+   * The accessible description to set on the row.
+   *
+   * Since: 4.12
+   */
+  properties[PROP_ACCESSIBLE_DESCRIPTION] =
+    g_param_spec_string ("accessible-description", NULL, NULL,
+                         NULL,
+                         G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
+  /**
+   * GtkColumnViewRow:accessible-label: (attributes org.gtk.Property.get=gtk_column_view_row_get_accessible_label org.gtk.Property.set=gtk_column_view_row_set_accessible_label)
+   *
+   * The accessible label to set on the row.
+   *
+   * Since: 4.12
+   */
+  properties[PROP_ACCESSIBLE_LABEL] =
+    g_param_spec_string ("accessible-label", NULL, NULL,
+                         NULL,
+                         G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+
   /**
    * GtkColumnViewRow:activatable: (attributes org.gtk.Property.get=gtk_column_view_row_get_activatable org.gtk.Property.set=gtk_column_view_row_set_activatable)
    *
@@ -475,3 +530,93 @@ gtk_column_view_row_set_focusable (GtkColumnViewRow *self,
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_FOCUSABLE]);
 }
+
+/**
+ * gtk_column_view_row_get_accessible_description:
+ * @self: a `GtkColumnViewRow`
+ *
+ * Gets the accessible description of @self.
+ *
+ * Returns: the accessible description
+ *
+ * Since: 4.12
+ */
+const char *
+gtk_column_view_row_get_accessible_description (GtkColumnViewRow *self)
+{
+  g_return_val_if_fail (GTK_IS_COLUMN_VIEW_ROW (self), NULL);
+
+  return self->accessible_description;
+}
+
+/**
+ * gtk_column_view_row_set_accessible_description:
+ * @self: a `GtkColumnViewRow`
+ * @description: the description
+ *
+ * Sets the accessible description for the row,
+ * which may be used by e.g. screen readers.
+ *
+ * Since: 4.12
+ */
+void
+gtk_column_view_row_set_accessible_description (GtkColumnViewRow *self,
+                                                const char       *description)
+{
+  g_return_if_fail (GTK_IS_COLUMN_VIEW_ROW (self));
+
+  if (!g_set_str (&self->accessible_description, description))
+    return;
+
+  if (self->owner)
+    gtk_accessible_update_property (GTK_ACCESSIBLE (self->owner),
+                                    GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, self->accessible_description,
+                                    -1);
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ACCESSIBLE_DESCRIPTION]);
+}
+
+/**
+ * gtk_column_view_row_get_accessible_label:
+ * @self: a `GtkColumnViewRow`
+ *
+ * Gets the accessible label of @self.
+ *
+ * Returns: the accessible label
+ *
+ * Since: 4.12
+ */
+const char *
+gtk_column_view_row_get_accessible_label (GtkColumnViewRow *self)
+{
+  g_return_val_if_fail (GTK_IS_COLUMN_VIEW_ROW (self), NULL);
+
+  return self->accessible_label;
+}
+
+/**
+ * gtk_column_view_row_set_accessible_label:
+ * @self: a `GtkColumnViewRow`
+ * @label: the label
+ *
+ * Sets the accessible label for the row,
+ * which may be used by e.g. screen readers.
+ *
+ * Since: 4.12
+ */
+void
+gtk_column_view_row_set_accessible_label (GtkColumnViewRow *self,
+                                    const char  *label)
+{
+  g_return_if_fail (GTK_IS_COLUMN_VIEW_ROW (self));
+
+  if (!g_set_str (&self->accessible_label, label))
+    return;
+
+  if (self->owner)
+    gtk_accessible_update_property (GTK_ACCESSIBLE (self->owner),
+                                    GTK_ACCESSIBLE_PROPERTY_LABEL, self->accessible_label,
+                                    -1);
+
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ACCESSIBLE_LABEL]);
+}
index 99fb7c9a7b2cd7f7e34f12de335a935c9cabd35a..05f2cbbaa9c10dda13f906885a1f9fd3869d299a 100644 (file)
@@ -52,6 +52,16 @@ gboolean        gtk_column_view_row_get_focusable               (GtkColumnViewRo
 GDK_AVAILABLE_IN_4_12
 void            gtk_column_view_row_set_focusable               (GtkColumnViewRow       *self,
                                                                  gboolean                focusable);
+GDK_AVAILABLE_IN_4_12
+const char *    gtk_column_view_row_get_accessible_description  (GtkColumnViewRow       *self);
+GDK_AVAILABLE_IN_4_12
+void            gtk_column_view_row_set_accessible_description  (GtkColumnViewRow       *self,
+                                                                 const char             *description);
+GDK_AVAILABLE_IN_4_12
+const char *    gtk_column_view_row_get_accessible_label        (GtkColumnViewRow       *self);
+GDK_AVAILABLE_IN_4_12
+void            gtk_column_view_row_set_accessible_label        (GtkColumnViewRow       *self,
+                                                                 const char             *label);
 
 G_END_DECLS
 
index 437023188449c481df6c3ebeb68ef2ef3338638c..5882f61bc24af5862b74be492ec9564b9315caba 100644 (file)
@@ -31,6 +31,9 @@ struct _GtkColumnViewRow
 
   GtkColumnViewRowWidget *owner; /* has a reference */
 
+  char *accessible_label;
+  char *accessible_description;
+
   guint activatable : 1;
   guint selectable : 1;
   guint focusable : 1;
index 62cec81b0e07c4c6ad29c5acfe10ae971d9d5287..c5f3731e54f89932b26eaafb5108299e510a9e07 100644 (file)
@@ -127,6 +127,11 @@ gtk_column_view_row_widget_setup_object (GtkListFactoryWidget *fw,
   gtk_list_factory_widget_set_selectable (fw, row->selectable);
   gtk_widget_set_focusable (GTK_WIDGET (self), row->focusable);
 
+  gtk_accessible_update_property (GTK_ACCESSIBLE (self),
+                                  GTK_ACCESSIBLE_PROPERTY_LABEL, row->accessible_label,
+                                  GTK_ACCESSIBLE_PROPERTY_DESCRIPTION, row->accessible_description,
+                                  -1);
+
   gtk_column_view_row_do_notify (row,
                                  gtk_list_item_base_get_item (GTK_LIST_ITEM_BASE (self)) != NULL,
                                  gtk_list_item_base_get_position (GTK_LIST_ITEM_BASE (self)) != GTK_INVALID_LIST_POSITION,