From e245883f911bb2f9d1df6beaeb7edd332f797990 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Fernandes?= Date: Wed, 21 Jun 2023 10:24:54 +0100 Subject: [PATCH] columnviewrow: Add accessible-label and -description Echoing the same changes introduced for GtkListItem by these commits: * df8d28f5fead251b725cf4cfe7d6da7cc429eb21 * f2b682dd9cd87b3b4cd2f1f662c5a06624b294a2 Resolves https://gitlab.gnome.org/GNOME/gtk/-/issues/5903 --- gtk/gtkcolumnviewcellwidget.c | 3 + gtk/gtkcolumnviewrow.c | 145 ++++++++++++++++++++++++++++++++++ gtk/gtkcolumnviewrow.h | 10 +++ gtk/gtkcolumnviewrowprivate.h | 3 + gtk/gtkcolumnviewrowwidget.c | 5 ++ 5 files changed, 166 insertions(+) diff --git a/gtk/gtkcolumnviewcellwidget.c b/gtk/gtkcolumnviewcellwidget.c index eb3ab7835e..d34f4195b8 100644 --- a/gtk/gtkcolumnviewcellwidget.c +++ b/gtk/gtkcolumnviewcellwidget.c @@ -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, diff --git a/gtk/gtkcolumnviewrow.c b/gtk/gtkcolumnviewrow.c index 1570d626a0..23aac2a701 100644 --- a/gtk/gtkcolumnviewrow.c +++ b/gtk/gtkcolumnviewrow.c @@ -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]); +} diff --git a/gtk/gtkcolumnviewrow.h b/gtk/gtkcolumnviewrow.h index 99fb7c9a7b..05f2cbbaa9 100644 --- a/gtk/gtkcolumnviewrow.h +++ b/gtk/gtkcolumnviewrow.h @@ -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 diff --git a/gtk/gtkcolumnviewrowprivate.h b/gtk/gtkcolumnviewrowprivate.h index 4370231884..5882f61bc2 100644 --- a/gtk/gtkcolumnviewrowprivate.h +++ b/gtk/gtkcolumnviewrowprivate.h @@ -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; diff --git a/gtk/gtkcolumnviewrowwidget.c b/gtk/gtkcolumnviewrowwidget.c index 62cec81b0e..c5f3731e54 100644 --- a/gtk/gtkcolumnviewrowwidget.c +++ b/gtk/gtkcolumnviewrowwidget.c @@ -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,