-
Notifications
You must be signed in to change notification settings - Fork 71
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Potential issue when child expands container using margin #15
Comments
Hmm. I'm not sure why it's implemented the way it is. It's been a long time since I've looked at it. You might be right that this is a bug or mistake. I wonder if it would mess up anyone else's projects by making this change. Maybe it's fine to change it. Hmm. |
This change doesn't appear to break anything in my projects, and I think the suggested behavior makes more sense than the current behavior. If this change is made, I think you'd probably also want to make the same change in |
I have a use case here, the patch mentioned above would cause a calculation error. lay_id root = lay_item(ctx);
lay_set_size_xy(ctx, root, 400, 400);
lay_set_margins_ltrb(ctx, root, 50, 50, 50, 50);
lay_set_contain(ctx, root, LAY_COLUMN | LAY_WRAP);
lay_id child1 = lay_item(ctx);
lay_set_size_xy(ctx, child1 , 50, 50);
lay_set_margins_ltrb(ctx, child1 , 5, 5, 5, 5);
lay_insert(ctx, root, child1);
lay_id child2 = lay_item(ctx);
lay_set_size_xy(ctx, child2, 50, 50);
lay_set_margins_ltrb(ctx, child2, 5, 5, 5, 5);
lay_insert(ctx, root, child2);
lay_run_context(ctx);
lay_vec4 root_rect = lay_get_rect(ctx, root);
lay_vec4 child1_rect = lay_get_rect(ctx, child1);
lay_vec4 child2_rect = lay_get_rect(ctx, child2);
LTEST_VEC4EQ(root_rect, 50, 50, 60, 400);
LTEST_VEC4EQ(child1_rect, 57, 195, 50, 50);
LTEST_VEC4EQ(child2_rect, 57, 255, 50, 50); Here's my workaround: // in LAY_HCENTER case
rect[dim] += lay_scalar_max(0, (space - rect[2 + dim] - margins[wdim]) / 2); After applying the new patch, everything is perfect. This is the layout file I used for my test, which can be imported directly into the visualizer: |
I've also stumbled upon incorrect behaviour being caused by the suggested change in the original issue. However, I believe your workound incorrectly halves margins. In my application I've been using the following fix, which respects margins at the start and end of the container,
Sadly, I am unable to recall the exact case which prompted such fix |
You're right, as you can see, I'm using the nim language, and somehow copied the wrong code when translating to the C test case, here are the new expected coordinates: LTEST_VEC4EQ(root_rect, 50, 50, 60, 400);
LTEST_VEC4EQ(child1_rect, 55, 195, 50, 50);
LTEST_VEC4EQ(child2_rect, 55, 255, 50, 50);
rect[dim] += lay_scalar_max(0, (space - rect[2 + dim]) / 2 - margins[wdim]); On the bus, I'm still thinking about how x=57 is calculated, and it doesn't feel very reasonable. |
While using layout library in my project I've come across somewhat unexpected layouting behaviour.
Minimal reproducible example follows:
Equivalent code:
In a case like that I would expect the following
It can be validated by a test:
It is consistent with like other layout engines implement margins (like yoga layout or flexboxes in basically all modern browsers).
However, in current version of the library:
From my understanding, the culprit is the
lay_arrange_overlay_squeezed_range
function, specifically line 1104:The following change seems to be fixing the problem, and doesn't break any of the tests
Before submitting an actual pull request I would like to ask:
The text was updated successfully, but these errors were encountered: