Unverified Commit 3f0024e1 authored by Mjk's avatar Mjk Committed by GitHub

Fix compute intrinsic size for wrap (#55469)

parent 3a67a8bb
......@@ -54,3 +54,4 @@ Cédric Wyss <cedi.wyss@gmail.com>
Michel Feinstein <michel@feinstein.com.br>
Michael Lee <ckmichael8@gmail.com>
Katarina Sheremet <katarina@sheremet.ch>
Mikhail Zotyev <mbixjkee1392@gmail.com>
......@@ -383,7 +383,6 @@ class RenderWrap extends RenderBox with ContainerRenderObjectMixin<RenderBox, Wr
double _computeIntrinsicHeightForWidth(double width) {
assert(direction == Axis.horizontal);
int runCount = 0;
double height = 0.0;
double runWidth = 0.0;
double runHeight = 0.0;
......@@ -392,11 +391,9 @@ class RenderWrap extends RenderBox with ContainerRenderObjectMixin<RenderBox, Wr
while (child != null) {
final double childWidth = child.getMaxIntrinsicWidth(double.infinity);
final double childHeight = child.getMaxIntrinsicHeight(childWidth);
if (runWidth + childWidth > width) {
height += runHeight;
if (runCount > 0)
height += runSpacing;
runCount += 1;
// There must be at least one child before we move on to the next run.
if (childCount > 0 && runWidth + childWidth + spacing > width) {
height += runHeight + runSpacing;
runWidth = 0.0;
runHeight = 0.0;
childCount = 0;
......@@ -408,14 +405,12 @@ class RenderWrap extends RenderBox with ContainerRenderObjectMixin<RenderBox, Wr
childCount += 1;
child = childAfter(child);
}
if (childCount > 0)
height += runHeight + runSpacing;
height += runHeight;
return height;
}
double _computeIntrinsicWidthForHeight(double height) {
assert(direction == Axis.vertical);
int runCount = 0;
double width = 0.0;
double runHeight = 0.0;
double runWidth = 0.0;
......@@ -424,11 +419,9 @@ class RenderWrap extends RenderBox with ContainerRenderObjectMixin<RenderBox, Wr
while (child != null) {
final double childHeight = child.getMaxIntrinsicHeight(double.infinity);
final double childWidth = child.getMaxIntrinsicWidth(childHeight);
if (runHeight + childHeight > height) {
width += runWidth;
if (runCount > 0)
width += runSpacing;
runCount += 1;
// There must be at least one child before we move on to the next run.
if (childCount > 0 && runHeight + childHeight + spacing > height) {
width += runWidth + runSpacing;
runHeight = 0.0;
runWidth = 0.0;
childCount = 0;
......@@ -440,8 +433,7 @@ class RenderWrap extends RenderBox with ContainerRenderObjectMixin<RenderBox, Wr
childCount += 1;
child = childAfter(child);
}
if (childCount > 0)
width += runWidth + runSpacing;
width += runWidth;
return width;
}
......
......@@ -25,4 +25,130 @@ void main() {
),
);
});
test('Compute intrinsic height test', () {
final List<RenderBox> children = <RenderBox>[
RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
),
RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
),
RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
),
];
final RenderWrap renderWrap = RenderWrap();
children.forEach(renderWrap.add);
renderWrap.spacing = 5;
renderWrap.runSpacing = 5;
renderWrap.direction = Axis.horizontal;
expect(renderWrap.computeMaxIntrinsicHeight(245), 165);
expect(renderWrap.computeMaxIntrinsicHeight(250), 80);
expect(renderWrap.computeMaxIntrinsicHeight(80), 250);
expect(renderWrap.computeMaxIntrinsicHeight(79), 250);
expect(renderWrap.computeMinIntrinsicHeight(245), 165);
expect(renderWrap.computeMinIntrinsicHeight(250), 80);
expect(renderWrap.computeMinIntrinsicHeight(80), 250);
expect(renderWrap.computeMinIntrinsicHeight(79), 250);
});
test('Compute intrinsic width test', () {
final List<RenderBox> children = <RenderBox>[
RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
),
RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
),
RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
),
];
final RenderWrap renderWrap = RenderWrap();
children.forEach(renderWrap.add);
renderWrap.spacing = 5;
renderWrap.runSpacing = 5;
renderWrap.direction = Axis.vertical;
expect(renderWrap.computeMaxIntrinsicWidth(245), 165);
expect(renderWrap.computeMaxIntrinsicWidth(250), 80);
expect(renderWrap.computeMaxIntrinsicWidth(80), 250);
expect(renderWrap.computeMaxIntrinsicWidth(79), 250);
expect(renderWrap.computeMinIntrinsicWidth(245), 165);
expect(renderWrap.computeMinIntrinsicWidth(250), 80);
expect(renderWrap.computeMinIntrinsicWidth(80), 250);
expect(renderWrap.computeMinIntrinsicWidth(79), 250);
});
test('Compute intrinsic height for only one run', () {
final RenderBox child = RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
);
final RenderWrap renderWrap = RenderWrap();
renderWrap.add(child);
renderWrap.spacing = 5;
renderWrap.runSpacing = 5;
renderWrap.direction = Axis.horizontal;
expect(renderWrap.computeMaxIntrinsicHeight(100), 80);
expect(renderWrap.computeMaxIntrinsicHeight(79), 80);
expect(renderWrap.computeMaxIntrinsicHeight(80), 80);
expect(renderWrap.computeMinIntrinsicHeight(100), 80);
expect(renderWrap.computeMinIntrinsicHeight(79), 80);
expect(renderWrap.computeMinIntrinsicHeight(80), 80);
});
test('Compute intrinsic width for only one run', () {
final RenderBox child = RenderConstrainedBox(
additionalConstraints: const BoxConstraints(
minWidth: 80,
minHeight: 80,
),
);
final RenderWrap renderWrap = RenderWrap();
renderWrap.add(child);
renderWrap.spacing = 5;
renderWrap.runSpacing = 5;
renderWrap.direction = Axis.vertical;
expect(renderWrap.computeMaxIntrinsicWidth(100), 80);
expect(renderWrap.computeMaxIntrinsicWidth(79), 80);
expect(renderWrap.computeMaxIntrinsicWidth(80), 80);
expect(renderWrap.computeMinIntrinsicWidth(100), 80);
expect(renderWrap.computeMinIntrinsicWidth(79), 80);
expect(renderWrap.computeMinIntrinsicWidth(80), 80);
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment