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;
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);
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_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 */
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));
}
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)
* @self: a `GtkListView`
@@ -1064,15 +1077,31 @@ void
gtk_list_view_set_model (GtkListView *self,
GtkSelectionModel *model)
{
GtkSelectionModel *old_model;
g_return_if_fail (GTK_IS_LIST_VIEW (self));
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))
return;
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);
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]);
}