summaryrefslogtreecommitdiff
path: root/docs/tree-column-sizing.txt
blob: 09e872434a038cf8ef36da13eee246246dcf64c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
The way that the GtkTreeView calculates sizing is pretty confusing.
This is written down to help keep track of it in my head, and thus help
anyone who hopes to work with the code in the future.

HOW THE GTKTREEVIEW CALCULATES SIZE:
====================================
When the view is given a new model, the first thing it does is walk
through the model at the top level, creating an GtkRBNode for each
element of the model.  Each node has a height of 0.  The RBTree is kept
updated as the models structure changes.  Additionally, the user can
expand, collapse, and select rows at this stage.  The RBTree is accurate
-- it just doesn't have a height for any row.  

When the TreeView is realized, it calculates the actual height of each
row by walking the tree and measuring them.  While doing so, it gets the
size of each column.



Columns are initially marked as 'dirty'.  When sized,
gtk_tree_view_check_dirty_and_clean () is called on each column.  This
function walks through all visible columns, and sees if they're dirty or
not.  If any are dirty, it then walks the tree, calling
gtk_tree_view_calc_size on each row.  gtk_tree_view_calc_size requests
the size of every dirty column in the tree.  Finally, it updates the
size of the widget (including adjustments).


HOW THE GTKTREEVIEWCOLUMN STORES SIZE:
======================================

There are a number of size related fields in the GtkTreeViewColumn
structure.  These are all valid after realization:

  sizing	    The sizing method to use when calculating the size
		    of the column.  Can be grow_only, resizable, auto, and fixed.

  requested_width   The width of the column as requested by the column

  width             The actual width.  This is requested width for all
		    columns but possibly the last one.

  fixed_width       The requested fixed width for the column iff it's
		    sizing type is set to GTK_TREE_VIEW_COLUMN_FIXED.

  min_width	    The minimum width the column can be

  max_width	    The maximum width the column can be.  This can be
		    overridden for the last column, if the tree_view is
		    actually wider than the sum of all of the columns
		    requested_widths.

The following invariants are true:

min_width is less than or equal to width

max_width is greater than or equal to width

(sizing == GTK_TREE_VIEW_COLUMN_FIXED) => (requested_width == fixed_width)

(column != last visible column) => width == requested_width 


/* Functions needed by gtktreeview for gtktreeviewcolumn */
size_request_button
set_width (for resizing resizable columns)
calculate_width