GtkRBNode *node);
static gboolean gtk_tree_view_maybe_begin_dragging_row (GtkTreeView *tree_view,
GdkEventMotion *event);
+static void _gtk_tree_view_update_col_width (GtkTreeView *tree_view);
+
static GtkContainerClass *parent_class = NULL;
GTK_WIDGET_SET_FLAGS (tree_view, GTK_CAN_FOCUS);
+ tree_view->priv->model = NULL;
tree_view->priv->flags = GTK_TREE_VIEW_IS_LIST | GTK_TREE_VIEW_SHOW_EXPANDERS | GTK_TREE_VIEW_DRAW_KEYFOCUS | GTK_TREE_VIEW_HEADERS_VISIBLE;
tree_view->priv->tab_offset = TREE_VIEW_EXPANDER_WIDTH;
tree_view->priv->n_columns = 0;
tree_view->priv->press_start_y = -1;
gtk_tree_view_set_adjustments (tree_view, NULL, NULL);
- _gtk_tree_view_set_size (tree_view, 0, 0);
+ _gtk_tree_view_update_size (tree_view);
}
gtk_widget_set_parent_window (child->widget, tree_view->priv->bin_window);
}
gtk_tree_view_realize_buttons (GTK_TREE_VIEW (widget));
- _gtk_tree_view_set_size (GTK_TREE_VIEW (widget), -1, -1);
+ _gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
if (tree_view->priv->scroll_to_path != NULL ||
tree_view->priv->scroll_to_column != NULL)
gtk_widget_size_request (column->button, &requisition);
- gtk_tree_view_column_set_width (column,
- MAX (column->width, requisition.width));
+ gtk_tree_view_column_set_width (column, MAX (column->width, requisition.width));
tree_view->priv->header_height = MAX (tree_view->priv->header_height, requisition.height);
}
}
{
GtkTreeView *tree_view;
GList *list;
- GList *last_column;
GtkTreeViewColumn *column;
GtkAllocation allocation;
gint width = 0;
-
+
tree_view = GTK_TREE_VIEW (widget);
allocation.y = 0;
allocation.height = tree_view->priv->header_height;
- for (last_column = g_list_last (tree_view->priv->columns);
- last_column && !(GTK_TREE_VIEW_COLUMN (last_column->data)->visible);
- last_column = last_column->prev)
- ;
-
- if (last_column == NULL)
- return;
-
- for (list = tree_view->priv->columns; list != last_column; list = list->next)
+ for (list = tree_view->priv->columns; list != NULL; list = list->next)
{
column = list->data;
continue;
allocation.x = width;
- allocation.width = column->width;
+ allocation.width = column->displayed_width;
width += column->width;
gtk_widget_size_allocate (column->button, &allocation);
if (column->window)
gdk_window_move_resize (column->window,
- width - TREE_VIEW_DRAG_WIDTH/2, allocation.y,
+ allocation.x + allocation.width - TREE_VIEW_DRAG_WIDTH/2,
+ allocation.y,
TREE_VIEW_DRAG_WIDTH, allocation.height);
}
- column = list->data;
- allocation.x = width;
- allocation.width = MAX (widget->allocation.width, tree_view->priv->width) - width;
- gtk_widget_size_allocate (column->button, &allocation);
- if (column->window)
- gdk_window_move_resize (column->window,
- allocation.x + allocation.width - TREE_VIEW_DRAG_WIDTH/2,
- 0,
- TREE_VIEW_DRAG_WIDTH, allocation.height);
}
static void
gtk_widget_size_allocate (child->widget, &allocation);
}
- gtk_tree_view_size_allocate_buttons (widget);
-
if (GTK_WIDGET_REALIZED (widget))
{
gdk_window_move_resize (widget->window,
0, 0,
MAX (tree_view->priv->width, allocation->width),
tree_view->priv->header_height);
+
+ if (tree_view->priv->width < allocation->width)
+ gdk_window_resize (tree_view->priv->bin_window,
+ allocation->width,
+ tree_view->priv->height + TREE_VIEW_HEADER_HEIGHT (tree_view));
+
+ _gtk_tree_view_update_col_width (tree_view);
}
+ gtk_tree_view_size_allocate_buttons (widget);
+
tree_view->priv->hadjustment->page_size = allocation->width;
tree_view->priv->hadjustment->page_increment = allocation->width / 2;
tree_view->priv->hadjustment->lower = 0;
&iter);
background_area.x = cell_offset;
- background_area.width = TREE_VIEW_COLUMN_WIDTH (column);
+ background_area.width = column->displayed_width;
cell_area = background_area;
NULL,
0);
- cell_offset += TREE_VIEW_COLUMN_WIDTH (column);
+ cell_offset += column->displayed_width;
}
return drawable;
for (i = 0, list = tree_view->priv->columns; i < tree_view->priv->n_columns; i++, list = list->next)
{
GtkTreeViewColumn *column = list->data;
- const gchar *detail = NULL;
+ const gchar *detail = NULL;
if (!column->visible)
continue;
+ if (cell_offset > event->area.x + event->area.width ||
+ cell_offset + column->displayed_width < event->area.x)
+ {
+ cell_offset += column->displayed_width;
+ continue;
+ }
+
if (column->show_sort_indicator)
flags |= GTK_CELL_RENDERER_SORTED;
else
flags &= ~GTK_CELL_RENDERER_SORTED;
-
+
cell = column->cell;
gtk_tree_view_column_set_cell_data (column,
tree_view->priv->model,
&iter);
background_area.x = cell_offset;
- background_area.width = TREE_VIEW_COLUMN_WIDTH (column);
+ background_area.width = column->displayed_width;
cell_area = background_area;
cell_area.y += TREE_VIEW_VERTICAL_SEPARATOR / 2;
}
g_assert (detail);
-
+
/* Draw background */
gtk_paint_flat_box (widget->style,
event->window,
&event->area,
flags);
}
- cell_offset += TREE_VIEW_COLUMN_WIDTH (column);
+ cell_offset += column->displayed_width;
}
if (node == cursor &&
}
/* FIXME: Do we need to scroll */
- _gtk_tree_view_set_size (GTK_TREE_VIEW (widget), -1, tree_view->priv->height);
+ _gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
return FALSE;
}
if (!column->visible)
continue;
- background_area.width = TREE_VIEW_COLUMN_WIDTH (column);
+ background_area.width = column->displayed_width;
if (i == tree_view->priv->expander_column &&
TREE_VIEW_DRAW_EXPANDERS(tree_view))
{
}
gtk_tree_path_free (path);
- _gtk_tree_view_set_size (GTK_TREE_VIEW (widget), -1, -1);
+ _gtk_tree_view_update_size (GTK_TREE_VIEW (widget));
}
tree_view->priv->button_pressed_node = NULL;
_gtk_rbtree_insert_after (tree, tmpnode, max_height);
}
- _gtk_tree_view_set_size (tree_view, -1, tree_view->priv->height + max_height);
+ _gtk_tree_view_update_size (tree_view);
done:
if (free_path)
_gtk_rbtree_remove_node (tree, node);
}
- _gtk_tree_view_set_size (GTK_TREE_VIEW (data), -1, -1);
+ _gtk_tree_view_update_size (GTK_TREE_VIEW (data));
}
/* Internal tree functions */
max_height = MAX (max_height, TREE_VIEW_VERTICAL_SEPARATOR + height);
/* FIXME: I'm getting the width of all nodes here. )-: */
- if (column->dirty == FALSE || column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
+ if (column->dirty == FALSE)
continue;
+ if (column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
+ {
+ continue;
+ }
if (i == tree_view->priv->expander_column &&
TREE_VIEW_DRAW_EXPANDERS (tree_view))
gtk_tree_view_column_set_width (column,
if (gtk_tree_model_get_iter (tree_view->priv->model, &iter, path))
{
gtk_tree_view_calc_size (tree_view, tree_view->priv->tree, &iter, 1);
- _gtk_tree_view_set_size (tree_view, -1, -1);
+ _gtk_tree_view_update_size (tree_view);
}
gtk_tree_path_free (path);
#undef EXPANDER_SIZE
}
+
+static void
+_gtk_tree_view_update_col_width (GtkTreeView *tree_view)
+{
+ GList *list, *last_column;
+ GtkTreeViewColumn *column;
+ gint width = 0;
+
+ for (last_column = g_list_last (tree_view->priv->columns);
+ last_column &&
+ !(GTK_TREE_VIEW_COLUMN (last_column->data)->visible) &&
+ GTK_WIDGET_CAN_FOCUS (GTK_TREE_VIEW_COLUMN (last_column->data)->button);
+ last_column = last_column->prev)
+ ;
+
+ if (last_column == NULL)
+ return;
+
+ for (list = tree_view->priv->columns; list != last_column; list = list->next)
+ {
+ column = GTK_TREE_VIEW_COLUMN (list->data);
+ if (! column->visible)
+ continue;
+
+ width += column->width;
+ column->displayed_width = (CLAMP (column->width, (column->min_width!=-1)?column->min_width:column->width, (column->max_width!=-1)?column->max_width:column->width));
+ }
+ column = GTK_TREE_VIEW_COLUMN (last_column->data);
+ column->displayed_width = MAX (GTK_WIDGET (tree_view)->allocation.width, tree_view->priv->width) - width;
+}
+
void
-_gtk_tree_view_set_size (GtkTreeView *tree_view,
- gint width,
- gint height)
+_gtk_tree_view_update_size (GtkTreeView *tree_view)
{
+ gint width, height;
GList *list;
GtkTreeViewColumn *column;
gint i;
- if (width == tree_view->priv->width &&
- height == tree_view->priv->height)
- return;
-
if (tree_view->priv->model == NULL)
{
- tree_view->priv->width = width;
- tree_view->priv->height = height;
+ tree_view->priv->width = 0;
+ tree_view->priv->height = 0;
gtk_widget_queue_draw (GTK_WIDGET (tree_view));
return;
}
- if (width == -1)
+
+ width = 0;
+ for (list = tree_view->priv->columns, i = 0; list; list = list->next, i++)
{
- width = 0;
- for (list = tree_view->priv->columns, i = 0; list; list = list->next, i++)
- {
- column = list->data;
- if (!column->visible)
- continue;
- width += TREE_VIEW_COLUMN_WIDTH (column);
- }
+ column = list->data;
+ if (!column->visible)
+ continue;
+ width += TREE_VIEW_COLUMN_WIDTH (column);
}
- if (height == -1)
- height = tree_view->priv->tree->root->offset + TREE_VIEW_VERTICAL_SEPARATOR;
-
- tree_view->priv->width = width;
- tree_view->priv->height = height;
+ height = tree_view->priv->tree->root->offset + TREE_VIEW_VERTICAL_SEPARATOR;
- if (tree_view->priv->hadjustment->upper != tree_view->priv->width)
+ if (tree_view->priv->width != width)
{
- tree_view->priv->hadjustment->upper = tree_view->priv->width;
+ tree_view->priv->width = width;
+ tree_view->priv->hadjustment->upper = width;
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->hadjustment), "changed");
}
- if (tree_view->priv->vadjustment->upper != tree_view->priv->height)
+ if (tree_view->priv->height != height)
{
+ tree_view->priv->height = height;
tree_view->priv->vadjustment->upper = tree_view->priv->height;
gtk_signal_emit_by_name (GTK_OBJECT (tree_view->priv->vadjustment), "changed");
}
{
gdk_window_resize (tree_view->priv->bin_window, MAX (width, GTK_WIDGET (tree_view)->allocation.width), height + TREE_VIEW_HEADER_HEIGHT (tree_view));
gdk_window_resize (tree_view->priv->header_window, MAX (width, GTK_WIDGET (tree_view)->allocation.width), tree_view->priv->header_height);
+
+ _gtk_tree_view_update_col_width (tree_view);
}
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
{
tree_view->priv->tree = NULL;
if (GTK_WIDGET_REALIZED (tree_view))
- _gtk_tree_view_set_size (tree_view, 0, 0);
+ _gtk_tree_view_update_size (tree_view);
return;
}
else if (GTK_WIDGET_REALIZED (tree_view))
{
gtk_tree_view_setup_model (tree_view);
- _gtk_tree_view_set_size (tree_view, -1, -1);
+ _gtk_tree_view_update_size (tree_view);
}
}
if (x2)
{
if (column->visible)
- *x2 = total_width + column->width;
+ *x2 = total_width + column->displayed_width;
else
*x2 = total_width; /* width of 0 */
}
gtk_tree_view_expand_all_helper,
tree_view);
- _gtk_tree_view_set_size (tree_view, -1,-1);
+ _gtk_tree_view_update_size (tree_view);
}
static void