From 82a9f6faa07d525353d8ae2da6f7709fe3ee7ffe Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 12 Dec 2011 15:30:47 +0100 Subject: [PATCH] treeview: Set expandable flag from treeview ... instead of trying to update it manually. --- gtk/a11y/gtktreeviewaccessible.c | 144 ------------------------------- gtk/gtktreeview.c | 10 ++- 2 files changed, 8 insertions(+), 146 deletions(-) diff --git a/gtk/a11y/gtktreeviewaccessible.c b/gtk/a11y/gtktreeviewaccessible.c index 4901e4f3f5..9fcc21e7bb 100644 --- a/gtk/a11y/gtktreeviewaccessible.c +++ b/gtk/a11y/gtktreeviewaccessible.c @@ -75,12 +75,6 @@ static gboolean update_cell_value (GtkRendererCellAccessib gboolean emit_change_signal); static gboolean is_cell_showing (GtkTreeView *tree_view, GdkRectangle *cell_rect); -static void set_expand_state (GtkTreeView *tree_view, - GtkTreeModel *tree_model, - GtkTreeViewAccessible *accessible, - GtkTreePath *tree_path, - gboolean set_on_ancestor); -static void set_cell_expandable (GtkCellAccessible *cell); static void cell_destroyed (gpointer data); static void cell_info_new (GtkTreeViewAccessible *accessible, @@ -529,12 +523,6 @@ gtk_tree_view_accessible_ref_child (AtkObject *obj, update_cell_value (renderer_cell, accessible, FALSE); - /* Set state if it is expandable */ - if (is_expander) - { - set_cell_expandable (cell); - } - /* If the row is selected, all cells on the row are selected */ selection = gtk_tree_view_get_selection (tree_view); @@ -1719,12 +1707,9 @@ model_row_inserted (GtkTreeModel *tree_model, { GtkTreeView *tree_view = (GtkTreeView *)user_data; AtkObject *atk_obj; - GtkTreeViewAccessible *accessible; - GtkTreePath *path_copy; gint row, n_inserted, child_row; atk_obj = gtk_widget_get_accessible (GTK_WIDGET (tree_view)); - accessible = GTK_TREE_VIEW_ACCESSIBLE (atk_obj); /* Check to see if row is visible */ row = get_row_from_tree_path (tree_view, path); @@ -1779,43 +1764,6 @@ model_row_inserted (GtkTreeModel *tree_model, } } } - else - { - /* The row has been inserted inside another row. This can - * cause a row that previously couldn't be expanded to now - * be expandable. - */ - path_copy = gtk_tree_path_copy (path); - gtk_tree_path_up (path_copy); - set_expand_state (tree_view, tree_model, accessible, path_copy, TRUE); - gtk_tree_path_free (path_copy); - } -} - -static void -model_row_deleted (GtkTreeModel *tree_model, - GtkTreePath *path, - gpointer user_data) -{ - GtkTreeView *tree_view = (GtkTreeView *)user_data; - GtkTreePath *path_copy; - AtkObject *atk_obj; - GtkTreeViewAccessible *accessible; - - atk_obj = gtk_widget_get_accessible (GTK_WIDGET (tree_view)); - accessible = GTK_TREE_VIEW_ACCESSIBLE (atk_obj); - - /* If deleting a row with a depth > 1, then this may affect the - * expansion/contraction of its parent(s). Make sure this is - * handled. - */ - if (gtk_tree_path_get_depth (path) > 1) - { - path_copy = gtk_tree_path_copy (path); - gtk_tree_path_up (path_copy); - set_expand_state (tree_view, tree_model, accessible, path_copy, TRUE); - gtk_tree_path_free (path_copy); - } } void @@ -2176,88 +2124,6 @@ iterate_thru_children (GtkTreeView *tree_view, return; } -/* If the tree_path passed in has children, then - * ATK_STATE_EXPANDABLE is set. - * - * If the tree_path passed in has no children, then - * ATK_STATE_EXPANDABLE is removed. - * - * If set_on_ancestor is TRUE, then this function will also - * update all cells that are ancestors of the tree_path. - */ -static void -set_expand_state (GtkTreeView *tree_view, - GtkTreeModel *tree_model, - GtkTreeViewAccessible *accessible, - GtkTreePath *tree_path, - gboolean set_on_ancestor) -{ - GtkTreeViewColumn *expander_tv; - GtkTreeViewAccessibleCellInfo *cell_info; - GtkTreePath *cell_path; - GtkTreeIter iter; - gboolean found; - GHashTableIter hash_iter; - - g_hash_table_iter_init (&hash_iter, accessible->cell_infos); - while (g_hash_table_iter_next (&hash_iter, NULL, (gpointer *) &cell_info)) - { - cell_path = cell_info_get_path (cell_info); - found = FALSE; - - if (cell_path != NULL) - { - GtkCellAccessible *cell = GTK_CELL_ACCESSIBLE (cell_info->cell); - - expander_tv = gtk_tree_view_get_expander_column (tree_view); - - /* Only set state for the cell that is in the column with the - * expander toggle - */ - if (expander_tv == cell_info->cell_col_ref) - { - if (tree_path && gtk_tree_path_compare (cell_path, tree_path) == 0) - found = TRUE; - else if (set_on_ancestor && - gtk_tree_path_get_depth (cell_path) < - gtk_tree_path_get_depth (tree_path) && - gtk_tree_path_is_ancestor (cell_path, tree_path) == 1) - /* Only set if set_on_ancestor was passed in as TRUE */ - found = TRUE; - } - - /* Set ATK_STATE_EXPANDABLE - * for ancestors and found cells. - */ - if (found) - { - /* Must check against cell_path since cell_path - * can be equal to or an ancestor of tree_path. - */ - gtk_tree_model_get_iter (tree_model, &iter, cell_path); - - /* Set or unset ATK_STATE_EXPANDABLE as appropriate */ - if (gtk_tree_model_iter_has_child (tree_model, &iter)) - { - set_cell_expandable (cell); - } - else - { - _gtk_cell_accessible_remove_state (cell, ATK_STATE_EXPANDABLE, TRUE); - } - - /* We assume that each cell in the cache once and - * a container cell is before its child cells so we are - * finished if set_on_ancestor is not set to TRUE. - */ - if (!set_on_ancestor) - break; - } - } - gtk_tree_path_free (cell_path); - } -} - static void cell_destroyed (gpointer data) { @@ -2361,9 +2227,6 @@ connect_model_signals (GtkTreeView *view, g_signal_connect_data (obj, "row-inserted", G_CALLBACK (model_row_inserted), view, NULL, G_CONNECT_AFTER); - g_signal_connect_data (obj, "row-deleted", - G_CALLBACK (model_row_deleted), view, NULL, - G_CONNECT_AFTER); } static void @@ -2376,7 +2239,6 @@ disconnect_model_signals (GtkTreeViewAccessible *accessible) widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (accessible)); g_signal_handlers_disconnect_by_func (obj, model_row_changed, widget); g_signal_handlers_disconnect_by_func (obj, model_row_inserted, widget); - g_signal_handlers_disconnect_by_func (obj, model_row_deleted, widget); } /* Returns the column number of the specified GtkTreeViewColumn @@ -2532,12 +2394,6 @@ get_rbtree_column_from_index (GtkTreeView *tree_view, return TRUE; } -static void -set_cell_expandable (GtkCellAccessible *cell) -{ - _gtk_cell_accessible_add_state (cell, ATK_STATE_EXPANDABLE, FALSE); -} - static GtkTreeViewAccessibleCellInfo * find_cell_info (GtkTreeViewAccessible *accessible, GtkCellAccessible *cell) diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c index 2b2087dc65..e00c837770 100644 --- a/gtk/gtktreeview.c +++ b/gtk/gtktreeview.c @@ -8930,9 +8930,15 @@ gtk_tree_view_row_has_child_toggled (GtkTreeModel *model, goto done; if (has_child) - GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PARENT); + { + GTK_RBNODE_SET_FLAG (node, GTK_RBNODE_IS_PARENT); + _gtk_tree_view_accessible_add_state (tree_view, tree, node, GTK_CELL_RENDERER_EXPANDABLE); + } else - GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_PARENT); + { + GTK_RBNODE_UNSET_FLAG (node, GTK_RBNODE_IS_PARENT); + _gtk_tree_view_accessible_remove_state (tree_view, tree, node, GTK_CELL_RENDERER_EXPANDABLE); + } if (has_child && tree_view->priv->is_list) {