+2006-04-26 Kristian Rietveld <kris@imendio.com>
+
+ * gtk/gtktreeview.c (node_is_visible): new function,
+ (validate_visible_area): when a node is validated, only queue a
+ redraw for that node, not for the entire widget (a redraw for the
+ entire widget is only needed when the sizes change, and
+ _queue_resize() will take care of that),
+ (do_validate_rows): do not queue a redraw, redraws are only needed
+ for changes in the visible area and validate_visible_area() takes
+ care of that,
+ (gtk_tree_view_row_inserted): for fixed height mode, only queue
+ a resize and redraw if the node is visible, else no redraw is needed.
+
2006-04-26 Kristian Rietveld <kris@imendio.com>
If this new "row-ending-details" property is turned on, more
+2006-04-26 Kristian Rietveld <kris@imendio.com>
+
+ * gtk/gtktreeview.c (node_is_visible): new function,
+ (validate_visible_area): when a node is validated, only queue a
+ redraw for that node, not for the entire widget (a redraw for the
+ entire widget is only needed when the sizes change, and
+ _queue_resize() will take care of that),
+ (do_validate_rows): do not queue a redraw, redraws are only needed
+ for changes in the visible area and validate_visible_area() takes
+ care of that,
+ (gtk_tree_view_row_inserted): for fixed height mode, only queue
+ a resize and redraw if the node is visible, else no redraw is needed.
+
2006-04-26 Kristian Rietveld <kris@imendio.com>
If this new "row-ending-details" property is turned on, more
GTK_RBNODE_GET_HEIGHT (node));
}
+static gboolean
+node_is_visible (GtkTreeView *tree_view,
+ GtkRBTree *tree,
+ GtkRBNode *node)
+{
+ int y;
+ int height;
+
+ y = _gtk_rbtree_node_find_offset (tree, node);
+ height = ROW_HEIGHT (tree_view, GTK_RBNODE_GET_HEIGHT (node));
+
+ if (y >= tree_view->priv->vadjustment->value &&
+ y + height <= (tree_view->priv->vadjustment->value
+ + tree_view->priv->vadjustment->page_size))
+ return TRUE;
+
+ return FALSE;
+}
+
/* Returns TRUE if it updated the size
*/
static gboolean
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) ||
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))
{
- need_redraw = TRUE;
+ _gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
if (validate_row (tree_view, tree, node, &iter, path))
size_changed = TRUE;
}
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) ||
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))
{
- need_redraw = TRUE;
+ _gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
if (validate_row (tree_view, tree, node, &iter, path))
size_changed = TRUE;
}
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_INVALID) ||
GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_COLUMN_INVALID))
{
- need_redraw = TRUE;
+ _gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
if (validate_row (tree_view, tree, node, &iter, path))
size_changed = TRUE;
}
{
gint old_height = new_height;
- need_redraw = TRUE;
+ _gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
if (validate_row (tree_view, tree, node, &iter, path))
{
new_height = GTK_RBNODE_GET_HEIGHT (node);
{
gint old_height = new_height;
- need_redraw = TRUE;
+ _gtk_tree_view_queue_draw_node (tree_view, tree, node, NULL);
if (validate_row (tree_view, tree, node, &iter, above_path))
{
new_height = GTK_RBNODE_GET_HEIGHT (node);
gtk_adjustment_changed (tree_view->priv->vadjustment);
if (queue_resize)
- gtk_widget_queue_resize (GTK_WIDGET (tree_view));
+ gtk_widget_queue_resize_no_redraw (GTK_WIDGET (tree_view));
}
if (path) gtk_tree_path_free (path);
gint i = 0;
gint height;
gboolean free_path = FALSE;
+ gboolean node_visible = TRUE;
g_return_if_fail (path != NULL || iter != NULL);
if (tmptree == NULL)
{
/* We aren't showing the node */
+ node_visible = FALSE;
goto done;
}
}
if (tree == NULL)
- goto done;
+ {
+ node_visible = FALSE;
+ goto done;
+ }
/* ref the node */
gtk_tree_model_ref_node (tree_view->priv->model, iter);
{
if (tree)
_gtk_rbtree_node_mark_valid (tree, tmpnode);
- gtk_widget_queue_resize (GTK_WIDGET (tree_view));
+
+ if (node_visible && node_is_visible (tree_view, tree, tmpnode))
+ gtk_widget_queue_resize (GTK_WIDGET (tree_view));
+ else
+ gtk_widget_queue_resize_no_redraw (GTK_WIDGET (tree_view));
}
else
install_presize_handler (tree_view);