[gtk+] treeview: Set expandable flag from treeview



commit 82a9f6faa07d525353d8ae2da6f7709fe3ee7ffe
Author: Benjamin Otte <otte redhat com>
Date:   Mon Dec 12 15:30:47 2011 +0100

    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 4901e4f..9fcc21e 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 2b2087d..e00c837 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)
     {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]