Attachment 'gtk-tree-no-validation-jul2008.diff'

Download

   1 From e6ec96617a5e97e45109c1df26f1011488a320b2 Mon Sep 17 00:00:00 2001
   2 From: Kristian Rietveld <kris@gtk.org>
   3 Date: Tue, 8 Jul 2008 19:52:51 +0300
   4 Subject: [PATCH] Removed fixed-height-mode; lifted requirement to fully validate the rbtree.
   5 
   6 * fixed-height-mode property and getter/setter are still there, but
   7   non-functional.
   8 * The validate_rows_timers() is gone, as is validate_rows_handler().
   9 * gtk_tree_view_size_request() now estimates the column widths and
  10   height of the tree from 500 rows.
  11 * validate_visible_area() now validates three times as much rows
  12   (3 "pages") so that arrow up/down and page up/down function properly.
  13 * (Superfluous) call to _clamp_node_visible() has been removed, since it
  14   breaks scrolling in some cases.
  15 * The row_* signal handlers still need updating; fixed height mode support
  16   has been removed.
  17 * scroll_to_cell() now also direct on not-fully validated trees and
  18   when a size request/allocation is pending.  The old "delayed" scrolling
  19   method is still used if the widget is not visible at time of call or
  20   when the destination has not yet been validated.
  21 ---
  22  gtk/gtktreeprivate.h |    7 +-
  23  gtk/gtktreeview.c    |  371 +++++++++++++------------------------------------
  24  2 files changed, 100 insertions(+), 278 deletions(-)
  25 
  26 diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
  27 index 51bb951..e3b754e 100644
  28 --- a/gtk/gtktreeprivate.h
  29 +++ b/gtk/gtktreeprivate.h
  30 @@ -100,6 +100,7 @@ struct _GtkTreeViewPrivate
  31    GList *children;
  32    gint width;
  33    gint height;
  34 +  gint average_row_height;
  35    gint expander_size;
  36  
  37    GtkAdjustment *hadjustment;
  38 @@ -192,9 +193,6 @@ struct _GtkTreeViewPrivate
  39    GtkRBNode *rubber_band_end_node;
  40    GtkRBTree *rubber_band_end_tree;
  41  
  42 -  /* fixed height */
  43 -  gint fixed_height;
  44 -
  45    /* Scroll-to functionality when unrealized */
  46    GtkTreeRowReference *scroll_to_path;
  47    GtkTreeViewColumn *scroll_to_column;
  48 @@ -202,9 +200,6 @@ struct _GtkTreeViewPrivate
  49    gfloat scroll_to_col_align;
  50    guint scroll_to_use_align : 1;
  51  
  52 -  guint fixed_height_mode : 1;
  53 -  guint fixed_height_check : 1;
  54 -
  55    guint reorderable : 1;
  56    guint header_has_focus : 1;
  57    guint drag_column_window_state : 3;
  58 diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
  59 index 554df04..81a0a65 100644
  60 --- a/gtk/gtktreeview.c
  61 +++ b/gtk/gtktreeview.c
  62 @@ -120,7 +120,7 @@ enum {
  63    PROP_RULES_HINT,
  64    PROP_ENABLE_SEARCH,
  65    PROP_SEARCH_COLUMN,
  66 -  PROP_FIXED_HEIGHT_MODE,
  67 +  PROP_FIXED_HEIGHT_MODE, /* DEPRECATED */
  68    PROP_HOVER_SELECTION,
  69    PROP_HOVER_EXPAND,
  70    PROP_SHOW_EXPANDERS,
  71 @@ -278,10 +278,12 @@ static gboolean validate_row             (GtkTreeView *tree_view,
  72  					  GtkTreeIter *iter,
  73  					  GtkTreePath *path);
  74  static void     validate_visible_area    (GtkTreeView *tree_view);
  75 -static gboolean validate_rows_handler    (GtkTreeView *tree_view);
  76 -static gboolean do_validate_rows         (GtkTreeView *tree_view,
  77 -					  gboolean     size_request);
  78  static gboolean validate_rows            (GtkTreeView *tree_view);
  79 +static gboolean do_validate_rows         (GtkTreeView *tree_view,
  80 +					  gboolean     size_request,
  81 +                                          int         *count,
  82 +                                          int         *height);
  83 +
  84  static gboolean presize_handler_callback (gpointer     data);
  85  static void     install_presize_handler  (GtkTreeView *tree_view);
  86  static void     install_scroll_sync_handler (GtkTreeView *tree_view);
  87 @@ -362,9 +364,6 @@ static void     gtk_tree_view_real_set_cursor                (GtkTreeView
  88  							      gboolean            clear_and_select,
  89  							      gboolean            clamp_node);
  90  static gboolean gtk_tree_view_has_special_cell               (GtkTreeView        *tree_view);
  91 -static void     column_sizing_notify                         (GObject            *object,
  92 -                                                              GParamSpec         *pspec,
  93 -                                                              gpointer            data);
  94  static gboolean expand_collapse_timeout                      (gpointer            data);
  95  static void     add_expand_collapse_timeout                  (GtkTreeView        *tree_view,
  96                                                                GtkRBTree          *tree,
  97 @@ -652,7 +651,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
  98       * Please see gtk_tree_view_set_fixed_height_mode() for more 
  99       * information on this option.
 100       *
 101 -     * Since: 2.4
 102 +     * Since: 2.4 (DEPRECATED)
 103       **/
 104      g_object_class_install_property (o_class,
 105                                       PROP_FIXED_HEIGHT_MODE,
 106 @@ -1342,9 +1341,6 @@ gtk_tree_view_init (GtkTreeView *tree_view)
 107    tree_view->priv->reorderable = FALSE;
 108    tree_view->priv->presize_handler_timer = 0;
 109    tree_view->priv->scroll_sync_timer = 0;
 110 -  tree_view->priv->fixed_height = -1;
 111 -  tree_view->priv->fixed_height_mode = FALSE;
 112 -  tree_view->priv->fixed_height_check = 0;
 113    gtk_tree_view_set_adjustments (tree_view, NULL, NULL);
 114    tree_view->priv->selection = _gtk_tree_selection_new_with_tree_view (tree_view);
 115    tree_view->priv->enable_search = TRUE;
 116 @@ -1355,6 +1351,7 @@ gtk_tree_view_init (GtkTreeView *tree_view)
 117    tree_view->priv->typeselect_flush_timeout = 0;
 118    tree_view->priv->init_hadjust_value = TRUE;    
 119    tree_view->priv->width = 0;
 120 +  tree_view->priv->average_row_height = -1;
 121            
 122    tree_view->priv->hover_selection = FALSE;
 123    tree_view->priv->hover_expand = FALSE;
 124 @@ -1416,9 +1413,6 @@ gtk_tree_view_set_property (GObject         *object,
 125      case PROP_SEARCH_COLUMN:
 126        gtk_tree_view_set_search_column (tree_view, g_value_get_int (value));
 127        break;
 128 -    case PROP_FIXED_HEIGHT_MODE:
 129 -      gtk_tree_view_set_fixed_height_mode (tree_view, g_value_get_boolean (value));
 130 -      break;
 131      case PROP_HOVER_SELECTION:
 132        tree_view->priv->hover_selection = g_value_get_boolean (value);
 133        break;
 134 @@ -1491,9 +1485,6 @@ gtk_tree_view_get_property (GObject    *object,
 135      case PROP_SEARCH_COLUMN:
 136        g_value_set_int (value, tree_view->priv->search_column);
 137        break;
 138 -    case PROP_FIXED_HEIGHT_MODE:
 139 -      g_value_set_boolean (value, tree_view->priv->fixed_height_mode);
 140 -      break;
 141      case PROP_HOVER_SELECTION:
 142        g_value_set_boolean (value, tree_view->priv->hover_selection);
 143        break;
 144 @@ -1879,12 +1870,6 @@ gtk_tree_view_unrealize (GtkWidget *widget)
 145        priv->presize_handler_timer = 0;
 146      }
 147  
 148 -  if (priv->validate_rows_timer != 0)
 149 -    {
 150 -      g_source_remove (priv->validate_rows_timer);
 151 -      priv->validate_rows_timer = 0;
 152 -    }
 153 -
 154    if (priv->scroll_sync_timer != 0)
 155      {
 156        g_source_remove (priv->scroll_sync_timer);
 157 @@ -2031,11 +2016,26 @@ gtk_tree_view_size_request (GtkWidget      *widget,
 158    GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
 159    GList *tmp_list;
 160  
 161 -  /* we validate GTK_TREE_VIEW_NUM_ROWS_PER_IDLE rows initially just to make
 162 -   * sure we have some size. In practice, with a lot of static lists, this
 163 -   * should get a good width.
 164 -   */
 165 -  do_validate_rows (tree_view, FALSE);
 166 +  if (tree_view->priv->average_row_height == -1)
 167 +    {
 168 +      int count = 0;
 169 +      int height = 0;
 170 +
 171 +      /* we validate GTK_TREE_VIEW_NUM_ROWS_PER_IDLE rows initially just to make
 172 +       * sure we have some size. In practice, with a lot of static lists, this
 173 +       * should get a good width.
 174 +       */
 175 +      do_validate_rows (tree_view, FALSE, &count, &height);
 176 +
 177 +      if (count > 0)
 178 +        {
 179 +          tree_view->priv->average_row_height = height / count;
 180 +
 181 +          _gtk_rbtree_set_fixed_height (tree_view->priv->tree,
 182 +                                        tree_view->priv->average_row_height, FALSE);
 183 +        }
 184 +    }
 185 +  
 186    gtk_tree_view_size_request_columns (tree_view);
 187    gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
 188  
 189 @@ -2315,28 +2315,28 @@ gtk_tree_view_size_allocate (GtkWidget     *widget,
 190    tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->page_size, tree_view->priv->width);
 191  
 192    if (gtk_widget_get_direction(widget) == GTK_TEXT_DIR_RTL)   
 193 -     {
 194 +    {
 195        if (allocation->width < tree_view->priv->width)
 196 -         {
 197 -         if (tree_view->priv->init_hadjust_value)
 198 -           {
 199 -           tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
 200 -           tree_view->priv->init_hadjust_value = FALSE;
 201 -           }
 202 -         else if(allocation->width != old_width)
 203 -           tree_view->priv->hadjustment->value = CLAMP(tree_view->priv->hadjustment->value - allocation->width + old_width, 0, tree_view->priv->width - allocation->width);
 204 -         else
 205 -           tree_view->priv->hadjustment->value = CLAMP(tree_view->priv->width - (tree_view->priv->prev_width - tree_view->priv->hadjustment->value), 0, tree_view->priv->width - allocation->width);
 206 -         }
 207 +        {
 208 +          if (tree_view->priv->init_hadjust_value)
 209 +            {
 210 +              tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
 211 +              tree_view->priv->init_hadjust_value = FALSE;
 212 +            }
 213 +          else if (allocation->width != old_width)
 214 +            tree_view->priv->hadjustment->value = CLAMP(tree_view->priv->hadjustment->value - allocation->width + old_width, 0, tree_view->priv->width - allocation->width);
 215 +          else
 216 +            tree_view->priv->hadjustment->value = CLAMP(tree_view->priv->width - (tree_view->priv->prev_width - tree_view->priv->hadjustment->value), 0, tree_view->priv->width - allocation->width);
 217 +        }
 218        else
 219 -         {
 220 -         tree_view->priv->hadjustment->value = 0;
 221 -         tree_view->priv->init_hadjust_value = TRUE;
 222 -         }
 223 -     }
 224 +        {
 225 +          tree_view->priv->hadjustment->value = 0;
 226 +          tree_view->priv->init_hadjust_value = TRUE;
 227 +        }
 228 +    }
 229    else
 230 -     if (tree_view->priv->hadjustment->value + allocation->width > tree_view->priv->width)
 231 -        tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
 232 +    if (tree_view->priv->hadjustment->value + allocation->width > tree_view->priv->width)
 233 +      tree_view->priv->hadjustment->value = MAX (tree_view->priv->width - allocation->width, 0);
 234  
 235    gtk_adjustment_changed (tree_view->priv->hadjustment);
 236  
 237 @@ -5846,6 +5846,13 @@ validate_visible_area (GtkTreeView *tree_view)
 238    if (total_height == 0)
 239      return;
 240  
 241 +  /* We validate the pages below and above this one too, so the scrolls done by
 242 +   * the arrow keys and page up/down can be done properly.
 243 +   *
 244 +   * FIXME: probably does not work properly yet with scroll_to_path == !NULL
 245 +   */
 246 +  total_height *= 3;
 247 +
 248    /* First, we check to see if we need to scroll anywhere
 249     */
 250    if (tree_view->priv->scroll_to_path)
 251 @@ -5975,8 +5982,12 @@ validate_visible_area (GtkTreeView *tree_view)
 252  	  if (validate_row (tree_view, tree, node, &iter, path))
 253  	    size_changed = TRUE;
 254  	}
 255 -      area_above = 0;
 256 -      area_below = total_height - gtk_tree_view_get_height_of_node (tree_view, node);
 257 +
 258 +      /* total_height is the height of three pages; we validate the pages above
 259 +       * and below this one too.
 260 +       */
 261 +      area_above = total_height / 2;
 262 +      area_below = (total_height / 2) - gtk_tree_view_get_height_of_node (tree_view, node);
 263      }
 264  
 265    above_path = gtk_tree_path_copy (path);
 266 @@ -6182,37 +6193,6 @@ validate_visible_area (GtkTreeView *tree_view)
 267      gtk_widget_queue_draw (GTK_WIDGET (tree_view));
 268  }
 269  
 270 -static void
 271 -initialize_fixed_height_mode (GtkTreeView *tree_view)
 272 -{
 273 -  if (!tree_view->priv->tree)
 274 -    return;
 275 -
 276 -  if (tree_view->priv->fixed_height < 0)
 277 -    {
 278 -      GtkTreeIter iter;
 279 -      GtkTreePath *path;
 280 -
 281 -      GtkRBTree *tree = NULL;
 282 -      GtkRBNode *node = NULL;
 283 -
 284 -      tree = tree_view->priv->tree;
 285 -      node = tree->root;
 286 -
 287 -      path = _gtk_tree_view_find_path (tree_view, tree, node);
 288 -      gtk_tree_model_get_iter (tree_view->priv->model, &iter, path);
 289 -
 290 -      validate_row (tree_view, tree, node, &iter, path);
 291 -
 292 -      gtk_tree_path_free (path);
 293 -
 294 -      tree_view->priv->fixed_height = gtk_tree_view_get_height_of_node (tree_view, node);
 295 -    }
 296 -
 297 -   _gtk_rbtree_set_fixed_height (tree_view->priv->tree,
 298 -                                 tree_view->priv->fixed_height, TRUE);
 299 -}
 300 -
 301  /* Our strategy for finding nodes to validate is a little convoluted.  We find
 302   * the left-most uninvalidated node.  We then try walking right, validating
 303   * nodes.  Once we find a valid node, we repeat the previous process of finding
 304 @@ -6220,7 +6200,10 @@ initialize_fixed_height_mode (GtkTreeView *tree_view)
 305   */
 306  
 307  static gboolean
 308 -do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
 309 +do_validate_rows (GtkTreeView *tree_view,
 310 +                  gboolean     queue_resize,
 311 +                  int         *count,
 312 +                  int         *height)
 313  {
 314    GtkRBTree *tree = NULL;
 315    GtkRBNode *node = NULL;
 316 @@ -6230,22 +6213,11 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
 317    GtkTreeIter iter;
 318    gint i = 0;
 319  
 320 -  gint prev_height = -1;
 321 -  gboolean fixed_height = TRUE;
 322 -
 323    g_assert (tree_view);
 324  
 325    if (tree_view->priv->tree == NULL)
 326        return FALSE;
 327  
 328 -  if (tree_view->priv->fixed_height_mode)
 329 -    {
 330 -      if (tree_view->priv->fixed_height < 0)
 331 -        initialize_fixed_height_mode (tree_view);
 332 -
 333 -      return FALSE;
 334 -    }
 335 -
 336    do
 337      {
 338        if (! GTK_RBNODE_FLAG_SET (tree_view->priv->tree->root, GTK_RBNODE_DESCENDANTS_INVALID))
 339 @@ -6310,28 +6282,16 @@ do_validate_rows (GtkTreeView *tree_view, gboolean queue_resize)
 340        validated_area = validate_row (tree_view, tree, node, &iter, path) ||
 341                         validated_area;
 342  
 343 -      if (!tree_view->priv->fixed_height_check)
 344 -        {
 345 -	  gint height;
 346 +      if (height)
 347 +        *height += GTK_RBNODE_GET_HEIGHT (node);
 348  
 349 -	  height = gtk_tree_view_get_height_of_node (tree_view, node);
 350 -	  if (prev_height < 0)
 351 -	    prev_height = height;
 352 -	  else if (prev_height != height)
 353 -	    fixed_height = FALSE;
 354 -	}
 355 +      if (count)
 356 +        (*count)++;
 357  
 358        i++;
 359      }
 360    while (i < GTK_TREE_VIEW_NUM_ROWS_PER_IDLE);
 361  
 362 -  if (!tree_view->priv->fixed_height_check)
 363 -   {
 364 -     if (fixed_height)
 365 -       _gtk_rbtree_set_fixed_height (tree_view->priv->tree, prev_height, FALSE);
 366 -
 367 -     tree_view->priv->fixed_height_check = 1;
 368 -   }
 369    
 370   done:
 371    if (validated_area)
 372 @@ -6361,29 +6321,8 @@ validate_rows (GtkTreeView *tree_view)
 373  {
 374    gboolean retval;
 375    
 376 -  retval = do_validate_rows (tree_view, TRUE);
 377 +  retval = do_validate_rows (tree_view, TRUE, NULL, NULL);
 378    
 379 -  if (! retval && tree_view->priv->validate_rows_timer)
 380 -    {
 381 -      g_source_remove (tree_view->priv->validate_rows_timer);
 382 -      tree_view->priv->validate_rows_timer = 0;
 383 -    }
 384 -
 385 -  return retval;
 386 -}
 387 -
 388 -static gboolean
 389 -validate_rows_handler (GtkTreeView *tree_view)
 390 -{
 391 -  gboolean retval;
 392 -
 393 -  retval = do_validate_rows (tree_view, TRUE);
 394 -  if (! retval && tree_view->priv->validate_rows_timer)
 395 -    {
 396 -      g_source_remove (tree_view->priv->validate_rows_timer);
 397 -      tree_view->priv->validate_rows_timer = 0;
 398 -    }
 399 -
 400    return retval;
 401  }
 402  
 403 @@ -6398,19 +6337,6 @@ do_presize_handler (GtkTreeView *tree_view)
 404      }
 405    validate_visible_area (tree_view);
 406    tree_view->priv->presize_handler_timer = 0;
 407 -
 408 -  if (tree_view->priv->fixed_height_mode)
 409 -    {
 410 -      GtkRequisition requisition;
 411 -
 412 -      gtk_widget_size_request (GTK_WIDGET (tree_view), &requisition);
 413 -
 414 -      tree_view->priv->hadjustment->upper = MAX (tree_view->priv->hadjustment->upper, (gfloat)requisition.width);
 415 -      tree_view->priv->vadjustment->upper = MAX (tree_view->priv->vadjustment->upper, (gfloat)requisition.height);
 416 -      gtk_adjustment_changed (tree_view->priv->hadjustment);
 417 -      gtk_adjustment_changed (tree_view->priv->vadjustment);
 418 -      gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 419 -    }
 420  		   
 421    return FALSE;
 422  }
 423 @@ -6434,11 +6360,6 @@ install_presize_handler (GtkTreeView *tree_view)
 424        tree_view->priv->presize_handler_timer =
 425  	gdk_threads_add_idle_full (GTK_PRIORITY_RESIZE - 2, presize_handler_callback, tree_view, NULL);
 426      }
 427 -  if (! tree_view->priv->validate_rows_timer)
 428 -    {
 429 -      tree_view->priv->validate_rows_timer =
 430 -	gdk_threads_add_idle_full (GTK_TREE_VIEW_PRIORITY_VALIDATE, (GSourceFunc) validate_rows_handler, tree_view, NULL);
 431 -    }
 432  }
 433  
 434  static gboolean
 435 @@ -7684,18 +7605,6 @@ gtk_tree_view_has_special_cell (GtkTreeView *tree_view)
 436    return FALSE;
 437  }
 438  
 439 -static void
 440 -column_sizing_notify (GObject    *object,
 441 -                      GParamSpec *pspec,
 442 -                      gpointer    data)
 443 -{
 444 -  GtkTreeViewColumn *c = GTK_TREE_VIEW_COLUMN (object);
 445 -
 446 -  if (gtk_tree_view_column_get_sizing (c) != GTK_TREE_VIEW_COLUMN_FIXED)
 447 -    /* disable fixed height mode */
 448 -    g_object_set (data, "fixed-height-mode", FALSE, NULL);
 449 -}
 450 -
 451  /**
 452   * gtk_tree_view_set_fixed_height_mode:
 453   * @tree_view: a #GtkTreeView 
 454 @@ -7707,50 +7616,12 @@ column_sizing_notify (GObject    *object,
 455   * Only enable this option if all rows are the same height and all
 456   * columns are of type %GTK_TREE_VIEW_COLUMN_FIXED.
 457   *
 458 - * Since: 2.6 
 459 + * Since: 2.6 (DEPRECATED)
 460   **/
 461  void
 462  gtk_tree_view_set_fixed_height_mode (GtkTreeView *tree_view,
 463                                       gboolean     enable)
 464  {
 465 -  GList *l;
 466 -  
 467 -  enable = enable != FALSE;
 468 -
 469 -  if (enable == tree_view->priv->fixed_height_mode)
 470 -    return;
 471 -
 472 -  if (!enable)
 473 -    {
 474 -      tree_view->priv->fixed_height_mode = 0;
 475 -      tree_view->priv->fixed_height = -1;
 476 -
 477 -      /* force a revalidation */
 478 -      install_presize_handler (tree_view);
 479 -    }
 480 -  else 
 481 -    {
 482 -      /* make sure all columns are of type FIXED */
 483 -      for (l = tree_view->priv->columns; l; l = l->next)
 484 -	{
 485 -	  GtkTreeViewColumn *c = l->data;
 486 -	  
 487 -	  g_return_if_fail (gtk_tree_view_column_get_sizing (c) == GTK_TREE_VIEW_COLUMN_FIXED);
 488 -	}
 489 -      
 490 -      /* yes, we really have to do this is in a separate loop */
 491 -      for (l = tree_view->priv->columns; l; l = l->next)
 492 -	g_signal_connect (l->data, "notify::sizing",
 493 -			  G_CALLBACK (column_sizing_notify), tree_view);
 494 -      
 495 -      tree_view->priv->fixed_height_mode = 1;
 496 -      tree_view->priv->fixed_height = -1;
 497 -      
 498 -      if (tree_view->priv->tree)
 499 -	initialize_fixed_height_mode (tree_view);
 500 -    }
 501 -
 502 -  g_object_notify (G_OBJECT (tree_view), "fixed-height-mode");
 503  }
 504  
 505  /**
 506 @@ -7761,12 +7632,12 @@ gtk_tree_view_set_fixed_height_mode (GtkTreeView *tree_view,
 507   * 
 508   * Return value: %TRUE if @tree_view is in fixed height mode
 509   * 
 510 - * Since: 2.6
 511 + * Since: 2.6 (DEPRECATED).
 512   **/
 513  gboolean
 514  gtk_tree_view_get_fixed_height_mode (GtkTreeView *tree_view)
 515  {
 516 -  return tree_view->priv->fixed_height_mode;
 517 +  return FALSE;
 518  }
 519  
 520  /* Returns TRUE if the focus is within the headers, after the focus operation is
 521 @@ -8058,7 +7929,7 @@ gtk_tree_view_style_set (GtkWidget *widget,
 522        _gtk_tree_view_column_cell_set_dirty (column, TRUE);
 523      }
 524  
 525 -  tree_view->priv->fixed_height = -1;
 526 +  tree_view->priv->average_row_height = -1;
 527    _gtk_rbtree_mark_invalid (tree_view->priv->tree);
 528  
 529    gtk_widget_queue_resize (widget);
 530 @@ -8318,34 +8189,27 @@ gtk_tree_view_row_changed (GtkTreeModel *model,
 531    if (tree == NULL)
 532      goto done;
 533  
 534 -  if (tree_view->priv->fixed_height_mode
 535 -      && tree_view->priv->fixed_height >= 0)
 536 -    {
 537 -      _gtk_rbtree_node_set_height (tree, node, tree_view->priv->fixed_height);
 538 -      if (GTK_WIDGET_REALIZED (tree_view))
 539 -	gtk_tree_view_node_queue_redraw (tree_view, tree, node);
 540 -    }
 541 -  else
 542 +  _gtk_rbtree_node_mark_invalid (tree, node);
 543 +  for (list = tree_view->priv->columns; list; list = list->next)
 544      {
 545 -      _gtk_rbtree_node_mark_invalid (tree, node);
 546 -      for (list = tree_view->priv->columns; list; list = list->next)
 547 -        {
 548 -          GtkTreeViewColumn *column;
 549 +      GtkTreeViewColumn *column;
 550  
 551 -          column = list->data;
 552 -          if (! column->visible)
 553 -            continue;
 554 +      column = list->data;
 555 +      if (! column->visible)
 556 +        continue;
 557  
 558 -          if (column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
 559 -            {
 560 -              _gtk_tree_view_column_cell_set_dirty (column, TRUE);
 561 -            }
 562 +      if (column->column_type == GTK_TREE_VIEW_COLUMN_AUTOSIZE)
 563 +        {
 564 +          _gtk_tree_view_column_cell_set_dirty (column, TRUE);
 565          }
 566      }
 567  
 568   done:
 569 +#if 0
 570 +  /* FIXME: need area validation if this node is visible. */
 571    if (GTK_WIDGET_REALIZED (tree_view) && !tree_view->priv->fixed_height_mode)
 572      install_presize_handler (tree_view);
 573 +#endif
 574    if (free_path)
 575      gtk_tree_path_free (path);
 576  }
 577 @@ -8368,11 +8232,7 @@ gtk_tree_view_row_inserted (GtkTreeModel *model,
 578  
 579    g_return_if_fail (path != NULL || iter != NULL);
 580  
 581 -  if (tree_view->priv->fixed_height_mode
 582 -      && tree_view->priv->fixed_height >= 0)
 583 -    height = tree_view->priv->fixed_height;
 584 -  else
 585 -    height = 0;
 586 +  height = 0;
 587  
 588    if (path == NULL)
 589      {
 590 @@ -8449,18 +8309,12 @@ gtk_tree_view_row_inserted (GtkTreeModel *model,
 591      }
 592  
 593   done:
 594 -  if (height > 0)
 595 -    {
 596 -      if (tree)
 597 -        _gtk_rbtree_node_mark_valid (tree, tmpnode);
 598 -
 599 -      if (node_visible && node_is_visible (tree_view, tree, tmpnode))
 600 -	gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 601 -      else
 602 -	gtk_widget_queue_resize_no_redraw (GTK_WIDGET (tree_view));
 603 -    }
 604 +  /* FIXME: need to validate the node if it will be visible directly. */
 605 +  if (node_visible && node_is_visible (tree_view, tree, tmpnode))
 606 +    gtk_widget_queue_resize (GTK_WIDGET (tree_view));
 607    else
 608 -    install_presize_handler (tree_view);
 609 +    gtk_widget_queue_resize_no_redraw (GTK_WIDGET (tree_view));
 610 +
 611    if (free_path)
 612      gtk_tree_path_free (path);
 613  }
 614 @@ -8815,15 +8669,6 @@ gtk_tree_view_build_tree (GtkTreeView *tree_view,
 615        gtk_tree_model_ref_node (tree_view->priv->model, iter);
 616        temp = _gtk_rbtree_insert_after (tree, temp, 0, FALSE);
 617  
 618 -      if (tree_view->priv->fixed_height > 0)
 619 -        {
 620 -          if (GTK_RBNODE_FLAG_SET (temp, GTK_RBNODE_INVALID))
 621 -	    {
 622 -              _gtk_rbtree_node_set_height (tree, temp, tree_view->priv->fixed_height);
 623 -	      _gtk_rbtree_node_mark_valid (tree, temp);
 624 -	    }
 625 -        }
 626 -
 627        if (is_list)
 628          continue;
 629  
 630 @@ -9834,7 +9679,6 @@ gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
 631  
 632    y -= window_y;
 633    gtk_tree_view_scroll_to_point (tree_view, -1, y);
 634 -  gtk_tree_view_clamp_node_visible (tree_view, cursor_tree, cursor_node);
 635    _gtk_tree_view_queue_draw_node (tree_view, cursor_tree, cursor_node, NULL);
 636  
 637    if (!gtk_tree_path_compare (old_cursor_path, cursor_path))
 638 @@ -10745,8 +10589,7 @@ gtk_tree_view_set_model (GtkTreeView  *tree_view,
 639        g_object_unref (tree_view->priv->model);
 640  
 641        tree_view->priv->search_column = -1;
 642 -      tree_view->priv->fixed_height_check = 0;
 643 -      tree_view->priv->fixed_height = -1;
 644 +      tree_view->priv->average_row_height = -1;
 645        tree_view->priv->dy = tree_view->priv->top_row_dy = 0;
 646      }
 647  
 648 @@ -11178,10 +11021,6 @@ gtk_tree_view_remove_column (GtkTreeView       *tree_view,
 649        tree_view->priv->edited_column = NULL;
 650      }
 651  
 652 -  g_signal_handlers_disconnect_by_func (column,
 653 -                                        G_CALLBACK (column_sizing_notify),
 654 -                                        tree_view);
 655 -
 656    _gtk_tree_view_column_unset_tree_view (column);
 657  
 658    tree_view->priv->columns = g_list_remove (tree_view->priv->columns, column);
 659 @@ -11236,10 +11075,6 @@ gtk_tree_view_insert_column (GtkTreeView       *tree_view,
 660    g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (column), -1);
 661    g_return_val_if_fail (column->tree_view == NULL, -1);
 662  
 663 -  if (tree_view->priv->fixed_height_mode)
 664 -    g_return_val_if_fail (gtk_tree_view_column_get_sizing (column)
 665 -                          == GTK_TREE_VIEW_COLUMN_FIXED, -1);
 666 -
 667    g_object_ref_sink (column);
 668  
 669    if (tree_view->priv->n_columns == 0 &&
 670 @@ -11249,9 +11084,6 @@ gtk_tree_view_insert_column (GtkTreeView       *tree_view,
 671        gdk_window_show (tree_view->priv->header_window);
 672      }
 673  
 674 -  g_signal_connect (column, "notify::sizing",
 675 -                    G_CALLBACK (column_sizing_notify), tree_view);
 676 -
 677    tree_view->priv->columns = g_list_insert (tree_view->priv->columns,
 678  					    column, position);
 679    tree_view->priv->n_columns++;
 680 @@ -11309,8 +11141,6 @@ gtk_tree_view_insert_column_with_attributes (GtkTreeView     *tree_view,
 681    g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
 682  
 683    column = gtk_tree_view_column_new ();
 684 -  if (tree_view->priv->fixed_height_mode)
 685 -    gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
 686  
 687    gtk_tree_view_column_set_title (column, title);
 688    gtk_tree_view_column_pack_start (column, cell, TRUE);
 689 @@ -11366,8 +11196,6 @@ gtk_tree_view_insert_column_with_data_func  (GtkTreeView               *tree_vie
 690    g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), -1);
 691  
 692    column = gtk_tree_view_column_new ();
 693 -  if (tree_view->priv->fixed_height_mode)
 694 -    gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_FIXED);
 695  
 696    gtk_tree_view_column_set_title (column, title);
 697    gtk_tree_view_column_pack_start (column, cell, TRUE);
 698 @@ -11639,6 +11467,9 @@ gtk_tree_view_scroll_to_cell (GtkTreeView       *tree_view,
 699                                gfloat             row_align,
 700                                gfloat             col_align)
 701  {
 702 +  GtkRBTree *tree;
 703 +  GtkRBNode *node;
 704 +
 705    g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
 706    g_return_if_fail (tree_view->priv->model != NULL);
 707    g_return_if_fail (tree_view->priv->tree != NULL);
 708 @@ -11646,22 +11477,18 @@ gtk_tree_view_scroll_to_cell (GtkTreeView       *tree_view,
 709    g_return_if_fail (col_align >= 0.0 && col_align <= 1.0);
 710    g_return_if_fail (path != NULL || column != NULL);
 711  
 712 -#if 0
 713 -  g_print ("gtk_tree_view_scroll_to_cell:\npath: %s\ncolumn: %s\nuse_align: %d\nrow_align: %f\ncol_align: %f\n",
 714 -	   gtk_tree_path_to_string (path), column?"non-null":"null", use_align, row_align, col_align);
 715 -#endif
 716    row_align = CLAMP (row_align, 0.0, 1.0);
 717    col_align = CLAMP (col_align, 0.0, 1.0);
 718  
 719 +  _gtk_tree_view_find_node (tree_view, path, &tree, &node);
 720  
 721    /* Note: Despite the benefits that come from having one code path for the
 722     * scrolling code, we short-circuit validate_visible_area's immplementation as
 723     * it is much slower than just going to the point.
 724     */
 725 -  if (! GTK_WIDGET_VISIBLE (tree_view) ||
 726 -      ! GTK_WIDGET_REALIZED (tree_view) ||
 727 -      GTK_WIDGET_ALLOC_NEEDED (tree_view) || 
 728 -      GTK_RBNODE_FLAG_SET (tree_view->priv->tree->root, GTK_RBNODE_DESCENDANTS_INVALID))
 729 +  if (! GTK_WIDGET_VISIBLE (tree_view)
 730 +      || ! GTK_WIDGET_REALIZED (tree_view)
 731 +      || GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID))
 732      {
 733        if (tree_view->priv->scroll_to_path)
 734  	gtk_tree_row_reference_free (tree_view->priv->scroll_to_path);
 735 -- 
 736 1.6.4

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2021-02-25 09:59:00, 9.1 KB) [[attachment:gtk-simple-list-01-handle-toggle-renderers.diff]]
  • [get | view] (2021-02-25 09:59:00, 1.7 KB) [[attachment:gtk-simple-list-02-remove-set-cell-renderer-stub.diff]]
  • [get | view] (2021-02-25 09:59:00, 2.2 KB) [[attachment:gtk-simple-list-03-add-new-with-titles-constructor.diff]]
  • [get | view] (2021-02-25 09:59:00, 34.7 KB) [[attachment:gtk-simple-list-20sep2008.diff]]
  • [get | view] (2021-02-25 09:59:00, 50.1 KB) [[attachment:gtk-tree-extra-space-API-jul2008.tar.gz]]
  • [get | view] (2021-02-25 09:59:00, 111.2 KB) [[attachment:gtk-tree-new-dnd-28oct2008.diff]]
  • [get | view] (2021-02-25 09:59:00, 26.2 KB) [[attachment:gtk-tree-no-validation-jul2008.diff]]
  • [get | view] (2021-02-25 09:59:00, 17.3 KB) [[attachment:gtk-tree-refactor-dec2009.tar.gz]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.