set the layout to 0 on all hidden childs and subchilds
This commit is contained in:
@@ -1,6 +1,20 @@
|
|||||||
<div id="display_none" style="width: 100px; height: 100px; flex-direction: row;">
|
<div id="display_none" style="width: 100px; height: 100px; flex-direction: row;">
|
||||||
<div style="flex-grow: 1;"></div>
|
<div style="flex-grow: 1;"></div>
|
||||||
<div style="flex-grow: 1; display:none;"></div>
|
<div style="flex-grow: 1; display:none;"></div>
|
||||||
<div style="flex-grow: 1;width: 100px;"></div>
|
<div style="flex-grow: 1; width: 20px;"></div>
|
||||||
<div style="flex-grow: 1;display:none;width: 100px;"></div>
|
<div style="flex-grow: 1; display:none; width: 20px;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div id="display_none_with_child" style="width: 100px; height: 100px; flex-direction: row;">
|
||||||
|
<div style="flex: 1;"></div>
|
||||||
|
<div style="flex: 1; display:none;">
|
||||||
|
<div style="flex: 1; width: 20px;"></div>
|
||||||
|
</div>
|
||||||
|
<div style="flex: 1;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="display_none_with_position" style="width: 100px; height: 100px; flex-direction: row;">
|
||||||
|
<div style="flex-grow: 1;"></div>
|
||||||
|
<div style="flex-grow: 1; display:none; top: 10px;"></div>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -29,12 +29,12 @@ TEST(YogaTest, display_none) {
|
|||||||
|
|
||||||
const YGNodeRef root_child2 = YGNodeNew();
|
const YGNodeRef root_child2 = YGNodeNew();
|
||||||
YGNodeStyleSetFlexGrow(root_child2, 1);
|
YGNodeStyleSetFlexGrow(root_child2, 1);
|
||||||
YGNodeStyleSetWidth(root_child2, 100);
|
YGNodeStyleSetWidth(root_child2, 20);
|
||||||
YGNodeInsertChild(root, root_child2, 2);
|
YGNodeInsertChild(root, root_child2, 2);
|
||||||
|
|
||||||
const YGNodeRef root_child3 = YGNodeNew();
|
const YGNodeRef root_child3 = YGNodeNew();
|
||||||
YGNodeStyleSetFlexGrow(root_child3, 1);
|
YGNodeStyleSetFlexGrow(root_child3, 1);
|
||||||
YGNodeStyleSetWidth(root_child3, 100);
|
YGNodeStyleSetWidth(root_child3, 20);
|
||||||
YGNodeStyleSetDisplay(root_child3, YGDisplayNone);
|
YGNodeStyleSetDisplay(root_child3, YGDisplayNone);
|
||||||
YGNodeInsertChild(root, root_child3, 3);
|
YGNodeInsertChild(root, root_child3, 3);
|
||||||
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||||
@@ -46,7 +46,7 @@ TEST(YogaTest, display_none) {
|
|||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
|
ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
||||||
@@ -54,9 +54,9 @@ TEST(YogaTest, display_none) {
|
|||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1));
|
||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
|
ASSERT_FLOAT_EQ(40, YGNodeLayoutGetLeft(root_child2));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
|
ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root_child2));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
|
||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
|
||||||
@@ -71,9 +71,9 @@ TEST(YogaTest, display_none) {
|
|||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetLeft(root_child0));
|
ASSERT_FLOAT_EQ(60, YGNodeLayoutGetLeft(root_child0));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child0));
|
ASSERT_FLOAT_EQ(40, YGNodeLayoutGetWidth(root_child0));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
||||||
@@ -83,7 +83,7 @@ TEST(YogaTest, display_none) {
|
|||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child2));
|
ASSERT_FLOAT_EQ(60, YGNodeLayoutGetWidth(root_child2));
|
||||||
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
|
||||||
|
|
||||||
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child3));
|
||||||
@@ -93,3 +93,145 @@ TEST(YogaTest, display_none) {
|
|||||||
|
|
||||||
YGNodeFreeRecursive(root);
|
YGNodeFreeRecursive(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(YogaTest, display_none_with_child) {
|
||||||
|
const YGNodeRef root = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
|
||||||
|
YGNodeStyleSetWidth(root, 100);
|
||||||
|
YGNodeStyleSetHeight(root, 100);
|
||||||
|
|
||||||
|
const YGNodeRef root_child0 = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexGrow(root_child0, 1);
|
||||||
|
YGNodeStyleSetFlexShrink(root_child0, 1);
|
||||||
|
YGNodeStyleSetFlexBasisPercent(root_child0, 0);
|
||||||
|
YGNodeInsertChild(root, root_child0, 0);
|
||||||
|
|
||||||
|
const YGNodeRef root_child1 = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexGrow(root_child1, 1);
|
||||||
|
YGNodeStyleSetFlexShrink(root_child1, 1);
|
||||||
|
YGNodeStyleSetFlexBasisPercent(root_child1, 0);
|
||||||
|
YGNodeStyleSetDisplay(root_child1, YGDisplayNone);
|
||||||
|
YGNodeInsertChild(root, root_child1, 1);
|
||||||
|
|
||||||
|
const YGNodeRef root_child1_child0 = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexGrow(root_child1_child0, 1);
|
||||||
|
YGNodeStyleSetFlexShrink(root_child1_child0, 1);
|
||||||
|
YGNodeStyleSetFlexBasisPercent(root_child1_child0, 0);
|
||||||
|
YGNodeStyleSetWidth(root_child1_child0, 20);
|
||||||
|
YGNodeStyleSetMinWidth(root_child1_child0, 0);
|
||||||
|
YGNodeStyleSetMinHeight(root_child1_child0, 0);
|
||||||
|
YGNodeInsertChild(root_child1, root_child1_child0, 0);
|
||||||
|
|
||||||
|
const YGNodeRef root_child2 = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexGrow(root_child2, 1);
|
||||||
|
YGNodeStyleSetFlexShrink(root_child2, 1);
|
||||||
|
YGNodeStyleSetFlexBasisPercent(root_child2, 0);
|
||||||
|
YGNodeInsertChild(root, root_child2, 2);
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1_child0));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child2));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
|
||||||
|
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child2));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
|
||||||
|
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetLeft(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1_child0));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child2));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child2));
|
||||||
|
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetWidth(root_child2));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child2));
|
||||||
|
|
||||||
|
YGNodeFreeRecursive(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(YogaTest, display_none_with_position) {
|
||||||
|
const YGNodeRef root = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow);
|
||||||
|
YGNodeStyleSetWidth(root, 100);
|
||||||
|
YGNodeStyleSetHeight(root, 100);
|
||||||
|
|
||||||
|
const YGNodeRef root_child0 = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexGrow(root_child0, 1);
|
||||||
|
YGNodeInsertChild(root, root_child0, 0);
|
||||||
|
|
||||||
|
const YGNodeRef root_child1 = YGNodeNew();
|
||||||
|
YGNodeStyleSetFlexGrow(root_child1, 1);
|
||||||
|
YGNodeStyleSetPosition(root_child1, YGEdgeTop, 10);
|
||||||
|
YGNodeStyleSetDisplay(root_child1, YGDisplayNone);
|
||||||
|
YGNodeInsertChild(root, root_child1, 1);
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1));
|
||||||
|
|
||||||
|
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0));
|
||||||
|
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetHeight(root_child0));
|
||||||
|
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(root_child1));
|
||||||
|
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(root_child1));
|
||||||
|
|
||||||
|
YGNodeFreeRecursive(root);
|
||||||
|
}
|
||||||
|
12
yoga/Yoga.c
12
yoga/Yoga.c
@@ -1649,6 +1649,15 @@ static bool YGNodeFixedSizeSetMeasuredDimensions(const YGNodeRef node,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void YGZeroOutLayoutRecursivly(const YGNodeRef node) {
|
||||||
|
node->layout.dimensions[YGDimensionHeight] = 0;
|
||||||
|
node->layout.dimensions[YGDimensionWidth] = 0;
|
||||||
|
for (uint32_t i = 0; i < YGNodeGetChildCount(node); i++) {
|
||||||
|
const YGNodeRef child = YGNodeListGet(node->children, i);
|
||||||
|
YGZeroOutLayoutRecursivly(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is the main routine that implements a subset of the flexbox layout
|
// This is the main routine that implements a subset of the flexbox layout
|
||||||
// algorithm
|
// algorithm
|
||||||
@@ -1919,8 +1928,7 @@ static void YGNodelayoutImpl(const YGNodeRef node,
|
|||||||
for (uint32_t i = 0; i < childCount; i++) {
|
for (uint32_t i = 0; i < childCount; i++) {
|
||||||
const YGNodeRef child = YGNodeListGet(node->children, i);
|
const YGNodeRef child = YGNodeListGet(node->children, i);
|
||||||
if (child->style.display == YGDisplayNone) {
|
if (child->style.display == YGDisplayNone) {
|
||||||
child->layout.dimensions[YGDimensionHeight] = 0;
|
YGZeroOutLayoutRecursivly(child);
|
||||||
child->layout.dimensions[YGDimensionWidth] = 0;
|
|
||||||
child->hasNewLayout = true;
|
child->hasNewLayout = true;
|
||||||
child->isDirty = false;
|
child->isDirty = false;
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user