Open
Description
node1 is root node. with LAY_WRAP | LAY_COLUMN
flags. margin 5, 5, 5, 5
node2 is a child of node1. margin 5, 5, 5, 5
node3 is a child of node2. margin 5, 5, 5, 5
test case:
// Incorrect results:
// root, 50, 50, 60, 200
// node2, 55, 125, 50, 50
// node3, 5, 125, 50, 50
// Expected result:
// node3, 60, 130, 50, 50
lay_id root = lay_item(ctx);
lay_set_size_xy(ctx, root, 200, 200);
lay_set_margins_ltrb(ctx, root, 50, 50, 50, 50);
lay_set_contain(ctx, root, LAY_WRAP | LAY_COLUMN);
lay_id node2 = lay_item(ctx);
lay_set_size_xy(ctx, node2, 50, 50);
lay_set_margins_ltrb(ctx, node2, 5, 5, 5, 5);
lay_insert(ctx, root, node2);
lay_id node3 = lay_item(ctx);
lay_set_size_xy(ctx, node3, 50, 50);
lay_set_margins_ltrb(ctx, node3, 5, 5, 5, 5);
lay_insert(ctx, node2, node3);
lay_run_context(ctx);
Here's my workground code that seems to fix this:
// in lay_arrange
case LAY_COLUMN | LAY_WRAP:
if (dim != 0) {
lay_arrange_stacked(ctx, item, 1, true);
// note: The x-coordinates are recalculated here,
// but the child nodes are not recursively updated, so just add the relevant code
lay_scalar offset = lay_arrange_wrapped_overlay_squeezed(ctx, item, 0);
ctx->rects[item][2 + 0] = offset - ctx->rects[item][0];
// ----- workground begin
lay_id child = pitem->first_child;
while (child != LAY_INVALID_ID) {
// NOTE: this is recursive and will run out of stack space if items are
// nested too deeply.
lay_arrange(ctx, child, 0);
lay_item_t *pchild = lay_get_item(ctx, child);
child = pchild->next_sibling;
}
break;
// ----- workground end
}
// ----- workground begin
return;
// ----- workground end
break;
The patch in issue #15 needs to be used (lay_arrange_overlay and lay_arrange_overlay_squeezed_range).
Exported layout files:
grandsonx.json
Metadata
Metadata
Assignees
Labels
No labels