[gtk+/treeview-refactor] Fixed GtkTreeViewColumn to reset the context when _gtk_tree_view_column_cell_set_dirty is called.



commit 0d0ec8587728ff26fbb2b14c8a7f72b39e386998
Author: Tristan Van Berkom <tristan van berkom gmail com>
Date:   Mon Dec 6 17:03:53 2010 +0900

    Fixed GtkTreeViewColumn to reset the context when _gtk_tree_view_column_cell_set_dirty is called.
    
    This fixes autosize columns... result can be viewable by checking
    tests/testtreeview and setting the second column to autosize and then
    expanding/colapsing some rows.

 gtk/gtktreeviewcolumn.c |   32 ++++++++++++++++++++++++++++----
 1 files changed, 28 insertions(+), 4 deletions(-)
---
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c
index 7a8bb73..02e4652 100644
--- a/gtk/gtktreeviewcolumn.c
+++ b/gtk/gtktreeviewcolumn.c
@@ -172,6 +172,7 @@ struct _GtkTreeViewColumnPrivate
   guint reorderable         : 1;
   guint use_resized_width   : 1;
   guint expand              : 1;
+  guint resetting_context   : 1;
 };
 
 enum
@@ -1246,16 +1247,24 @@ gtk_tree_view_column_context_changed  (GtkCellAreaContext      *context,
 				       GParamSpec              *pspec,
 				       GtkTreeViewColumn       *tree_column)
 {
+  /* Here we want the column re-requested if the underlying context was
+   * actually reset for any reason, this can happen if the underlying
+   * area/cell configuration changes (i.e. cell packing properties
+   * or cell spacing and the like) 
+   *
+   * Note that we block this handler while requesting for sizes
+   * so there is no need to check for the new context size being -1,
+   * we also block the handler when explicitly resetting the context
+   * so as to avoid some infinite stack recursion.
+   */
   if (!strcmp (pspec->name, "minimum-width") ||
       !strcmp (pspec->name, "natural-width") ||
       !strcmp (pspec->name, "minimum-height") ||
       !strcmp (pspec->name, "natural-height"))
     {
-      /* XXX We want to do something specific if the size actually got cleared
-       * or if it just grew a little bit because of a data change and we
-       * are in GROW_ONLY mode. 
-       */
+      tree_column->priv->resetting_context = TRUE;
       _gtk_tree_view_column_cell_set_dirty (tree_column, TRUE);
+      tree_column->priv->resetting_context = FALSE;
     }
 }
 
@@ -2892,6 +2901,21 @@ _gtk_tree_view_column_cell_set_dirty (GtkTreeViewColumn *tree_column,
   priv->padding = 0;
   priv->width = 0;
 
+  /* Issue a manual reset on the context to have all
+   * sizes re-requested for the context.
+   *
+   * This annoying 'resetting_context' flag is unfortunately
+   * necessary to prevent some infinite recursion
+   */
+  if (!tree_column->priv->resetting_context)
+    {
+      g_signal_handler_block (priv->cell_area_context, 
+			      priv->context_changed_signal);
+      gtk_cell_area_context_reset (priv->cell_area_context);
+      g_signal_handler_unblock (priv->cell_area_context, 
+				priv->context_changed_signal);
+    }
+
   if (priv->tree_view &&
       gtk_widget_get_realized (priv->tree_view))
     {



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