mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Refactor layout/relayout into a single method.
This dramatically simplifies the layout model. I haven't gone through and simplified the existing functions, we should probably go through and figure out if they can be cleaned up a bit. R=abarth@chromium.org Review URL: https://codereview.chromium.org/1161983004
This commit is contained in:
parent
e45a3f7b32
commit
ec29082f84
@ -72,10 +72,17 @@ abstract class RenderSector extends RenderNode {
|
||||
return new SectorDimensions.withConstraints(constraints);
|
||||
}
|
||||
|
||||
void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
|
||||
SectorConstraints get constraints => super.constraints as SectorConstraints;
|
||||
void performResize() {
|
||||
// default behaviour for subclasses that have sizedByParent = true
|
||||
deltaRadius = constraints.constrainDeltaRadius(0.0);
|
||||
deltaTheta = constraints.constrainDeltaTheta(0.0);
|
||||
layoutDone();
|
||||
}
|
||||
void performLayout() {
|
||||
// descendants have to either override performLayout() to set both
|
||||
// the dimensions and lay out children, or, set sizedByParent to
|
||||
// true so that performResize()'s logic above does its thing.
|
||||
assert(sizedByParent);
|
||||
}
|
||||
|
||||
bool hitTest(HitTestResult result, { double radius, double theta }) {
|
||||
@ -210,30 +217,15 @@ class RenderSectorRing extends RenderSectorWithChildren {
|
||||
deltaTheta: innerTheta);
|
||||
}
|
||||
|
||||
SectorConstraints _constraints;
|
||||
void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
|
||||
if (relayoutSubtreeRoot != null)
|
||||
saveRelayoutSubtreeRoot(relayoutSubtreeRoot);
|
||||
relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRoot;
|
||||
void performLayout() {
|
||||
assert(this.parentData is SectorParentData);
|
||||
deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius);
|
||||
assert(deltaRadius < double.INFINITY);
|
||||
_constraints = constraints;
|
||||
internalLayout(relayoutSubtreeRoot);
|
||||
}
|
||||
|
||||
void relayout() {
|
||||
// TODO(ianh): avoid code duplication
|
||||
assert(parentData is SectorParentData);
|
||||
internalLayout(this);
|
||||
}
|
||||
|
||||
void internalLayout(RenderNode relayoutSubtreeRoot) {
|
||||
assert(this.parentData is SectorParentData);
|
||||
double innerDeltaRadius = deltaRadius - padding * 2.0;
|
||||
double childRadius = this.parentData.radius + padding;
|
||||
double paddingTheta = math.atan(padding / (this.parentData.radius + deltaRadius));
|
||||
double innerTheta = paddingTheta; // increments with each child
|
||||
double remainingDeltaTheta = _constraints.maxDeltaTheta - (innerTheta + paddingTheta);
|
||||
double remainingDeltaTheta = constraints.maxDeltaTheta - (innerTheta + paddingTheta);
|
||||
RenderSector child = firstChild;
|
||||
while (child != null) {
|
||||
SectorConstraints innerConstraints = new SectorConstraints(
|
||||
@ -243,7 +235,7 @@ class RenderSectorRing extends RenderSectorWithChildren {
|
||||
assert(child.parentData is SectorParentData);
|
||||
child.parentData.theta = innerTheta;
|
||||
child.parentData.radius = childRadius;
|
||||
child.layout(innerConstraints, relayoutSubtreeRoot: relayoutSubtreeRoot);
|
||||
child.layout(innerConstraints, parentUsesSize: true);
|
||||
innerTheta += child.deltaTheta;
|
||||
remainingDeltaTheta -= child.deltaTheta;
|
||||
assert(child.parentData is SectorChildListParentData);
|
||||
@ -333,30 +325,15 @@ class RenderSectorSlice extends RenderSectorWithChildren {
|
||||
deltaTheta: outerDeltaTheta);
|
||||
}
|
||||
|
||||
SectorConstraints _constraints;
|
||||
void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
|
||||
if (relayoutSubtreeRoot != null)
|
||||
saveRelayoutSubtreeRoot(relayoutSubtreeRoot);
|
||||
relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRoot;
|
||||
void performLayout() {
|
||||
assert(this.parentData is SectorParentData);
|
||||
deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
|
||||
assert(deltaTheta <= kTwoPi);
|
||||
_constraints = constraints;
|
||||
internalLayout(relayoutSubtreeRoot);
|
||||
}
|
||||
|
||||
void relayout() {
|
||||
// TODO(ianh): avoid code duplication
|
||||
assert(parentData is SectorParentData);
|
||||
internalLayout(this);
|
||||
}
|
||||
|
||||
void internalLayout(RenderNode relayoutSubtreeRoot) {
|
||||
assert(this.parentData is SectorParentData);
|
||||
double paddingTheta = math.atan(padding / this.parentData.radius);
|
||||
double innerTheta = this.parentData.theta + paddingTheta;
|
||||
double innerDeltaTheta = deltaTheta - paddingTheta * 2.0;
|
||||
double childRadius = this.parentData.radius + padding;
|
||||
double remainingDeltaRadius = _constraints.maxDeltaRadius - (padding * 2.0);
|
||||
double remainingDeltaRadius = constraints.maxDeltaRadius - (padding * 2.0);
|
||||
RenderSector child = firstChild;
|
||||
while (child != null) {
|
||||
SectorConstraints innerConstraints = new SectorConstraints(
|
||||
@ -365,7 +342,7 @@ class RenderSectorSlice extends RenderSectorWithChildren {
|
||||
);
|
||||
child.parentData.theta = innerTheta;
|
||||
child.parentData.radius = childRadius;
|
||||
child.layout(innerConstraints);
|
||||
child.layout(innerConstraints, parentUsesSize: true);
|
||||
childRadius += child.deltaRadius;
|
||||
remainingDeltaRadius -= child.deltaRadius;
|
||||
assert(child.parentData is SectorChildListParentData);
|
||||
@ -433,10 +410,7 @@ class RenderBoxToRenderSectorAdapter extends RenderBox {
|
||||
return new BoxDimensions.withConstraints(constraints, width: dimension, height: dimension);
|
||||
}
|
||||
|
||||
void layout(BoxConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
|
||||
if (relayoutSubtreeRoot != null)
|
||||
saveRelayoutSubtreeRoot(relayoutSubtreeRoot);
|
||||
relayoutSubtreeRoot = relayoutSubtreeRoot == null ? this : relayoutSubtreeRoot;
|
||||
void performLayout() {
|
||||
BoxDimensions ourDimensions;
|
||||
if (child == null) {
|
||||
ourDimensions = new BoxDimensions.withConstraints(constraints, width: 0.0, height: 0.0);
|
||||
@ -447,13 +421,12 @@ class RenderBoxToRenderSectorAdapter extends RenderBox {
|
||||
assert(child.parentData is SectorParentData);
|
||||
child.parentData.radius = innerRadius;
|
||||
child.parentData.theta = 0.0;
|
||||
child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), relayoutSubtreeRoot: relayoutSubtreeRoot);
|
||||
child.layout(new SectorConstraints(maxDeltaRadius: maxChildDeltaRadius), parentUsesSize: true);
|
||||
double dimension = (innerRadius + child.deltaRadius) * 2.0;
|
||||
ourDimensions = new BoxDimensions.withConstraints(constraints, width: dimension, height: dimension);
|
||||
}
|
||||
width = ourDimensions.width;
|
||||
height = ourDimensions.height;
|
||||
layoutDone();
|
||||
}
|
||||
|
||||
double width;
|
||||
@ -503,10 +476,9 @@ class RenderSolidColor extends RenderDecoratedSector {
|
||||
return new SectorDimensions.withConstraints(constraints, deltaTheta: 1.0); // 1.0 radians
|
||||
}
|
||||
|
||||
void layout(SectorConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
|
||||
void performLayout() {
|
||||
deltaRadius = constraints.constrainDeltaRadius(desiredDeltaRadius);
|
||||
deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
|
||||
layoutDone();
|
||||
}
|
||||
|
||||
void handlePointer(sky.PointerEvent event) {
|
||||
|
||||
@ -22,10 +22,9 @@ class RenderSolidColor extends RenderDecoratedBox {
|
||||
width: desiredWidth);
|
||||
}
|
||||
|
||||
void layout(BoxConstraints constraints, { RenderNode relayoutSubtreeRoot }) {
|
||||
void performLayout() {
|
||||
width = constraints.constrainWidth(desiredWidth);
|
||||
height = constraints.constrainHeight(desiredHeight);
|
||||
layoutDone();
|
||||
}
|
||||
|
||||
void handlePointer(PointerEvent event) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user