Compare commits

...

2 Commits

Author SHA1 Message Date
Matthias Clasen
594620c054 listview: Accessibility support
Set GTK_ACCESSIBLE_RELATION_ROW_COUNT on the listview,
and GTK_ACCESSIBLE_RELATION_ROW_INDEX on the listitemwidgets.
2023-06-17 08:50:09 -04:00
Matthias Clasen
c66577bd79 listview: Handle model being NULL
When updating accessible properties, don't stumble
over a NULL model.
2023-06-17 08:50:09 -04:00
3 changed files with 36 additions and 2 deletions

View File

@@ -1298,7 +1298,8 @@ gtk_grid_view_set_model (GtkGridView *self,
return; return;
gtk_accessible_update_property (GTK_ACCESSIBLE (self), gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE, GTK_IS_MULTI_SELECTION (model), GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE,
model ? GTK_IS_MULTI_SELECTION (model) : FALSE,
-1); -1);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]);

View File

@@ -90,6 +90,10 @@ gtk_list_item_base_update (GtkListItemBase *self,
GTK_LIST_ITEM_BASE_GET_CLASS (self)->update (self, position, item, selected); GTK_LIST_ITEM_BASE_GET_CLASS (self)->update (self, position, item, selected);
gtk_accessible_update_relation (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_RELATION_ROW_INDEX, position + 1,
-1);
/* don't look at selected variable, it's not reentrancy safe */ /* don't look at selected variable, it's not reentrancy safe */
if (was_selected != priv->selected) if (was_selected != priv->selected)
{ {

View File

@@ -1051,6 +1051,19 @@ gtk_list_view_get_model (GtkListView *self)
return gtk_list_base_get_model (GTK_LIST_BASE (self)); return gtk_list_base_get_model (GTK_LIST_BASE (self));
} }
static void
gtk_list_view_model_items_changed_cb (GListModel *model,
guint position,
guint removed,
guint added,
GtkListView *self)
{
gtk_accessible_update_relation (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_RELATION_ROW_COUNT,
g_list_model_get_n_items (model),
-1);
}
/** /**
* gtk_list_view_set_model: (attributes org.gtk.Method.set_property=model) * gtk_list_view_set_model: (attributes org.gtk.Method.set_property=model)
* @self: a `GtkListView` * @self: a `GtkListView`
@@ -1064,15 +1077,31 @@ void
gtk_list_view_set_model (GtkListView *self, gtk_list_view_set_model (GtkListView *self,
GtkSelectionModel *model) GtkSelectionModel *model)
{ {
GtkSelectionModel *old_model;
g_return_if_fail (GTK_IS_LIST_VIEW (self)); g_return_if_fail (GTK_IS_LIST_VIEW (self));
g_return_if_fail (model == NULL || GTK_IS_SELECTION_MODEL (model)); g_return_if_fail (model == NULL || GTK_IS_SELECTION_MODEL (model));
old_model = gtk_list_base_get_model (GTK_LIST_BASE (self));
if (old_model != NULL && old_model != model)
g_signal_handlers_disconnect_by_func (old_model, gtk_list_view_model_items_changed_cb, self);
if (!gtk_list_base_set_model (GTK_LIST_BASE (self), model)) if (!gtk_list_base_set_model (GTK_LIST_BASE (self), model))
return; return;
gtk_accessible_update_property (GTK_ACCESSIBLE (self), gtk_accessible_update_property (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE, GTK_IS_MULTI_SELECTION (model), GTK_ACCESSIBLE_PROPERTY_MULTI_SELECTABLE,
model ? GTK_IS_MULTI_SELECTION (model) : FALSE,
-1); -1);
gtk_accessible_update_relation (GTK_ACCESSIBLE (self),
GTK_ACCESSIBLE_RELATION_ROW_COUNT,
model ? g_list_model_get_n_items (G_LIST_MODEL (model)) : 0,
-1);
if (model != NULL)
g_signal_connect (model, "items-changed",
G_CALLBACK (gtk_list_view_model_items_changed_cb), self);
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MODEL]);
} }