Port remaining layout managers to the new child iteration API

TableLayout and FlowLayout now use the ClutterActor API for iterating
over the children of an actor.
This commit is contained in:
Emmanuele Bassi 2011-12-18 11:26:29 +00:00
parent 9c9ab42060
commit 7e377b5aee
2 changed files with 82 additions and 60 deletions

View File

@ -202,11 +202,11 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
gfloat *nat_width_p) gfloat *nat_width_p)
{ {
ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv; ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv;
GList *l, *children = clutter_container_get_children (container);
gint n_rows, line_item_count, line_count; gint n_rows, line_item_count, line_count;
gfloat total_min_width, total_natural_width; gfloat total_min_width, total_natural_width;
gfloat line_min_width, line_natural_width; gfloat line_min_width, line_natural_width;
gfloat max_min_width, max_natural_width; gfloat max_min_width, max_natural_width;
ClutterActor *actor, *child;
gfloat item_y; gfloat item_y;
n_rows = get_rows (CLUTTER_FLOW_LAYOUT (manager), for_height); n_rows = get_rows (CLUTTER_FLOW_LAYOUT (manager), for_height);
@ -222,6 +222,8 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
item_y = 0; item_y = 0;
actor = CLUTTER_ACTOR (container);
/* clear the line width arrays */ /* clear the line width arrays */
if (priv->line_min != NULL) if (priv->line_min != NULL)
g_array_free (priv->line_min, TRUE); g_array_free (priv->line_min, TRUE);
@ -236,14 +238,15 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
sizeof (gfloat), sizeof (gfloat),
16); 16);
if (children) if (clutter_actor_get_n_children (actor) != 0)
line_count = 1; line_count = 1;
max_min_width = max_natural_width = 0; max_min_width = max_natural_width = 0;
for (l = children; l != NULL; l = l->next) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
gfloat child_min, child_natural; gfloat child_min, child_natural;
gfloat new_y, item_height; gfloat new_y, item_height;
@ -301,8 +304,6 @@ clutter_flow_layout_get_preferred_width (ClutterLayoutManager *manager,
} }
} }
g_list_free (children);
priv->col_width = max_natural_width; priv->col_width = max_natural_width;
if (priv->max_col_width > 0 && priv->col_width > priv->max_col_width) if (priv->max_col_width > 0 && priv->col_width > priv->max_col_width)
@ -379,11 +380,11 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
gfloat *nat_height_p) gfloat *nat_height_p)
{ {
ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv; ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv;
GList *l, *children = clutter_container_get_children (container);
gint n_columns, line_item_count, line_count; gint n_columns, line_item_count, line_count;
gfloat total_min_height, total_natural_height; gfloat total_min_height, total_natural_height;
gfloat line_min_height, line_natural_height; gfloat line_min_height, line_natural_height;
gfloat max_min_height, max_natural_height; gfloat max_min_height, max_natural_height;
ClutterActor *actor, *child;
gfloat item_x; gfloat item_x;
n_columns = get_columns (CLUTTER_FLOW_LAYOUT (manager), for_width); n_columns = get_columns (CLUTTER_FLOW_LAYOUT (manager), for_width);
@ -399,6 +400,8 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
item_x = 0; item_x = 0;
actor = CLUTTER_ACTOR (container);
/* clear the line height arrays */ /* clear the line height arrays */
if (priv->line_min != NULL) if (priv->line_min != NULL)
g_array_free (priv->line_min, TRUE); g_array_free (priv->line_min, TRUE);
@ -413,14 +416,15 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
sizeof (gfloat), sizeof (gfloat),
16); 16);
if (children) if (clutter_actor_get_n_children (actor) != 0)
line_count = 1; line_count = 1;
max_min_height = max_natural_height = 0; max_min_height = max_natural_height = 0;
for (l = children; l != NULL; l = l->next) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
gfloat child_min, child_natural; gfloat child_min, child_natural;
gfloat new_x, item_width; gfloat new_x, item_width;
@ -479,8 +483,6 @@ clutter_flow_layout_get_preferred_height (ClutterLayoutManager *manager,
} }
} }
g_list_free (children);
priv->row_height = max_natural_height; priv->row_height = max_natural_height;
if (priv->max_row_height > 0 && priv->row_height > priv->max_row_height) if (priv->max_row_height > 0 && priv->row_height > priv->max_row_height)
@ -555,7 +557,7 @@ clutter_flow_layout_allocate (ClutterLayoutManager *manager,
ClutterAllocationFlags flags) ClutterAllocationFlags flags)
{ {
ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv; ClutterFlowLayoutPrivate *priv = CLUTTER_FLOW_LAYOUT (manager)->priv;
GList *l, *children = clutter_container_get_children (container); ClutterActor *actor, *child;
gfloat x_off, y_off; gfloat x_off, y_off;
gfloat avail_width, avail_height; gfloat avail_width, avail_height;
gfloat item_x, item_y; gfloat item_x, item_y;
@ -563,7 +565,8 @@ clutter_flow_layout_allocate (ClutterLayoutManager *manager,
gint items_per_line; gint items_per_line;
gint line_index; gint line_index;
if (children == NULL) actor = CLUTTER_ACTOR (container);
if (clutter_actor_get_n_children (actor) == 0)
return; return;
clutter_actor_box_get_origin (allocation, &x_off, &y_off); clutter_actor_box_get_origin (allocation, &x_off, &y_off);
@ -593,9 +596,10 @@ clutter_flow_layout_allocate (ClutterLayoutManager *manager,
line_item_count = 0; line_item_count = 0;
line_index = 0; line_index = 0;
for (l = children; l != NULL; l = l->next) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
ClutterActorBox child_alloc; ClutterActorBox child_alloc;
gfloat item_width, item_height; gfloat item_width, item_height;
gfloat new_x, new_y; gfloat new_x, new_y;
@ -703,8 +707,6 @@ clutter_flow_layout_allocate (ClutterLayoutManager *manager,
line_item_count += 1; line_item_count += 1;
} }
g_list_free (children);
} }
static void static void

View File

@ -708,29 +708,35 @@ clutter_table_layout_set_container (ClutterLayoutManager *layout,
static void static void
update_row_col (ClutterTableLayout *layout, update_row_col (ClutterTableLayout *layout,
ClutterContainer *container) ClutterContainer *container)
{ {
ClutterTableLayoutPrivate *priv = layout->priv; ClutterTableLayoutPrivate *priv = layout->priv;
ClutterLayoutManager *manager = CLUTTER_LAYOUT_MANAGER (layout); ClutterLayoutManager *manager = CLUTTER_LAYOUT_MANAGER (layout);
GList *children, *l; ClutterActor *actor, *child;
gint n_cols, n_rows; gint n_cols, n_rows;
n_cols = n_rows = 0; n_cols = n_rows = 0;
children = container ? clutter_container_get_children (container) : NULL;
for (l = children; l; l = g_list_next (l)) if (container == NULL)
goto out;
actor = CLUTTER_ACTOR (container);
for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
ClutterTableChild *meta; ClutterTableChild *meta;
meta = CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (manager, container, child)); meta =
CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (manager,
container,
child));
n_cols = MAX (n_cols, meta->col + meta->col_span); n_cols = MAX (n_cols, meta->col + meta->col_span);
n_rows = MAX (n_rows, meta->row + meta->row_span); n_rows = MAX (n_rows, meta->row + meta->row_span);
} }
g_list_free (children); out:
priv->n_cols = n_cols; priv->n_cols = n_cols;
priv->n_rows = n_rows; priv->n_rows = n_rows;
@ -743,9 +749,9 @@ calculate_col_widths (ClutterTableLayout *self,
{ {
ClutterTableLayoutPrivate *priv = self->priv; ClutterTableLayoutPrivate *priv = self->priv;
ClutterLayoutManager *manager = CLUTTER_LAYOUT_MANAGER (self); ClutterLayoutManager *manager = CLUTTER_LAYOUT_MANAGER (self);
ClutterActor *actor, *child;
gint i; gint i;
DimensionData *columns; DimensionData *columns;
GList *l, *children;
update_row_col (self, container); update_row_col (self, container);
g_array_set_size (priv->columns, 0); g_array_set_size (priv->columns, 0);
@ -757,12 +763,13 @@ calculate_col_widths (ClutterTableLayout *self,
for (i = 0; i < priv->n_cols; i++) for (i = 0; i < priv->n_cols; i++)
columns[i].visible = FALSE; columns[i].visible = FALSE;
children = clutter_container_get_children (container); actor = CLUTTER_ACTOR (container);
/* STAGE ONE: calculate column widths for non-spanned children */ /* STAGE ONE: calculate column widths for non-spanned children */
for (l = children; l; l = g_list_next (l)) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
ClutterTableChild *meta; ClutterTableChild *meta;
DimensionData *col; DimensionData *col;
gfloat c_min, c_pref; gfloat c_min, c_pref;
@ -770,8 +777,10 @@ calculate_col_widths (ClutterTableLayout *self,
if (!CLUTTER_ACTOR_IS_VISIBLE (child)) if (!CLUTTER_ACTOR_IS_VISIBLE (child))
continue; continue;
meta = (ClutterTableChild *) meta =
clutter_layout_manager_get_child_meta (manager, container, child); CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (manager,
container,
child));
if (meta->col_span > 1) if (meta->col_span > 1)
continue; continue;
@ -792,9 +801,10 @@ calculate_col_widths (ClutterTableLayout *self,
} }
/* STAGE TWO: take spanning children into account */ /* STAGE TWO: take spanning children into account */
for (l = children; l; l = g_list_next (l)) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
ClutterTableChild *meta; ClutterTableChild *meta;
DimensionData *col; DimensionData *col;
gfloat c_min, c_pref; gfloat c_min, c_pref;
@ -805,8 +815,10 @@ calculate_col_widths (ClutterTableLayout *self,
if (!CLUTTER_ACTOR_IS_VISIBLE (child)) if (!CLUTTER_ACTOR_IS_VISIBLE (child))
continue; continue;
meta = (ClutterTableChild *) meta =
clutter_layout_manager_get_child_meta (manager, container, child); CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (manager,
container,
child));
if (meta->col_span < 2) if (meta->col_span < 2)
continue; continue;
@ -890,7 +902,6 @@ calculate_col_widths (ClutterTableLayout *self,
} }
g_list_free (children);
/* calculate final widths */ /* calculate final widths */
if (for_width >= 0) if (for_width >= 0)
@ -901,6 +912,7 @@ calculate_col_widths (ClutterTableLayout *self,
min_width = 0; min_width = 0;
pref_width = 0; pref_width = 0;
n_expand = 0; n_expand = 0;
for (i = 0; i < self->priv->n_cols; i++) for (i = 0; i < self->priv->n_cols; i++)
{ {
pref_width += columns[i].pref_size; pref_width += columns[i].pref_size;
@ -908,6 +920,7 @@ calculate_col_widths (ClutterTableLayout *self,
if (columns[i].expand) if (columns[i].expand)
n_expand++; n_expand++;
} }
pref_width += priv->col_spacing * (priv->n_cols - 1); pref_width += priv->col_spacing * (priv->n_cols - 1);
min_width += priv->col_spacing * (priv->n_cols - 1); min_width += priv->col_spacing * (priv->n_cols - 1);
@ -1003,7 +1016,7 @@ calculate_row_heights (ClutterTableLayout *self,
{ {
ClutterTableLayoutPrivate *priv = self->priv; ClutterTableLayoutPrivate *priv = self->priv;
ClutterLayoutManager *manager = CLUTTER_LAYOUT_MANAGER (self); ClutterLayoutManager *manager = CLUTTER_LAYOUT_MANAGER (self);
GList *l, *children; ClutterActor *actor, *child;
gint i; gint i;
DimensionData *rows, *columns; DimensionData *rows, *columns;
@ -1019,11 +1032,13 @@ calculate_row_heights (ClutterTableLayout *self,
for (i = 0; i < priv->n_rows; i++) for (i = 0; i < priv->n_rows; i++)
rows[i].visible = FALSE; rows[i].visible = FALSE;
children = clutter_container_get_children (container); actor = CLUTTER_ACTOR (container);
/* STAGE ONE: calculate row heights for non-spanned children */ /* STAGE ONE: calculate row heights for non-spanned children */
for (l = children; l; l = g_list_next (l)) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
ClutterTableChild *meta; ClutterTableChild *meta;
DimensionData *row; DimensionData *row;
gfloat c_min, c_pref; gfloat c_min, c_pref;
@ -1031,8 +1046,10 @@ calculate_row_heights (ClutterTableLayout *self,
if (!CLUTTER_ACTOR_IS_VISIBLE (child)) if (!CLUTTER_ACTOR_IS_VISIBLE (child))
continue; continue;
meta = (ClutterTableChild *) meta =
clutter_layout_manager_get_child_meta (manager, container, child); CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (manager,
container,
child));
if (meta->row_span > 1) if (meta->row_span > 1)
continue; continue;
@ -1053,12 +1070,11 @@ calculate_row_heights (ClutterTableLayout *self,
row->expand = MAX (row->expand, meta->y_expand); row->expand = MAX (row->expand, meta->y_expand);
} }
/* STAGE TWO: take spanning children into account */ /* STAGE TWO: take spanning children into account */
for (l = children; l; l = g_list_next (l)) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = l->data;
ClutterTableChild *meta; ClutterTableChild *meta;
gfloat c_min, c_pref; gfloat c_min, c_pref;
gfloat min_height, pref_height; gfloat min_height, pref_height;
@ -1068,8 +1084,10 @@ calculate_row_heights (ClutterTableLayout *self,
if (!CLUTTER_ACTOR_IS_VISIBLE (child)) if (!CLUTTER_ACTOR_IS_VISIBLE (child))
continue; continue;
meta = (ClutterTableChild *) meta =
clutter_layout_manager_get_child_meta (manager, container, child); CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (manager,
container,
child));
if (meta->row_span < 2) if (meta->row_span < 2)
continue; continue;
@ -1165,8 +1183,6 @@ calculate_row_heights (ClutterTableLayout *self,
} }
g_list_free (children);
/* calculate final heights */ /* calculate final heights */
if (for_height >= 0) if (for_height >= 0)
{ {
@ -1176,6 +1192,7 @@ calculate_row_heights (ClutterTableLayout *self,
min_height = 0; min_height = 0;
pref_height = 0; pref_height = 0;
n_expand = 0; n_expand = 0;
for (i = 0; i < self->priv->n_rows; i++) for (i = 0; i < self->priv->n_rows; i++)
{ {
pref_height += rows[i].pref_size; pref_height += rows[i].pref_size;
@ -1183,6 +1200,7 @@ calculate_row_heights (ClutterTableLayout *self,
if (rows[i].expand) if (rows[i].expand)
n_expand++; n_expand++;
} }
pref_height += priv->row_spacing * (priv->n_rows - 1); pref_height += priv->row_spacing * (priv->n_rows - 1);
min_height += priv->row_spacing * (priv->n_rows - 1); min_height += priv->row_spacing * (priv->n_rows - 1);
@ -1387,7 +1405,7 @@ clutter_table_layout_allocate (ClutterLayoutManager *layout,
{ {
ClutterTableLayout *self = CLUTTER_TABLE_LAYOUT (layout); ClutterTableLayout *self = CLUTTER_TABLE_LAYOUT (layout);
ClutterTableLayoutPrivate *priv = self->priv; ClutterTableLayoutPrivate *priv = self->priv;
GList *list, *children; ClutterActor *actor, *child;
gint row_spacing, col_spacing; gint row_spacing, col_spacing;
gint i; gint i;
DimensionData *rows, *columns; DimensionData *rows, *columns;
@ -1396,8 +1414,9 @@ clutter_table_layout_allocate (ClutterLayoutManager *layout,
if (priv->n_cols < 1 || priv->n_rows < 1) if (priv->n_cols < 1 || priv->n_rows < 1)
return; return;
children = clutter_container_get_children (container); actor = CLUTTER_ACTOR (container);
if (children == NULL)
if (clutter_actor_get_n_children (actor) == 0)
return; return;
col_spacing = (priv->col_spacing); col_spacing = (priv->col_spacing);
@ -1410,9 +1429,10 @@ clutter_table_layout_allocate (ClutterLayoutManager *layout,
rows = (DimensionData *) priv->rows->data; rows = (DimensionData *) priv->rows->data;
columns = (DimensionData *) priv->columns->data; columns = (DimensionData *) priv->columns->data;
for (list = children; list; list = g_list_next (list)) for (child = clutter_actor_get_first_child (actor);
child != NULL;
child = clutter_actor_get_next_sibling (child))
{ {
ClutterActor *child = list->data;
gint row, col, row_span, col_span; gint row, col, row_span, col_span;
gint col_width, row_height; gint col_width, row_height;
ClutterTableChild *meta; ClutterTableChild *meta;
@ -1424,8 +1444,10 @@ clutter_table_layout_allocate (ClutterLayoutManager *layout,
if (!CLUTTER_ACTOR_IS_VISIBLE (child)) if (!CLUTTER_ACTOR_IS_VISIBLE (child))
continue; continue;
meta = (ClutterTableChild *) meta =
clutter_layout_manager_get_child_meta (layout, priv->container, child); CLUTTER_TABLE_CHILD (clutter_layout_manager_get_child_meta (layout,
container,
child));
/* get child properties */ /* get child properties */
col = meta->col; col = meta->col;
@ -1560,8 +1582,6 @@ clutter_table_layout_allocate (ClutterLayoutManager *layout,
do_allocate: do_allocate:
clutter_actor_allocate (child, &childbox, flags); clutter_actor_allocate (child, &childbox, flags);
} }
g_list_free (children);
} }
static ClutterAlpha * static ClutterAlpha *