Unverified Commit 60d28ad9 authored by Nate's avatar Nate Committed by GitHub

Implementing `switch` expressions in `rendering/` (#143812)

This pull request is part of the effort to solve issue #136139.

The previous [`switch` expressions PR](https://github.com/flutter/flutter/pull/143496) was comprised of many simple changes throughout `flutter/lib/src/`, but due to some more in-depth refactoring in `flutter/lib/src/rendering/`, I decided to submit the changes to this directory as a separate pull request.

There was really just one function that I changed significantly; I'll add a comment for explanation.
parent 469a2338
...@@ -93,32 +93,27 @@ class RenderDecoratedSliver extends RenderProxySliver { ...@@ -93,32 +93,27 @@ class RenderDecoratedSliver extends RenderProxySliver {
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (child != null && child!.geometry!.visible) { if (child == null || !child!.geometry!.visible) {
final SliverPhysicalParentData childParentData = child!.parentData! as SliverPhysicalParentData; return;
final Size childSize; }
final Offset scrollOffset; // In the case where the child sliver has infinite scroll extent, the decoration
// should only extend down to the bottom cache extent.
// In the case where the child sliver has infinite scroll extent, the decoration final double cappedMainAxisExtent = child!.geometry!.scrollExtent.isInfinite
// should only extend down to the bottom cache extent. ? constraints.scrollOffset + child!.geometry!.cacheExtent + constraints.cacheOrigin
final double cappedMainAxisExtent = child!.geometry!.scrollExtent.isInfinite : child!.geometry!.scrollExtent;
? constraints.scrollOffset + child!.geometry!.cacheExtent + constraints.cacheOrigin final (Size childSize, Offset scrollOffset) = switch (constraints.axis) {
: child!.geometry!.scrollExtent; Axis.horizontal => (Size(cappedMainAxisExtent, constraints.crossAxisExtent), Offset(-constraints.scrollOffset, 0.0)),
switch (constraints.axis) { Axis.vertical => (Size(constraints.crossAxisExtent, cappedMainAxisExtent), Offset(0.0, -constraints.scrollOffset)),
case Axis.vertical: };
childSize = Size(constraints.crossAxisExtent, cappedMainAxisExtent); offset += (child!.parentData! as SliverPhysicalParentData).paintOffset;
scrollOffset = Offset(0.0, -constraints.scrollOffset); void paintDecoration() => _painter!.paint(context.canvas, offset + scrollOffset, configuration.copyWith(size: childSize));
case Axis.horizontal: switch (position) {
childSize = Size(cappedMainAxisExtent, constraints.crossAxisExtent); case DecorationPosition.background:
scrollOffset = Offset(-constraints.scrollOffset, 0.0); paintDecoration();
} context.paintChild(child!, offset);
final Offset childOffset = offset + childParentData.paintOffset; case DecorationPosition.foreground:
if (position == DecorationPosition.background) { context.paintChild(child!, offset);
_painter!.paint(context.canvas, childOffset + scrollOffset, configuration.copyWith(size: childSize)); paintDecoration();
}
context.paintChild(child!, childOffset);
if (position == DecorationPosition.foreground) {
_painter!.paint(context.canvas, childOffset + scrollOffset, configuration.copyWith(size: childSize));
}
} }
} }
} }
...@@ -67,14 +67,11 @@ class TextSelectionPoint { ...@@ -67,14 +67,11 @@ class TextSelectionPoint {
@override @override
String toString() { String toString() {
switch (direction) { return switch (direction) {
case TextDirection.ltr: TextDirection.ltr => '$point-ltr',
return '$point-ltr'; TextDirection.rtl => '$point-rtl',
case TextDirection.rtl: null => '$point',
return '$point-rtl'; };
case null:
return '$point';
}
} }
@override @override
...@@ -1686,32 +1683,26 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin, ...@@ -1686,32 +1683,26 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
Axis get _viewportAxis => _isMultiline ? Axis.vertical : Axis.horizontal; Axis get _viewportAxis => _isMultiline ? Axis.vertical : Axis.horizontal;
Offset get _paintOffset { Offset get _paintOffset {
switch (_viewportAxis) { return switch (_viewportAxis) {
case Axis.horizontal: Axis.horizontal => Offset(-offset.pixels, 0.0),
return Offset(-offset.pixels, 0.0); Axis.vertical => Offset(0.0, -offset.pixels),
case Axis.vertical: };
return Offset(0.0, -offset.pixels);
}
} }
double get _viewportExtent { double get _viewportExtent {
assert(hasSize); assert(hasSize);
switch (_viewportAxis) { return switch (_viewportAxis) {
case Axis.horizontal: Axis.horizontal => size.width,
return size.width; Axis.vertical => size.height,
case Axis.vertical: };
return size.height;
}
} }
double _getMaxScrollExtent(Size contentSize) { double _getMaxScrollExtent(Size contentSize) {
assert(hasSize); assert(hasSize);
switch (_viewportAxis) { return switch (_viewportAxis) {
case Axis.horizontal: Axis.horizontal => math.max(0.0, contentSize.width - size.width),
return math.max(0.0, contentSize.width - size.width); Axis.vertical => math.max(0.0, contentSize.height - size.height),
case Axis.vertical: };
return math.max(0.0, contentSize.height - size.height);
}
} }
// We need to check the paint offset here because during animation, the start of // We need to check the paint offset here because during animation, the start of
......
...@@ -252,42 +252,34 @@ class RenderListBody extends RenderBox ...@@ -252,42 +252,34 @@ class RenderListBody extends RenderBox
@override @override
double computeMinIntrinsicWidth(double height) { double computeMinIntrinsicWidth(double height) {
switch (mainAxis) { return switch (mainAxis) {
case Axis.horizontal: Axis.horizontal => _getIntrinsicMainAxis((RenderBox child) => child.getMinIntrinsicWidth(height)),
return _getIntrinsicMainAxis((RenderBox child) => child.getMinIntrinsicWidth(height)); Axis.vertical => _getIntrinsicCrossAxis((RenderBox child) => child.getMinIntrinsicWidth(height)),
case Axis.vertical: };
return _getIntrinsicCrossAxis((RenderBox child) => child.getMinIntrinsicWidth(height));
}
} }
@override @override
double computeMaxIntrinsicWidth(double height) { double computeMaxIntrinsicWidth(double height) {
switch (mainAxis) { return switch (mainAxis) {
case Axis.horizontal: Axis.horizontal => _getIntrinsicMainAxis((RenderBox child) => child.getMaxIntrinsicWidth(height)),
return _getIntrinsicMainAxis((RenderBox child) => child.getMaxIntrinsicWidth(height)); Axis.vertical => _getIntrinsicCrossAxis((RenderBox child) => child.getMaxIntrinsicWidth(height)),
case Axis.vertical: };
return _getIntrinsicCrossAxis((RenderBox child) => child.getMaxIntrinsicWidth(height));
}
} }
@override @override
double computeMinIntrinsicHeight(double width) { double computeMinIntrinsicHeight(double width) {
switch (mainAxis) { return switch (mainAxis) {
case Axis.horizontal: Axis.horizontal => _getIntrinsicMainAxis((RenderBox child) => child.getMinIntrinsicHeight(width)),
return _getIntrinsicMainAxis((RenderBox child) => child.getMinIntrinsicHeight(width)); Axis.vertical => _getIntrinsicCrossAxis((RenderBox child) => child.getMinIntrinsicHeight(width)),
case Axis.vertical: };
return _getIntrinsicCrossAxis((RenderBox child) => child.getMinIntrinsicHeight(width));
}
} }
@override @override
double computeMaxIntrinsicHeight(double width) { double computeMaxIntrinsicHeight(double width) {
switch (mainAxis) { return switch (mainAxis) {
case Axis.horizontal: Axis.horizontal => _getIntrinsicMainAxis((RenderBox child) => child.getMaxIntrinsicHeight(width)),
return _getIntrinsicMainAxis((RenderBox child) => child.getMaxIntrinsicHeight(width)); Axis.vertical => _getIntrinsicCrossAxis((RenderBox child) => child.getMaxIntrinsicHeight(width)),
case Axis.vertical: };
return _getIntrinsicCrossAxis((RenderBox child) => child.getMaxIntrinsicHeight(width));
}
} }
@override @override
......
...@@ -843,15 +843,10 @@ class RenderParagraph extends RenderBox with ContainerRenderObjectMixin<RenderBo ...@@ -843,15 +843,10 @@ class RenderParagraph extends RenderBox with ContainerRenderObjectMixin<RenderBo
locale: locale, locale: locale,
)..layout(); )..layout();
if (didOverflowWidth) { if (didOverflowWidth) {
double fadeEnd, fadeStart; final (double fadeStart, double fadeEnd) = switch (textDirection) {
switch (textDirection) { TextDirection.rtl => (fadeSizePainter.width, 0.0),
case TextDirection.rtl: TextDirection.ltr => (size.width - fadeSizePainter.width, size.width),
fadeEnd = 0.0; };
fadeStart = fadeSizePainter.width;
case TextDirection.ltr:
fadeEnd = size.width;
fadeStart = fadeEnd - fadeSizePainter.width;
}
_overflowShader = ui.Gradient.linear( _overflowShader = ui.Gradient.linear(
Offset(fadeStart, 0.0), Offset(fadeStart, 0.0),
Offset(fadeEnd, 0.0), Offset(fadeEnd, 0.0),
......
...@@ -1958,12 +1958,10 @@ class RenderPhysicalModel extends _RenderPhysicalModelBase<RRect> { ...@@ -1958,12 +1958,10 @@ class RenderPhysicalModel extends _RenderPhysicalModelBase<RRect> {
RRect get _defaultClip { RRect get _defaultClip {
assert(hasSize); assert(hasSize);
final Rect rect = Offset.zero & size; final Rect rect = Offset.zero & size;
switch (_shape) { return switch (_shape) {
case BoxShape.rectangle: BoxShape.rectangle => (borderRadius ?? BorderRadius.zero).toRRect(rect),
return (borderRadius ?? BorderRadius.zero).toRRect(rect); BoxShape.circle => RRect.fromRectXY(rect, rect.width / 2, rect.height / 2),
case BoxShape.circle: };
return RRect.fromRectXY(rect, rect.width / 2, rect.height / 2);
}
} }
@override @override
......
...@@ -671,25 +671,21 @@ class RenderConstrainedOverflowBox extends RenderAligningShiftedBox { ...@@ -671,25 +671,21 @@ class RenderConstrainedOverflowBox extends RenderAligningShiftedBox {
@override @override
bool get sizedByParent { bool get sizedByParent {
switch (fit) { return switch (fit) {
case OverflowBoxFit.max: OverflowBoxFit.max => true,
return true; // If deferToChild, the size will be as small as its child when non-overflowing,
case OverflowBoxFit.deferToChild: // thus it cannot be sizedByParent.
// If deferToChild, the size will be as small as its child when non-overflowing, OverflowBoxFit.deferToChild => false,
// thus it cannot be sizedByParent. };
return false;
}
} }
@override @override
@protected @protected
Size computeDryLayout(covariant BoxConstraints constraints) { Size computeDryLayout(covariant BoxConstraints constraints) {
switch (fit) { return switch (fit) {
case OverflowBoxFit.max: OverflowBoxFit.max => constraints.biggest,
return constraints.biggest; OverflowBoxFit.deferToChild => child?.getDryLayout(constraints) ?? constraints.smallest,
case OverflowBoxFit.deferToChild: };
return child?.getDryLayout(constraints) ?? constraints.smallest;
}
} }
@override @override
......
...@@ -150,12 +150,10 @@ enum GrowthDirection { ...@@ -150,12 +150,10 @@ enum GrowthDirection {
/// [AxisDirection] and a [GrowthDirection] and wish to compute the /// [AxisDirection] and a [GrowthDirection] and wish to compute the
/// [AxisDirection] in which growth will occur. /// [AxisDirection] in which growth will occur.
AxisDirection applyGrowthDirectionToAxisDirection(AxisDirection axisDirection, GrowthDirection growthDirection) { AxisDirection applyGrowthDirectionToAxisDirection(AxisDirection axisDirection, GrowthDirection growthDirection) {
switch (growthDirection) { return switch (growthDirection) {
case GrowthDirection.forward: GrowthDirection.forward => axisDirection,
return axisDirection; GrowthDirection.reverse => flipAxisDirection(axisDirection),
case GrowthDirection.reverse: };
return flipAxisDirection(axisDirection);
}
} }
/// Flips the [ScrollDirection] if the [GrowthDirection] is /// Flips the [ScrollDirection] if the [GrowthDirection] is
...@@ -169,12 +167,10 @@ AxisDirection applyGrowthDirectionToAxisDirection(AxisDirection axisDirection, G ...@@ -169,12 +167,10 @@ AxisDirection applyGrowthDirectionToAxisDirection(AxisDirection axisDirection, G
/// [ScrollDirection] and a [GrowthDirection] and wish to compute the /// [ScrollDirection] and a [GrowthDirection] and wish to compute the
/// [ScrollDirection] in which growth will occur. /// [ScrollDirection] in which growth will occur.
ScrollDirection applyGrowthDirectionToScrollDirection(ScrollDirection scrollDirection, GrowthDirection growthDirection) { ScrollDirection applyGrowthDirectionToScrollDirection(ScrollDirection scrollDirection, GrowthDirection growthDirection) {
switch (growthDirection) { return switch (growthDirection) {
case GrowthDirection.forward: GrowthDirection.forward => scrollDirection,
return scrollDirection; GrowthDirection.reverse => flipScrollDirection(scrollDirection),
case GrowthDirection.reverse: };
return flipScrollDirection(scrollDirection);
}
} }
/// Immutable layout constraints for [RenderSliver] layout. /// Immutable layout constraints for [RenderSliver] layout.
...@@ -442,19 +438,13 @@ class SliverConstraints extends Constraints { ...@@ -442,19 +438,13 @@ class SliverConstraints extends Constraints {
/// This can be useful in combination with [axis] to view the [axisDirection] /// This can be useful in combination with [axis] to view the [axisDirection]
/// and [growthDirection] in different terms. /// and [growthDirection] in different terms.
GrowthDirection get normalizedGrowthDirection { GrowthDirection get normalizedGrowthDirection {
switch (axisDirection) { if (axisDirectionIsReversed(axisDirection)) {
case AxisDirection.down: return switch (growthDirection) {
case AxisDirection.right: GrowthDirection.forward => GrowthDirection.reverse,
return growthDirection; GrowthDirection.reverse => GrowthDirection.forward,
case AxisDirection.up: };
case AxisDirection.left:
switch (growthDirection) {
case GrowthDirection.forward:
return GrowthDirection.reverse;
case GrowthDirection.reverse:
return GrowthDirection.forward;
}
} }
return growthDirection;
} }
@override @override
...@@ -1582,16 +1572,12 @@ abstract class RenderSliver extends RenderObject { ...@@ -1582,16 +1572,12 @@ abstract class RenderSliver extends RenderObject {
Size getAbsoluteSizeRelativeToOrigin() { Size getAbsoluteSizeRelativeToOrigin() {
assert(geometry != null); assert(geometry != null);
assert(!debugNeedsLayout); assert(!debugNeedsLayout);
switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) { return switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) {
case AxisDirection.up: AxisDirection.up => Size(constraints.crossAxisExtent, -geometry!.paintExtent),
return Size(constraints.crossAxisExtent, -geometry!.paintExtent); AxisDirection.down => Size(constraints.crossAxisExtent, geometry!.paintExtent),
case AxisDirection.right: AxisDirection.left => Size(-geometry!.paintExtent, constraints.crossAxisExtent),
return Size(geometry!.paintExtent, constraints.crossAxisExtent); AxisDirection.right => Size(geometry!.paintExtent, constraints.crossAxisExtent),
case AxisDirection.down: };
return Size(constraints.crossAxisExtent, geometry!.paintExtent);
case AxisDirection.left:
return Size(-geometry!.paintExtent, constraints.crossAxisExtent);
}
} }
/// This returns the absolute [Size] of the sliver. /// This returns the absolute [Size] of the sliver.
...@@ -1843,16 +1829,12 @@ abstract class RenderSliverSingleBoxAdapter extends RenderSliver with RenderObje ...@@ -1843,16 +1829,12 @@ abstract class RenderSliverSingleBoxAdapter extends RenderSliver with RenderObje
@protected @protected
void setChildParentData(RenderObject child, SliverConstraints constraints, SliverGeometry geometry) { void setChildParentData(RenderObject child, SliverConstraints constraints, SliverGeometry geometry) {
final SliverPhysicalParentData childParentData = child.parentData! as SliverPhysicalParentData; final SliverPhysicalParentData childParentData = child.parentData! as SliverPhysicalParentData;
switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) { childParentData.paintOffset = switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) {
case AxisDirection.up: AxisDirection.up => Offset(0.0, geometry.paintExtent + constraints.scrollOffset - geometry.scrollExtent),
childParentData.paintOffset = Offset(0.0, -(geometry.scrollExtent - (geometry.paintExtent + constraints.scrollOffset))); AxisDirection.left => Offset(geometry.paintExtent + constraints.scrollOffset - geometry.scrollExtent, 0.0),
case AxisDirection.right: AxisDirection.right => Offset(-constraints.scrollOffset, 0.0),
childParentData.paintOffset = Offset(-constraints.scrollOffset, 0.0); AxisDirection.down => Offset(0.0, -constraints.scrollOffset),
case AxisDirection.down: };
childParentData.paintOffset = Offset(0.0, -constraints.scrollOffset);
case AxisDirection.left:
childParentData.paintOffset = Offset(-(geometry.scrollExtent - (geometry.paintExtent + constraints.scrollOffset)), 0.0);
}
} }
@override @override
...@@ -1911,13 +1893,10 @@ class RenderSliverToBoxAdapter extends RenderSliverSingleBoxAdapter { ...@@ -1911,13 +1893,10 @@ class RenderSliverToBoxAdapter extends RenderSliverSingleBoxAdapter {
} }
final SliverConstraints constraints = this.constraints; final SliverConstraints constraints = this.constraints;
child!.layout(constraints.asBoxConstraints(), parentUsesSize: true); child!.layout(constraints.asBoxConstraints(), parentUsesSize: true);
final double childExtent; final double childExtent = switch (constraints.axis) {
switch (constraints.axis) { Axis.horizontal => child!.size.width,
case Axis.horizontal: Axis.vertical => child!.size.height,
childExtent = child!.size.width; };
case Axis.vertical:
childExtent = child!.size.height;
}
final double paintedChildSize = calculatePaintOffset(constraints, from: 0.0, to: childExtent); final double paintedChildSize = calculatePaintOffset(constraints, from: 0.0, to: childExtent);
final double cacheExtent = calculateCacheOffset(constraints, from: 0.0, to: childExtent); final double cacheExtent = calculateCacheOffset(constraints, from: 0.0, to: childExtent);
......
...@@ -138,13 +138,10 @@ class RenderSliverFillRemaining extends RenderSliverSingleBoxAdapter { ...@@ -138,13 +138,10 @@ class RenderSliverFillRemaining extends RenderSliverSingleBoxAdapter {
double extent = constraints.viewportMainAxisExtent - constraints.precedingScrollExtent; double extent = constraints.viewportMainAxisExtent - constraints.precedingScrollExtent;
if (child != null) { if (child != null) {
final double childExtent; final double childExtent = switch (constraints.axis) {
switch (constraints.axis) { Axis.horizontal => child!.getMaxIntrinsicWidth(constraints.crossAxisExtent),
case Axis.horizontal: Axis.vertical => child!.getMaxIntrinsicHeight(constraints.crossAxisExtent),
childExtent = child!.getMaxIntrinsicWidth(constraints.crossAxisExtent); };
case Axis.vertical:
childExtent = child!.getMaxIntrinsicHeight(constraints.crossAxisExtent);
}
// If the childExtent is greater than the computed extent, we want to use // If the childExtent is greater than the computed extent, we want to use
// that instead of potentially cutting off the child. This allows us to // that instead of potentially cutting off the child. This allows us to
...@@ -213,13 +210,10 @@ class RenderSliverFillRemainingAndOverscroll extends RenderSliverSingleBoxAdapte ...@@ -213,13 +210,10 @@ class RenderSliverFillRemainingAndOverscroll extends RenderSliverSingleBoxAdapte
double maxExtent = constraints.remainingPaintExtent - math.min(constraints.overlap, 0.0); double maxExtent = constraints.remainingPaintExtent - math.min(constraints.overlap, 0.0);
if (child != null) { if (child != null) {
final double childExtent; final double childExtent = switch (constraints.axis) {
switch (constraints.axis) { Axis.horizontal => child!.getMaxIntrinsicWidth(constraints.crossAxisExtent),
case Axis.horizontal: Axis.vertical => child!.getMaxIntrinsicHeight(constraints.crossAxisExtent),
childExtent = child!.getMaxIntrinsicWidth(constraints.crossAxisExtent); };
case Axis.vertical:
childExtent = child!.getMaxIntrinsicHeight(constraints.crossAxisExtent);
}
// If the childExtent is greater than the computed extent, we want to use // If the childExtent is greater than the computed extent, we want to use
// that instead of potentially cutting off the child. This allows us to // that instead of potentially cutting off the child. This allows us to
......
...@@ -110,12 +110,10 @@ class RenderSliverCrossAxisGroup extends RenderSliver with ContainerRenderObject ...@@ -110,12 +110,10 @@ class RenderSliverCrossAxisGroup extends RenderSliver with ContainerRenderObject
: 0.0; : 0.0;
final double childExtent = child.geometry!.crossAxisExtent ?? extentPerFlexValue * (childParentData.crossAxisFlex ?? 0); final double childExtent = child.geometry!.crossAxisExtent ?? extentPerFlexValue * (childParentData.crossAxisFlex ?? 0);
// Set child parent data. // Set child parent data.
switch (constraints.axis) { childParentData.paintOffset = switch (constraints.axis) {
case Axis.vertical: Axis.vertical => Offset(offset, -paintCorrection),
childParentData.paintOffset = Offset(offset, -paintCorrection); Axis.horizontal => Offset(-paintCorrection, offset),
case Axis.horizontal: };
childParentData.paintOffset = Offset(-paintCorrection, offset);
}
offset += childExtent; offset += childExtent;
child = childAfter(child); child = childAfter(child);
} }
...@@ -229,14 +227,11 @@ class RenderSliverMainAxisGroup extends RenderSliver with ContainerRenderObjectM ...@@ -229,14 +227,11 @@ class RenderSliverMainAxisGroup extends RenderSliver with ContainerRenderObjectM
@override @override
double childMainAxisPosition(RenderSliver child) { double childMainAxisPosition(RenderSliver child) {
switch (constraints.axisDirection) { final Offset paintOffset = (child.parentData! as SliverPhysicalParentData).paintOffset;
case AxisDirection.up: return switch (constraints.axis) {
case AxisDirection.down: Axis.horizontal => paintOffset.dx,
return (child.parentData! as SliverPhysicalParentData).paintOffset.dy; Axis.vertical => paintOffset.dy,
case AxisDirection.left: };
case AxisDirection.right:
return (child.parentData! as SliverPhysicalParentData).paintOffset.dx;
}
} }
@override @override
...@@ -269,12 +264,10 @@ class RenderSliverMainAxisGroup extends RenderSliver with ContainerRenderObjectM ...@@ -269,12 +264,10 @@ class RenderSliverMainAxisGroup extends RenderSliver with ContainerRenderObjectM
); );
final SliverGeometry childLayoutGeometry = child.geometry!; final SliverGeometry childLayoutGeometry = child.geometry!;
final SliverPhysicalParentData childParentData = child.parentData! as SliverPhysicalParentData; final SliverPhysicalParentData childParentData = child.parentData! as SliverPhysicalParentData;
switch (constraints.axis) { childParentData.paintOffset = switch (constraints.axis) {
case Axis.vertical: Axis.vertical => Offset(0.0, beforeOffsetPaintExtent),
childParentData.paintOffset = Offset(0.0, beforeOffsetPaintExtent); Axis.horizontal => Offset(beforeOffsetPaintExtent, 0.0),
case Axis.horizontal: };
childParentData.paintOffset = Offset(beforeOffsetPaintExtent, 0.0);
}
offset += childLayoutGeometry.scrollExtent; offset += childLayoutGeometry.scrollExtent;
maxPaintExtent += child.geometry!.maxPaintExtent; maxPaintExtent += child.geometry!.maxPaintExtent;
child = childAfter(child); child = childAfter(child);
...@@ -304,12 +297,10 @@ class RenderSliverMainAxisGroup extends RenderSliver with ContainerRenderObjectM ...@@ -304,12 +297,10 @@ class RenderSliverMainAxisGroup extends RenderSliver with ContainerRenderObjectM
final double remainingExtent = totalScrollExtent - constraints.scrollOffset; final double remainingExtent = totalScrollExtent - constraints.scrollOffset;
if (childLayoutGeometry.paintExtent > remainingExtent) { if (childLayoutGeometry.paintExtent > remainingExtent) {
final double paintCorrection = childLayoutGeometry.paintExtent - remainingExtent; final double paintCorrection = childLayoutGeometry.paintExtent - remainingExtent;
switch (constraints.axis) { childParentData.paintOffset = switch (constraints.axis) {
case Axis.vertical: Axis.vertical => Offset(0.0, beforeOffsetPaintExtent - paintCorrection),
childParentData.paintOffset = Offset(0.0, beforeOffsetPaintExtent - paintCorrection); Axis.horizontal => Offset(beforeOffsetPaintExtent - paintCorrection, 0.0),
case Axis.horizontal: };
childParentData.paintOffset = Offset(beforeOffsetPaintExtent - paintCorrection, 0.0);
}
} }
offset += child.geometry!.scrollExtent; offset += child.geometry!.scrollExtent;
child = childAfter(child); child = childAfter(child);
......
...@@ -602,12 +602,10 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver ...@@ -602,12 +602,10 @@ abstract class RenderSliverMultiBoxAdaptor extends RenderSliver
@protected @protected
double paintExtentOf(RenderBox child) { double paintExtentOf(RenderBox child) {
assert(child.hasSize); assert(child.hasSize);
switch (constraints.axis) { return switch (constraints.axis) {
case Axis.horizontal: Axis.horizontal => child.size.width,
return child.size.width; Axis.vertical => child.size.height,
case Axis.vertical: };
return child.size.height;
}
} }
@override @override
......
...@@ -152,12 +152,10 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje ...@@ -152,12 +152,10 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje
return 0.0; return 0.0;
} }
assert(child!.hasSize); assert(child!.hasSize);
switch (constraints.axis) { return switch (constraints.axis) {
case Axis.vertical: Axis.vertical => child!.size.height,
return child!.size.height; Axis.horizontal => child!.size.width,
case Axis.horizontal: };
return child!.size.width;
}
} }
bool _needsUpdateChild = true; bool _needsUpdateChild = true;
...@@ -298,16 +296,12 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje ...@@ -298,16 +296,12 @@ abstract class RenderSliverPersistentHeader extends RenderSliver with RenderObje
@override @override
void paint(PaintingContext context, Offset offset) { void paint(PaintingContext context, Offset offset) {
if (child != null && geometry!.visible) { if (child != null && geometry!.visible) {
switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) { offset += switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) {
case AxisDirection.up: AxisDirection.up => Offset(0.0, geometry!.paintExtent - childMainAxisPosition(child!) - childExtent),
offset += Offset(0.0, geometry!.paintExtent - childMainAxisPosition(child!) - childExtent); AxisDirection.left => Offset(geometry!.paintExtent - childMainAxisPosition(child!) - childExtent, 0.0),
case AxisDirection.down: AxisDirection.right => Offset(childMainAxisPosition(child!), 0.0),
offset += Offset(0.0, childMainAxisPosition(child!)); AxisDirection.down => Offset(0.0, childMainAxisPosition(child!)),
case AxisDirection.left: };
offset += Offset(geometry!.paintExtent - childMainAxisPosition(child!) - childExtent, 0.0);
case AxisDirection.right:
offset += Offset(childMainAxisPosition(child!), 0.0);
}
context.paintChild(child!, offset); context.paintChild(child!, offset);
} }
} }
...@@ -446,17 +440,12 @@ abstract class RenderSliverPinnedPersistentHeader extends RenderSliverPersistent ...@@ -446,17 +440,12 @@ abstract class RenderSliverPinnedPersistentHeader extends RenderSliverPersistent
? MatrixUtils.transformRect(descendant.getTransformTo(this), rect ?? descendant.paintBounds) ? MatrixUtils.transformRect(descendant.getTransformTo(this), rect ?? descendant.paintBounds)
: rect; : rect;
Rect? newRect; final Rect? newRect = switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) {
switch (applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection)) { AxisDirection.up => _trim(localBounds, bottom: childExtent),
case AxisDirection.up: AxisDirection.left => _trim(localBounds, right: childExtent),
newRect = _trim(localBounds, bottom: childExtent); AxisDirection.right => _trim(localBounds, left: 0),
case AxisDirection.right: AxisDirection.down => _trim(localBounds, top: 0),
newRect = _trim(localBounds, left: 0); };
case AxisDirection.down:
newRect = _trim(localBounds, top: 0);
case AxisDirection.left:
newRect = _trim(localBounds, right: childExtent);
}
super.showOnScreen( super.showOnScreen(
descendant: this, descendant: this,
......
...@@ -66,17 +66,10 @@ class RelativeRect { ...@@ -66,17 +66,10 @@ class RelativeRect {
required double end, required double end,
required double bottom, required double bottom,
}) { }) {
double left; final (double left, double right) = switch (textDirection) {
double right; TextDirection.rtl => (end, start),
switch (textDirection) { TextDirection.ltr => (start, end),
case TextDirection.rtl: };
left = end;
right = start;
case TextDirection.ltr:
left = start;
right = end;
}
return RelativeRect.fromLTRB(left, top, right, bottom); return RelativeRect.fromLTRB(left, top, right, bottom);
} }
......
...@@ -69,14 +69,11 @@ enum ScrollDirection { ...@@ -69,14 +69,11 @@ enum ScrollDirection {
/// (and vice versa) and returns [ScrollDirection.idle] for /// (and vice versa) and returns [ScrollDirection.idle] for
/// [ScrollDirection.idle]. /// [ScrollDirection.idle].
ScrollDirection flipScrollDirection(ScrollDirection direction) { ScrollDirection flipScrollDirection(ScrollDirection direction) {
switch (direction) { return switch (direction) {
case ScrollDirection.idle: ScrollDirection.idle => ScrollDirection.idle,
return ScrollDirection.idle; ScrollDirection.forward => ScrollDirection.reverse,
case ScrollDirection.forward: ScrollDirection.reverse => ScrollDirection.forward,
return ScrollDirection.reverse; };
case ScrollDirection.reverse:
return ScrollDirection.forward;
}
} }
/// Which part of the content inside the viewport should be visible. /// Which part of the content inside the viewport should be visible.
......
...@@ -454,42 +454,33 @@ class RenderWrap extends RenderBox ...@@ -454,42 +454,33 @@ class RenderWrap extends RenderBox
} }
double _getMainAxisExtent(Size childSize) { double _getMainAxisExtent(Size childSize) {
switch (direction) { return switch (direction) {
case Axis.horizontal: Axis.horizontal => childSize.width,
return childSize.width; Axis.vertical => childSize.height,
case Axis.vertical: };
return childSize.height;
}
} }
double _getCrossAxisExtent(Size childSize) { double _getCrossAxisExtent(Size childSize) {
switch (direction) { return switch (direction) {
case Axis.horizontal: Axis.horizontal => childSize.height,
return childSize.height; Axis.vertical => childSize.width,
case Axis.vertical: };
return childSize.width;
}
} }
Offset _getOffset(double mainAxisOffset, double crossAxisOffset) { Offset _getOffset(double mainAxisOffset, double crossAxisOffset) {
switch (direction) { return switch (direction) {
case Axis.horizontal: Axis.horizontal => Offset(mainAxisOffset, crossAxisOffset),
return Offset(mainAxisOffset, crossAxisOffset); Axis.vertical => Offset(crossAxisOffset, mainAxisOffset),
case Axis.vertical: };
return Offset(crossAxisOffset, mainAxisOffset);
}
} }
double _getChildCrossAxisOffset(bool flipCrossAxis, double runCrossAxisExtent, double childCrossAxisExtent) { double _getChildCrossAxisOffset(bool flipCrossAxis, double runCrossAxisExtent, double childCrossAxisExtent) {
final double freeSpace = runCrossAxisExtent - childCrossAxisExtent; final double freeSpace = runCrossAxisExtent - childCrossAxisExtent;
switch (crossAxisAlignment) { return switch (crossAxisAlignment) {
case WrapCrossAlignment.start: WrapCrossAlignment.start => flipCrossAxis ? freeSpace : 0.0,
return flipCrossAxis ? freeSpace : 0.0; WrapCrossAlignment.end => flipCrossAxis ? 0.0 : freeSpace,
case WrapCrossAlignment.end: WrapCrossAlignment.center => freeSpace / 2.0,
return flipCrossAxis ? 0.0 : freeSpace; };
case WrapCrossAlignment.center:
return freeSpace / 2.0;
}
} }
bool _hasVisualOverflow = false; bool _hasVisualOverflow = false;
...@@ -501,16 +492,10 @@ class RenderWrap extends RenderBox ...@@ -501,16 +492,10 @@ class RenderWrap extends RenderBox
} }
Size _computeDryLayout(BoxConstraints constraints, [ChildLayouter layoutChild = ChildLayoutHelper.dryLayoutChild]) { Size _computeDryLayout(BoxConstraints constraints, [ChildLayouter layoutChild = ChildLayoutHelper.dryLayoutChild]) {
final BoxConstraints childConstraints; final (BoxConstraints childConstraints, double mainAxisLimit) = switch (direction) {
double mainAxisLimit = 0.0; Axis.horizontal => (BoxConstraints(maxWidth: constraints.maxWidth), constraints.maxWidth),
switch (direction) { Axis.vertical => (BoxConstraints(maxHeight: constraints.maxHeight), constraints.maxHeight),
case Axis.horizontal: };
childConstraints = BoxConstraints(maxWidth: constraints.maxWidth);
mainAxisLimit = constraints.maxWidth;
case Axis.vertical:
childConstraints = BoxConstraints(maxHeight: constraints.maxHeight);
mainAxisLimit = constraints.maxHeight;
}
double mainAxisExtent = 0.0; double mainAxisExtent = 0.0;
double crossAxisExtent = 0.0; double crossAxisExtent = 0.0;
...@@ -541,12 +526,10 @@ class RenderWrap extends RenderBox ...@@ -541,12 +526,10 @@ class RenderWrap extends RenderBox
crossAxisExtent += runCrossAxisExtent; crossAxisExtent += runCrossAxisExtent;
mainAxisExtent = math.max(mainAxisExtent, runMainAxisExtent); mainAxisExtent = math.max(mainAxisExtent, runMainAxisExtent);
switch (direction) { return constraints.constrain(switch (direction) {
case Axis.horizontal: Axis.horizontal => Size(mainAxisExtent, crossAxisExtent),
return constraints.constrain(Size(mainAxisExtent, crossAxisExtent)); Axis.vertical => Size(crossAxisExtent, mainAxisExtent),
case Axis.vertical: });
return constraints.constrain(Size(crossAxisExtent, mainAxisExtent));
}
} }
@override @override
......
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