diff options
author | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-10-11 21:45:42 +0900 |
---|---|---|
committer | Tristan Van Berkom <tristan.van.berkom@gmail.com> | 2010-10-11 21:45:42 +0900 |
commit | 7f691b2df21ae0abc330501f906a947ec3892eb5 (patch) | |
tree | f95cd3dc2e1e1256362104f3132210e76dd233c5 /gtk/gtkspreadtable.c | |
parent | 7db09805f6f7ea64984963b3234eba13b995458d (diff) | |
download | gtk+-spread-table.tar.gz |
Allow single line GtkSpreadTablespread-table
Added exception for single line spread table and
updated test case to allow configuration to a single line.
Diffstat (limited to 'gtk/gtkspreadtable.c')
-rw-r--r-- | gtk/gtkspreadtable.c | 83 |
1 files changed, 49 insertions, 34 deletions
diff --git a/gtk/gtkspreadtable.c b/gtk/gtkspreadtable.c index 68135226d7..c2bdec1e93 100644 --- a/gtk/gtkspreadtable.c +++ b/gtk/gtkspreadtable.c @@ -162,7 +162,7 @@ gtk_spread_table_class_init (GtkSpreadTableClass *class) P_("Lines"), P_("The number of lines (rows/columns) to " "evenly distribute children to."), - DEFAULT_LINES, + 1, 65535, DEFAULT_LINES, G_PARAM_READABLE | G_PARAM_WRITABLE)); @@ -498,45 +498,54 @@ segment_lines_for_size (GtkSpreadTable *table, upper = get_segment_length (table, line_thickness, children); lower = upper / priv->lines; - /* Start with half way between the average and total height */ - segment_size = lower + (upper - lower) / 2; - - while (segment_size > lower && segment_size < upper) + /* Handle a single line spread table as a special case */ + if (priv->lines == 1) { - gint test_largest = 0; - - if (children_fit_segment_size (table, children, line_thickness, - segment_size, test_counts, &test_largest)) - { - upper = segment_size; - segment_size -= (segment_size - lower) / 2; - - /* Save the last arrangement that 'fit' */ - largest_size = test_largest; - memcpy (segment_counts, test_counts, sizeof (gint) * priv->lines); - } - else - { - lower = segment_size; - segment_size += (upper - segment_size) / 2; - } + segment_counts[0] = g_list_length (children); + largest_size = upper; } - - /* Perform some corrections: fill in any trailing columns that are missing widgets */ - for (i = 0; i < priv->lines; i++) + else { - /* If this column has no widgets... */ - if (!segment_counts[i]) + /* Start with half way between the average and total height */ + segment_size = lower + (upper - lower) / 2; + + while (segment_size > lower && segment_size < upper) + { + gint test_largest = 0; + + if (children_fit_segment_size (table, children, line_thickness, + segment_size, test_counts, &test_largest)) + { + upper = segment_size; + segment_size -= (segment_size - lower) / 2; + + /* Save the last arrangement that 'fit' */ + largest_size = test_largest; + memcpy (segment_counts, test_counts, sizeof (gint) * priv->lines); + } + else + { + lower = segment_size; + segment_size += (upper - segment_size) / 2; + } + } + + /* Perform some corrections: fill in any trailing columns that are missing widgets */ + for (i = 0; i < priv->lines; i++) { - /* rewind to the last column that had more than 1 widget */ - for (j = i - 1; j >= 0; j--) + /* If this column has no widgets... */ + if (!segment_counts[i]) { - if (segment_counts[j] > 1) + /* rewind to the last column that had more than 1 widget */ + for (j = i - 1; j >= 0; j--) { - /* put an available widget in the empty column */ - segment_counts[j]--; - segment_counts[i]++; - break; + if (segment_counts[j] > 1) + { + /* put an available widget in the empty column */ + segment_counts[j]--; + segment_counts[i]++; + break; + } } } } @@ -987,6 +996,11 @@ gtk_spread_table_get_child_line (GtkSpreadTable *table, * * Sets the fixed amount of lines (rows or columns) to * distribute children to. + * + * <note><para>Space will be allocated for all lines even + * if there are not enough children to be placed on every + * line, for instance if @lines is set to 4 and the table + * has only 3 children; then the last line will appear empty.</para></note> */ void gtk_spread_table_set_lines (GtkSpreadTable *table, @@ -995,6 +1009,7 @@ gtk_spread_table_set_lines (GtkSpreadTable *table, GtkSpreadTablePrivate *priv; g_return_if_fail (GTK_IS_SPREAD_TABLE (table)); + g_return_if_fail (lines > 0); priv = table->priv; |