[gtk+] a11y: Move relationset updating to new vfunc
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] a11y: Move relationset updating to new vfunc
- Date: Mon, 24 Mar 2014 15:38:43 +0000 (UTC)
commit be7380a418a17592df3221880416286752543598
Author: Benjamin Otte <otte redhat com>
Date: Mon Mar 24 16:34:08 2014 +0100
a11y: Move relationset updating to new vfunc
This way, we don't create lots of cell accessibles when creating the
first one (because surely one is the parent/child of another who again
is a parent/child of another who again....)
gtk/a11y/gtktreeviewaccessible.c | 91 ++++++++++++++++++++++++++++----------
1 files changed, 68 insertions(+), 23 deletions(-)
---
diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c
index 5a5b11a..4718017 100644
--- a/gtk/a11y/gtktreeviewaccessible.c
+++ b/gtk/a11y/gtktreeviewaccessible.c
@@ -427,29 +427,6 @@ create_cell (GtkTreeView *treeview,
set_cell_data (treeview, accessible, cell);
_gtk_cell_accessible_update_cache (cell);
- if (gtk_tree_view_get_expander_column (treeview) == column)
- {
- AtkRelationSet *relation_set;
- AtkRelation* relation;
- AtkObject *parent_node;
-
- relation_set = atk_object_ref_relation_set (ATK_OBJECT (cell));
-
- if (tree->parent_tree)
- {
- parent_node = ATK_OBJECT (peek_cell (accessible, tree->parent_tree, tree->parent_node, column));
- if (parent_node == NULL)
- parent_node = ATK_OBJECT (create_cell (treeview, accessible, tree->parent_tree,
tree->parent_node, column));
- }
- else
- parent_node = ATK_OBJECT (accessible);
- relation = atk_relation_new (&parent_node, 1, ATK_RELATION_NODE_CHILD_OF);
- atk_relation_set_add (relation_set, relation);
- atk_object_add_relationship (parent_node, ATK_RELATION_NODE_PARENT_OF, ATK_OBJECT (cell));
- g_object_unref (relation);
- g_object_unref (relation_set);
- }
-
return cell;
}
@@ -1355,6 +1332,73 @@ gtk_tree_view_accessible_edit (GtkCellAccessibleParent *parent,
}
static void
+gtk_tree_view_accessible_update_relationset (GtkCellAccessibleParent *parent,
+ GtkCellAccessible *cell,
+ AtkRelationSet *relationset)
+{
+ GtkTreeViewAccessibleCellInfo *cell_info;
+ GtkTreeViewAccessible *accessible;
+ GtkTreeViewColumn *column;
+ GtkTreeView *treeview;
+ AtkRelation *relation;
+ GtkRBTree *tree;
+ GtkRBNode *node;
+ AtkObject *object;
+
+ /* Don't set relations on cells that aren't direct descendants of the treeview.
+ * So only set it on the container, not on the renderer accessibles */
+ if (atk_object_get_parent (ATK_OBJECT (cell)) != ATK_OBJECT (parent))
+ return;
+
+ accessible = GTK_TREE_VIEW_ACCESSIBLE (parent);
+ cell_info = find_cell_info (accessible, cell);
+ if (!cell_info)
+ return;
+
+ /* only set parent/child rows on the expander column */
+ treeview = GTK_TREE_VIEW (gtk_accessible_get_widget (GTK_ACCESSIBLE (parent)));
+ column = gtk_tree_view_get_expander_column (treeview);
+ if (column != cell_info->cell_col_ref)
+ return;
+
+ /* Update CHILD_OF relation to parent cell */
+ relation = atk_relation_set_get_relation_by_type (relationset, ATK_RELATION_NODE_CHILD_OF);
+ if (relation)
+ atk_relation_set_remove (relationset, relation);
+
+ if (cell_info->tree->parent_tree)
+ {
+ object = ATK_OBJECT (peek_cell (accessible, cell_info->tree->parent_tree,
cell_info->tree->parent_node, column));
+ if (object == NULL)
+ object = ATK_OBJECT (create_cell (treeview, accessible, cell_info->tree->parent_tree,
cell_info->tree->parent_node, column));
+ }
+ else
+ object = ATK_OBJECT (accessible);
+
+ atk_relation_set_add_relation_by_type (relationset, ATK_RELATION_NODE_CHILD_OF, object);
+
+ /* Update PARENT_OF relation for all child cells */
+ relation = atk_relation_set_get_relation_by_type (relationset, ATK_RELATION_NODE_PARENT_OF);
+ if (relation)
+ atk_relation_set_remove (relationset, relation);
+
+ tree = cell_info->node->children;
+ if (tree)
+ {
+ for (node = _gtk_rbtree_first (tree);
+ node != NULL;
+ node = _gtk_rbtree_next (tree, node))
+ {
+ object = ATK_OBJECT (peek_cell (accessible, tree, node, column));
+ if (object == NULL)
+ object = ATK_OBJECT (create_cell (treeview, accessible, tree, node, column));
+
+ atk_relation_set_add_relation_by_type (relationset, ATK_RELATION_NODE_PARENT_OF, ATK_OBJECT
(object));
+ }
+ }
+}
+
+static void
gtk_cell_accessible_parent_interface_init (GtkCellAccessibleParentIface *iface)
{
iface->get_cell_extents = gtk_tree_view_accessible_get_cell_extents;
@@ -1365,6 +1409,7 @@ gtk_cell_accessible_parent_interface_init (GtkCellAccessibleParentIface *iface)
iface->expand_collapse = gtk_tree_view_accessible_expand_collapse;
iface->activate = gtk_tree_view_accessible_activate;
iface->edit = gtk_tree_view_accessible_edit;
+ iface->update_relationset = gtk_tree_view_accessible_update_relationset;
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]