flow-layout: Provide a preferred size
The FlowLayout fails to provide a preferred size in case no sizing is specified on one axis. It should, instead, have the preferred size of the sum of its children, depending on the orientation property. http://bugzilla.openedhand.com/show_bug.cgi?id=2013
This commit is contained in:
parent
e3fba5f2e8
commit
aba6c5acc7
2 changed files with 82 additions and 30 deletions
|
@ -217,21 +217,18 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
|
|||
item_y = 0;
|
||||
|
||||
/* clear the line width arrays */
|
||||
if (priv->orientation == CLUTTER_FLOW_VERTICAL && for_height > 0)
|
||||
{
|
||||
if (priv->line_min != NULL)
|
||||
g_array_free (priv->line_min, TRUE);
|
||||
if (priv->line_min != NULL)
|
||||
g_array_free (priv->line_min, TRUE);
|
||||
|
||||
if (priv->line_natural != NULL)
|
||||
g_array_free (priv->line_natural, TRUE);
|
||||
if (priv->line_natural != NULL)
|
||||
g_array_free (priv->line_natural, TRUE);
|
||||
|
||||
priv->line_min = g_array_sized_new (FALSE, FALSE,
|
||||
priv->line_min = g_array_sized_new (FALSE, FALSE,
|
||||
sizeof (gfloat),
|
||||
16);
|
||||
priv->line_natural = g_array_sized_new (FALSE, FALSE,
|
||||
sizeof (gfloat),
|
||||
16);
|
||||
priv->line_natural = g_array_sized_new (FALSE, FALSE,
|
||||
sizeof (gfloat),
|
||||
16);
|
||||
}
|
||||
|
||||
if (children)
|
||||
line_count = 1;
|
||||
|
@ -292,6 +289,8 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
|
|||
max_min_width = MAX (max_min_width, child_min);
|
||||
max_natural_width = MAX (max_natural_width, child_natural);
|
||||
|
||||
total_min_width += max_min_width;
|
||||
total_natural_width += max_natural_width;
|
||||
line_count += 1;
|
||||
}
|
||||
}
|
||||
|
@ -321,6 +320,7 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
|
|||
}
|
||||
|
||||
priv->line_count = line_count;
|
||||
|
||||
if (priv->line_count > 0)
|
||||
{
|
||||
gfloat total_spacing;
|
||||
|
@ -331,6 +331,30 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
|
|||
total_natural_width += total_spacing;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_array_append_val (priv->line_min, line_min_width);
|
||||
g_array_append_val (priv->line_natural, line_natural_width);
|
||||
|
||||
priv->line_count = line_count;
|
||||
|
||||
if (priv->line_count > 0)
|
||||
{
|
||||
gfloat total_spacing;
|
||||
|
||||
total_spacing = priv->col_spacing * (priv->line_count - 1);
|
||||
|
||||
total_min_width += total_spacing;
|
||||
total_natural_width += total_spacing;
|
||||
}
|
||||
}
|
||||
|
||||
CLUTTER_NOTE (LAYOUT,
|
||||
"Flow[w]: %d lines (%d per line): w [ %.2f, %.2f ] for h %.2f",
|
||||
n_rows, priv->line_count,
|
||||
total_min_width,
|
||||
total_natural_width,
|
||||
for_height);
|
||||
|
||||
if (min_width_p)
|
||||
*min_width_p = total_min_width;
|
||||
|
@ -368,21 +392,18 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
|
|||
item_x = 0;
|
||||
|
||||
/* clear the line height arrays */
|
||||
if (priv->orientation == CLUTTER_FLOW_HORIZONTAL && for_width > 0)
|
||||
{
|
||||
if (priv->line_min != NULL)
|
||||
g_array_free (priv->line_min, TRUE);
|
||||
if (priv->line_min != NULL)
|
||||
g_array_free (priv->line_min, TRUE);
|
||||
|
||||
if (priv->line_natural != NULL)
|
||||
g_array_free (priv->line_natural, TRUE);
|
||||
if (priv->line_natural != NULL)
|
||||
g_array_free (priv->line_natural, TRUE);
|
||||
|
||||
priv->line_min = g_array_sized_new (FALSE, FALSE,
|
||||
priv->line_min = g_array_sized_new (FALSE, FALSE,
|
||||
sizeof (gfloat),
|
||||
16);
|
||||
priv->line_natural = g_array_sized_new (FALSE, FALSE,
|
||||
sizeof (gfloat),
|
||||
16);
|
||||
priv->line_natural = g_array_sized_new (FALSE, FALSE,
|
||||
sizeof (gfloat),
|
||||
16);
|
||||
}
|
||||
|
||||
if (children)
|
||||
line_count = 1;
|
||||
|
@ -443,6 +464,9 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
|
|||
max_min_height = MAX (max_min_height, child_min);
|
||||
max_natural_height = MAX (max_natural_height, child_natural);
|
||||
|
||||
total_min_height += max_min_height;
|
||||
total_natural_height += max_natural_height;
|
||||
|
||||
line_count += 1;
|
||||
}
|
||||
}
|
||||
|
@ -482,6 +506,30 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
|
|||
total_natural_height += total_spacing;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_array_append_val (priv->line_min, line_min_height);
|
||||
g_array_append_val (priv->line_natural, line_natural_height);
|
||||
|
||||
priv->line_count = line_count;
|
||||
|
||||
if (priv->line_count > 0)
|
||||
{
|
||||
gfloat total_spacing;
|
||||
|
||||
total_spacing = priv->col_spacing * priv->line_count;
|
||||
|
||||
total_min_height += total_spacing;
|
||||
total_natural_height += total_spacing;
|
||||
}
|
||||
}
|
||||
|
||||
CLUTTER_NOTE (LAYOUT,
|
||||
"Flow[h]: %d lines (%d per line): w [ %.2f, %.2f ] for h %.2f",
|
||||
n_columns, priv->line_count,
|
||||
total_min_height,
|
||||
total_natural_height,
|
||||
for_width);
|
||||
|
||||
if (min_height_p)
|
||||
*min_height_p = total_min_height;
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
static gboolean is_homogeneous = FALSE;
|
||||
static gboolean vertical = FALSE;
|
||||
static gboolean random_size = FALSE;
|
||||
static gboolean fit_to_stage = FALSE;
|
||||
|
||||
static gint n_rects = N_RECTS;
|
||||
static gint x_spacing = 0;
|
||||
|
@ -56,6 +57,13 @@ static GOptionEntry entries[] = {
|
|||
&y_spacing,
|
||||
"Vertical spacing between elements", "PX"
|
||||
},
|
||||
{
|
||||
"fit-to-stage", 0,
|
||||
0,
|
||||
G_OPTION_ARG_NONE,
|
||||
&fit_to_stage,
|
||||
"Fit to the stage size", NULL
|
||||
},
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
@ -118,11 +126,6 @@ test_flow_layout_main (int argc, char *argv[])
|
|||
clutter_container_add_actor (CLUTTER_CONTAINER (stage), box);
|
||||
clutter_actor_set_position (box, 0, 0);
|
||||
|
||||
if (vertical)
|
||||
clutter_actor_set_height (box, 480);
|
||||
else
|
||||
clutter_actor_set_width (box, 640);
|
||||
|
||||
clutter_actor_set_name (box, "box");
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
|
@ -158,9 +161,10 @@ test_flow_layout_main (int argc, char *argv[])
|
|||
g_free (name);
|
||||
}
|
||||
|
||||
g_signal_connect (stage,
|
||||
"allocation-changed", G_CALLBACK (on_stage_resize),
|
||||
box);
|
||||
if (fit_to_stage)
|
||||
g_signal_connect (stage,
|
||||
"allocation-changed", G_CALLBACK (on_stage_resize),
|
||||
box);
|
||||
|
||||
clutter_actor_show_all (stage);
|
||||
|
||||
|
|
Loading…
Reference in a new issue