From c9c7e91db9f42d36dfbe98bc1f16e6325d3a437c Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 12 Dec 2011 18:10:04 +0100 Subject: [PATCH] a11y: Improve treeview's add/remove_selection() --- gtk/a11y/gtktreeviewaccessible.c | 131 ++++++++++--------------------- 1 file changed, 42 insertions(+), 89 deletions(-) diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c index e0255f2808..82c3b4bbc5 100644 --- a/gtk/a11y/gtktreeviewaccessible.c +++ b/gtk/a11y/gtktreeviewaccessible.c @@ -54,9 +54,6 @@ static gboolean focus_out (GtkWidget *widget); /* Misc */ -static void set_iter_nth_row (GtkTreeView *tree_view, - GtkTreeIter *iter, - gint row); static int cell_info_get_index (GtkTreeView *tree_view, GtkTreeViewAccessibleCellInfo *info); static gboolean update_cell_value (GtkRendererCellAccessible *renderer_cell, @@ -885,62 +882,64 @@ static gboolean gtk_tree_view_accessible_add_row_selection (AtkTable *table, gint row) { - GtkWidget *widget; - GtkTreeView *tree_view; - GtkTreeModel *tree_model; - GtkTreeSelection *selection; - GtkTreePath *tree_path; - GtkTreeIter iter_to_row; + GtkTreeView *treeview; + GtkTreePath *path; + GtkRBTree *tree; + GtkRBNode *node; - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (table)); - if (widget == NULL) + if (row < 0) return FALSE; - if (!gtk_tree_view_accessible_is_row_selected (table, row)) - { - tree_view = GTK_TREE_VIEW (widget); - tree_model = gtk_tree_view_get_model (tree_view); - selection = gtk_tree_view_get_selection (tree_view); + treeview = GTK_TREE_VIEW (gtk_accessible_get_widget (GTK_ACCESSIBLE (table))); + if (treeview == NULL) + return FALSE; - if (gtk_tree_model_get_flags (tree_model) & GTK_TREE_MODEL_LIST_ONLY) - { - tree_path = gtk_tree_path_new (); - gtk_tree_path_append_index (tree_path, row); - gtk_tree_selection_select_path (selection,tree_path); - gtk_tree_path_free (tree_path); - } - else - { - set_iter_nth_row (tree_view, &iter_to_row, row); - gtk_tree_selection_select_iter (selection, &iter_to_row); - } - } + if (!_gtk_rbtree_find_index (_gtk_tree_view_get_rbtree (treeview), + row, + &tree, + &node)) + return FALSE; - return gtk_tree_view_accessible_is_row_selected (table, row); + if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED)) + return FALSE; + + path = _gtk_tree_path_new_from_rbtree (tree, node); + gtk_tree_selection_select_path (gtk_tree_view_get_selection (treeview), path); + gtk_tree_path_free (path); + + return TRUE; } static gboolean gtk_tree_view_accessible_remove_row_selection (AtkTable *table, gint row) { - GtkWidget *widget; - GtkTreeView *tree_view; - GtkTreeSelection *selection; + GtkTreeView *treeview; + GtkTreePath *path; + GtkRBTree *tree; + GtkRBNode *node; - widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (table)); - if (widget == NULL) + if (row < 0) return FALSE; - tree_view = GTK_TREE_VIEW (widget); - selection = gtk_tree_view_get_selection (tree_view); + treeview = GTK_TREE_VIEW (gtk_accessible_get_widget (GTK_ACCESSIBLE (table))); + if (treeview == NULL) + return FALSE; - if (gtk_tree_view_accessible_is_row_selected (table, row)) - { - gtk_tree_selection_unselect_all (selection); - return TRUE; - } + if (!_gtk_rbtree_find_index (_gtk_tree_view_get_rbtree (treeview), + row, + &tree, + &node)) + return FALSE; - return FALSE; + if (! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED)) + return FALSE; + + path = _gtk_tree_path_new_from_rbtree (tree, node); + gtk_tree_selection_unselect_path (gtk_tree_view_get_selection (treeview), path); + gtk_tree_path_free (path); + + return TRUE; } static AtkObject * @@ -1779,52 +1778,6 @@ update_cell_value (GtkRendererCellAccessible *renderer_cell, /* Misc Private */ -/* Helper recursive function that returns an iter to nth row - */ -static GtkTreeIter * -return_iter_nth_row (GtkTreeView *tree_view, - GtkTreeModel *tree_model, - GtkTreeIter *iter, - gint increment, - gint row) -{ - GtkTreePath *current_path; - GtkTreeIter new_iter; - gboolean row_expanded; - - current_path = gtk_tree_model_get_path (tree_model, iter); - if (increment == row) - { - gtk_tree_path_free (current_path); - return iter; - } - - row_expanded = gtk_tree_view_row_expanded (tree_view, current_path); - gtk_tree_path_free (current_path); - - new_iter = *iter; - if ((row_expanded && gtk_tree_model_iter_children (tree_model, iter, &new_iter)) || - (gtk_tree_model_iter_next (tree_model, iter)) || - (gtk_tree_model_iter_parent (tree_model, iter, &new_iter) && - (gtk_tree_model_iter_next (tree_model, iter)))) - return return_iter_nth_row (tree_view, tree_model, iter, - ++increment, row); - - return NULL; -} - -static void -set_iter_nth_row (GtkTreeView *tree_view, - GtkTreeIter *iter, - gint row) -{ - GtkTreeModel *tree_model; - - tree_model = gtk_tree_view_get_model (tree_view); - gtk_tree_model_get_iter_first (tree_model, iter); - iter = return_iter_nth_row (tree_view, tree_model, iter, 0, row); -} - static void cell_destroyed (gpointer data) {