Rename AutoLayoutParams to AutoLayoutRect
This object represents a rect the auto-layout system.
This commit is contained in:
parent
c7d71d8ab1
commit
4408c820e1
@ -9,12 +9,12 @@ import 'package:cassowary/cassowary.dart' as al;
|
|||||||
import 'package:flutter/rendering.dart';
|
import 'package:flutter/rendering.dart';
|
||||||
|
|
||||||
class _MyAutoLayoutDelegate extends AutoLayoutDelegate {
|
class _MyAutoLayoutDelegate extends AutoLayoutDelegate {
|
||||||
AutoLayoutParams p1 = new AutoLayoutParams();
|
AutoLayoutRect p1 = new AutoLayoutRect();
|
||||||
AutoLayoutParams p2 = new AutoLayoutParams();
|
AutoLayoutRect p2 = new AutoLayoutRect();
|
||||||
AutoLayoutParams p3 = new AutoLayoutParams();
|
AutoLayoutRect p3 = new AutoLayoutRect();
|
||||||
AutoLayoutParams p4 = new AutoLayoutParams();
|
AutoLayoutRect p4 = new AutoLayoutRect();
|
||||||
|
|
||||||
List<al.Constraint> getConstraints(AutoLayoutParams parent) {
|
List<al.Constraint> getConstraints(AutoLayoutRect parent) {
|
||||||
return <al.Constraint>[
|
return <al.Constraint>[
|
||||||
// Sum of widths of each box must be equal to that of the container
|
// Sum of widths of each box must be equal to that of the container
|
||||||
parent.width.equals(p1.width + p2.width + p3.width),
|
parent.width.equals(p1.width + p2.width + p3.width),
|
||||||
@ -76,10 +76,10 @@ void main() {
|
|||||||
AutoLayoutParentData parentData3 = c3.parentData;
|
AutoLayoutParentData parentData3 = c3.parentData;
|
||||||
AutoLayoutParentData parentData4 = c4.parentData;
|
AutoLayoutParentData parentData4 = c4.parentData;
|
||||||
|
|
||||||
parentData1.params = delegate.p1;
|
parentData1.rect = delegate.p1;
|
||||||
parentData2.params = delegate.p2;
|
parentData2.rect = delegate.p2;
|
||||||
parentData3.params = delegate.p3;
|
parentData3.rect = delegate.p3;
|
||||||
parentData4.params = delegate.p4;
|
parentData4.rect = delegate.p4;
|
||||||
|
|
||||||
new RenderingFlutterBinding(root: root);
|
new RenderingFlutterBinding(root: root);
|
||||||
}
|
}
|
||||||
|
@ -8,12 +8,12 @@ import 'package:cassowary/cassowary.dart' as al;
|
|||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
class _MyAutoLayoutDelegate extends AutoLayoutDelegate {
|
class _MyAutoLayoutDelegate extends AutoLayoutDelegate {
|
||||||
AutoLayoutParams p1 = new AutoLayoutParams();
|
AutoLayoutRect p1 = new AutoLayoutRect();
|
||||||
AutoLayoutParams p2 = new AutoLayoutParams();
|
AutoLayoutRect p2 = new AutoLayoutRect();
|
||||||
AutoLayoutParams p3 = new AutoLayoutParams();
|
AutoLayoutRect p3 = new AutoLayoutRect();
|
||||||
AutoLayoutParams p4 = new AutoLayoutParams();
|
AutoLayoutRect p4 = new AutoLayoutRect();
|
||||||
|
|
||||||
List<al.Constraint> getConstraints(AutoLayoutParams parent) {
|
List<al.Constraint> getConstraints(AutoLayoutRect parent) {
|
||||||
return <al.Constraint>[
|
return <al.Constraint>[
|
||||||
// Sum of widths of each box must be equal to that of the container
|
// Sum of widths of each box must be equal to that of the container
|
||||||
parent.width.equals(p1.width + p2.width + p3.width),
|
parent.width.equals(p1.width + p2.width + p3.width),
|
||||||
@ -58,25 +58,25 @@ class _ColoredBoxesState extends State<ColoredBoxes> {
|
|||||||
delegate: delegate,
|
delegate: delegate,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
new AutoLayoutChild(
|
new AutoLayoutChild(
|
||||||
params: delegate.p1,
|
rect: delegate.p1,
|
||||||
child: new DecoratedBox(
|
child: new DecoratedBox(
|
||||||
decoration: new BoxDecoration(backgroundColor: const Color(0xFFFF0000))
|
decoration: new BoxDecoration(backgroundColor: const Color(0xFFFF0000))
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
new AutoLayoutChild(
|
new AutoLayoutChild(
|
||||||
params: delegate.p2,
|
rect: delegate.p2,
|
||||||
child: new DecoratedBox(
|
child: new DecoratedBox(
|
||||||
decoration: new BoxDecoration(backgroundColor: const Color(0xFF00FF00))
|
decoration: new BoxDecoration(backgroundColor: const Color(0xFF00FF00))
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
new AutoLayoutChild(
|
new AutoLayoutChild(
|
||||||
params: delegate.p3,
|
rect: delegate.p3,
|
||||||
child: new DecoratedBox(
|
child: new DecoratedBox(
|
||||||
decoration: new BoxDecoration(backgroundColor: const Color(0xFF0000FF))
|
decoration: new BoxDecoration(backgroundColor: const Color(0xFF0000FF))
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
new AutoLayoutChild(
|
new AutoLayoutChild(
|
||||||
params: delegate.p4,
|
rect: delegate.p4,
|
||||||
child: new DecoratedBox(
|
child: new DecoratedBox(
|
||||||
decoration: new BoxDecoration(backgroundColor: const Color(0xFFFFFFFF))
|
decoration: new BoxDecoration(backgroundColor: const Color(0xFFFFFFFF))
|
||||||
)
|
)
|
||||||
|
@ -243,7 +243,7 @@ void main() {
|
|||||||
expect(c1.expression.constant, -20.0);
|
expect(c1.expression.constant, -20.0);
|
||||||
expect(c1.relation, Relation.greaterThanOrEqualTo);
|
expect(c1.relation, Relation.greaterThanOrEqualTo);
|
||||||
|
|
||||||
var c2 = (right - left == cm(30.0)) as Constraint;
|
var c2 = (right - left).equals(cm(30.0));
|
||||||
expect(c2 is Constraint, true);
|
expect(c2 is Constraint, true);
|
||||||
expect(c2.expression.constant, -30.0);
|
expect(c2.expression.constant, -30.0);
|
||||||
expect(c2.relation, Relation.equalTo);
|
expect(c2.relation, Relation.equalTo);
|
||||||
@ -438,7 +438,7 @@ void main() {
|
|||||||
|
|
||||||
Solver s = new Solver();
|
Solver s = new Solver();
|
||||||
|
|
||||||
expect(s.addConstraint((right + left == mid * cm(2.0)) as Constraint),
|
expect(s.addConstraint((right + left).equals(mid * cm(2.0))),
|
||||||
Result.success);
|
Result.success);
|
||||||
expect(s.addConstraint(right - left >= cm(100.0)), Result.success);
|
expect(s.addConstraint(right - left >= cm(100.0)), Result.success);
|
||||||
expect(s.addConstraint(left >= cm(0.0)), Result.success);
|
expect(s.addConstraint(left >= cm(0.0)), Result.success);
|
||||||
@ -460,7 +460,7 @@ void main() {
|
|||||||
var c = (left >= cm(0.0));
|
var c = (left >= cm(0.0));
|
||||||
|
|
||||||
expect(s.addConstraints([
|
expect(s.addConstraints([
|
||||||
(left + right == cm(2.0) * mid) as Constraint,
|
(left + right).equals(cm(2.0) * mid),
|
||||||
(right - left >= cm(100.0)),
|
(right - left >= cm(100.0)),
|
||||||
c
|
c
|
||||||
]), Result.success);
|
]), Result.success);
|
||||||
@ -476,7 +476,7 @@ void main() {
|
|||||||
|
|
||||||
Solver s = new Solver();
|
Solver s = new Solver();
|
||||||
|
|
||||||
expect(s.addConstraint((right + left == mid * cm(2.0)) as Constraint),
|
expect(s.addConstraint((right + left).equals(mid * cm(2.0))),
|
||||||
Result.success);
|
Result.success);
|
||||||
expect(s.addConstraint(right - left >= cm(100.0)), Result.success);
|
expect(s.addConstraint(right - left >= cm(100.0)), Result.success);
|
||||||
expect(s.addConstraint(left >= cm(0.0)), Result.success);
|
expect(s.addConstraint(left >= cm(0.0)), Result.success);
|
||||||
@ -496,7 +496,7 @@ void main() {
|
|||||||
var right = new Param(100.0);
|
var right = new Param(100.0);
|
||||||
var c1 = right >= left;
|
var c1 = right >= left;
|
||||||
var c2 = right <= left;
|
var c2 = right <= left;
|
||||||
var c3 = (right == left) as Constraint;
|
var c3 = right.equals(left);
|
||||||
|
|
||||||
Solver s = new Solver();
|
Solver s = new Solver();
|
||||||
expect(s.addConstraint(c1), Result.success);
|
expect(s.addConstraint(c1), Result.success);
|
||||||
@ -519,9 +519,9 @@ void main() {
|
|||||||
solver.suggestValueForVariable(container.variable, 100.0);
|
solver.suggestValueForVariable(container.variable, 100.0);
|
||||||
|
|
||||||
solver.addConstraint((p1 >= cm(30.0)) | Priority.strong);
|
solver.addConstraint((p1 >= cm(30.0)) | Priority.strong);
|
||||||
solver.addConstraint(((p1 == p3) as Constraint) | Priority.medium);
|
solver.addConstraint(p1.equals(p3) | Priority.medium);
|
||||||
solver.addConstraint((p2 == cm(2.0) * p1) as Constraint);
|
solver.addConstraint(p2.equals(cm(2.0) * p1));
|
||||||
solver.addConstraint((container == (p1 + p2 + p3)) as Constraint);
|
solver.addConstraint(container.equals(p1 + p2 + p3));
|
||||||
|
|
||||||
solver.flushUpdates();
|
solver.flushUpdates();
|
||||||
|
|
||||||
@ -541,7 +541,7 @@ void main() {
|
|||||||
|
|
||||||
expect(s.addEditVariable(mid.variable, Priority.strong), Result.success);
|
expect(s.addEditVariable(mid.variable, Priority.strong), Result.success);
|
||||||
|
|
||||||
expect(s.addConstraint((mid * cm(2.0) == left + right) as Constraint),
|
expect(s.addConstraint((mid * cm(2.0)).equals(left + right)),
|
||||||
Result.success);
|
Result.success);
|
||||||
expect(s.addConstraint(left >= cm(0.0)), Result.success);
|
expect(s.addConstraint(left >= cm(0.0)), Result.success);
|
||||||
|
|
||||||
@ -565,7 +565,7 @@ void main() {
|
|||||||
|
|
||||||
expect(s.addEditVariable(mid.variable, Priority.strong), Result.success);
|
expect(s.addEditVariable(mid.variable, Priority.strong), Result.success);
|
||||||
|
|
||||||
expect(s.addConstraint((mid * cm(2.0) == left + right) as Constraint),
|
expect(s.addConstraint((mid * cm(2.0)).equals(left + right)),
|
||||||
Result.success);
|
Result.success);
|
||||||
expect(s.addConstraint(left >= cm(10.0)), Result.success);
|
expect(s.addConstraint(left >= cm(10.0)), Result.success);
|
||||||
|
|
||||||
@ -590,7 +590,7 @@ void main() {
|
|||||||
Param left = new Param();
|
Param left = new Param();
|
||||||
Param right = new Param();
|
Param right = new Param();
|
||||||
|
|
||||||
expect((left == right).runtimeType, Constraint);
|
expect(left.equals(right).runtimeType, Constraint);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('bulk_add_edit_variables', () {
|
test('bulk_add_edit_variables', () {
|
||||||
|
@ -10,8 +10,8 @@ import 'object.dart';
|
|||||||
/// Hosts the edge parameters and vends useful methods to construct expressions
|
/// Hosts the edge parameters and vends useful methods to construct expressions
|
||||||
/// for constraints. Also sets up and manages implicit constraints and edit
|
/// for constraints. Also sets up and manages implicit constraints and edit
|
||||||
/// variables.
|
/// variables.
|
||||||
class AutoLayoutParams {
|
class AutoLayoutRect {
|
||||||
AutoLayoutParams() {
|
AutoLayoutRect() {
|
||||||
_left = new al.Param();
|
_left = new al.Param();
|
||||||
_right = new al.Param();
|
_right = new al.Param();
|
||||||
_top = new al.Param();
|
_top = new al.Param();
|
||||||
@ -34,7 +34,7 @@ class AutoLayoutParams {
|
|||||||
al.Expression get horizontalCenter => (_left + _right) / al.cm(2.0);
|
al.Expression get horizontalCenter => (_left + _right) / al.cm(2.0);
|
||||||
al.Expression get verticalCenter => (_top + _bottom) / al.cm(2.0);
|
al.Expression get verticalCenter => (_top + _bottom) / al.cm(2.0);
|
||||||
|
|
||||||
List<al.Constraint> contains(AutoLayoutParams other) {
|
List<al.Constraint> contains(AutoLayoutRect other) {
|
||||||
return <al.Constraint>[
|
return <al.Constraint>[
|
||||||
other.left >= left,
|
other.left >= left,
|
||||||
other.right <= right,
|
other.right <= right,
|
||||||
@ -49,34 +49,34 @@ class AutoLayoutParentData extends ContainerBoxParentDataMixin<RenderBox> {
|
|||||||
|
|
||||||
final RenderBox _renderBox;
|
final RenderBox _renderBox;
|
||||||
|
|
||||||
AutoLayoutParams get params => _params;
|
AutoLayoutRect get rect => _rect;
|
||||||
AutoLayoutParams _params;
|
AutoLayoutRect _rect;
|
||||||
void set params(AutoLayoutParams value) {
|
void set rect(AutoLayoutRect value) {
|
||||||
if (_params == value)
|
if (_rect == value)
|
||||||
return;
|
return;
|
||||||
if (_params != null)
|
if (_rect != null)
|
||||||
_removeImplicitConstraints();
|
_removeImplicitConstraints();
|
||||||
_params = value;
|
_rect = value;
|
||||||
if (_params != null)
|
if (_rect != null)
|
||||||
_addImplicitConstraints();
|
_addImplicitConstraints();
|
||||||
}
|
}
|
||||||
|
|
||||||
BoxConstraints get _constraintsFromSolver {
|
BoxConstraints get _constraintsFromSolver {
|
||||||
return new BoxConstraints.tightFor(
|
return new BoxConstraints.tightFor(
|
||||||
width: _params._right.value - _params._left.value,
|
width: _rect._right.value - _rect._left.value,
|
||||||
height: _params._bottom.value - _params._top.value
|
height: _rect._bottom.value - _rect._top.value
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Offset get _offsetFromSolver {
|
Offset get _offsetFromSolver {
|
||||||
return new Offset(_params._left.value, _params._top.value);
|
return new Offset(_rect._left.value, _rect._top.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<al.Constraint> _implicitConstraints;
|
List<al.Constraint> _implicitConstraints;
|
||||||
|
|
||||||
void _addImplicitConstraints() {
|
void _addImplicitConstraints() {
|
||||||
assert(_renderBox != null);
|
assert(_renderBox != null);
|
||||||
if (_renderBox.parent == null || _params == null)
|
if (_renderBox.parent == null || _rect == null)
|
||||||
return;
|
return;
|
||||||
final List<al.Constraint> implicit = _constructImplicitConstraints();
|
final List<al.Constraint> implicit = _constructImplicitConstraints();
|
||||||
assert(implicit != null && implicit.isNotEmpty);
|
assert(implicit != null && implicit.isNotEmpty);
|
||||||
@ -106,8 +106,9 @@ class AutoLayoutParentData extends ContainerBoxParentDataMixin<RenderBox> {
|
|||||||
/// may return null.
|
/// may return null.
|
||||||
List<al.Constraint> _constructImplicitConstraints() {
|
List<al.Constraint> _constructImplicitConstraints() {
|
||||||
return <al.Constraint>[
|
return <al.Constraint>[
|
||||||
_params._left >= al.cm(0.0), // The left edge must be positive.
|
_rect._left >= al.cm(0.0), // The left edge must be positive.
|
||||||
_params._right >= _params._left, // Width must be positive.
|
_rect._right >= _rect._left, // Width must be positive.
|
||||||
|
// Why don't we need something similar for the top and the bottom?
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -115,7 +116,7 @@ class AutoLayoutParentData extends ContainerBoxParentDataMixin<RenderBox> {
|
|||||||
abstract class AutoLayoutDelegate {
|
abstract class AutoLayoutDelegate {
|
||||||
const AutoLayoutDelegate();
|
const AutoLayoutDelegate();
|
||||||
|
|
||||||
List<al.Constraint> getConstraints(AutoLayoutParams parent);
|
List<al.Constraint> getConstraints(AutoLayoutRect parent);
|
||||||
bool shouldUpdateConstraints(AutoLayoutDelegate oldDelegate);
|
bool shouldUpdateConstraints(AutoLayoutDelegate oldDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,10 +129,10 @@ class RenderAutoLayout extends RenderBox
|
|||||||
List<RenderBox> children
|
List<RenderBox> children
|
||||||
}) : _delegate = delegate, _needToUpdateConstraints = (delegate != null) {
|
}) : _delegate = delegate, _needToUpdateConstraints = (delegate != null) {
|
||||||
_solver.addEditVariables(<al.Variable>[
|
_solver.addEditVariables(<al.Variable>[
|
||||||
_params._left.variable,
|
_rect._left.variable,
|
||||||
_params._right.variable,
|
_rect._right.variable,
|
||||||
_params._top.variable,
|
_rect._top.variable,
|
||||||
_params._bottom.variable
|
_rect._bottom.variable
|
||||||
], al.Priority.required - 1);
|
], al.Priority.required - 1);
|
||||||
|
|
||||||
addAll(children);
|
addAll(children);
|
||||||
@ -158,7 +159,7 @@ class RenderAutoLayout extends RenderBox
|
|||||||
|
|
||||||
bool _needToUpdateConstraints;
|
bool _needToUpdateConstraints;
|
||||||
|
|
||||||
final AutoLayoutParams _params = new AutoLayoutParams();
|
final AutoLayoutRect _rect = new AutoLayoutRect();
|
||||||
|
|
||||||
final al.Solver _solver = new al.Solver();
|
final al.Solver _solver = new al.Solver();
|
||||||
final List<al.Constraint> _explicitConstraints = new List<al.Constraint>();
|
final List<al.Constraint> _explicitConstraints = new List<al.Constraint>();
|
||||||
@ -212,17 +213,17 @@ class RenderAutoLayout extends RenderBox
|
|||||||
if (_needToUpdateConstraints) {
|
if (_needToUpdateConstraints) {
|
||||||
_clearExplicitConstraints();
|
_clearExplicitConstraints();
|
||||||
if (_delegate != null)
|
if (_delegate != null)
|
||||||
_setExplicitConstraints(_delegate.getConstraints(_params));
|
_setExplicitConstraints(_delegate.getConstraints(_rect));
|
||||||
_needToUpdateConstraints = false;
|
_needToUpdateConstraints = false;
|
||||||
needToFlushUpdates = true;
|
needToFlushUpdates = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size != _previousSize) {
|
if (size != _previousSize) {
|
||||||
_solver
|
_solver
|
||||||
..suggestValueForVariable(_params._left.variable, 0.0)
|
..suggestValueForVariable(_rect._left.variable, 0.0)
|
||||||
..suggestValueForVariable(_params._top.variable, 0.0)
|
..suggestValueForVariable(_rect._top.variable, 0.0)
|
||||||
..suggestValueForVariable(_params._bottom.variable, size.height)
|
..suggestValueForVariable(_rect._bottom.variable, size.height)
|
||||||
..suggestValueForVariable(_params._right.variable, size.width);
|
..suggestValueForVariable(_rect._right.variable, size.width);
|
||||||
_previousSize = size;
|
_previousSize = size;
|
||||||
needToFlushUpdates = true;
|
needToFlushUpdates = true;
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ import 'package:flutter/rendering.dart';
|
|||||||
import 'framework.dart';
|
import 'framework.dart';
|
||||||
|
|
||||||
export 'package:flutter/rendering.dart' show
|
export 'package:flutter/rendering.dart' show
|
||||||
AutoLayoutParams,
|
AutoLayoutRect,
|
||||||
AutoLayoutDelegate;
|
AutoLayoutDelegate;
|
||||||
|
|
||||||
class AutoLayout extends MultiChildRenderObjectWidget {
|
class AutoLayout extends MultiChildRenderObjectWidget {
|
||||||
@ -27,16 +27,16 @@ class AutoLayout extends MultiChildRenderObjectWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class AutoLayoutChild extends ParentDataWidget<AutoLayout> {
|
class AutoLayoutChild extends ParentDataWidget<AutoLayout> {
|
||||||
AutoLayoutChild({ AutoLayoutParams params, Widget child })
|
AutoLayoutChild({ AutoLayoutRect rect, Widget child })
|
||||||
: params = params, super(key: new ObjectKey(params), child: child);
|
: rect = rect, super(key: new ObjectKey(rect), child: child);
|
||||||
|
|
||||||
final AutoLayoutParams params;
|
final AutoLayoutRect rect;
|
||||||
|
|
||||||
void applyParentData(RenderObject renderObject) {
|
void applyParentData(RenderObject renderObject) {
|
||||||
assert(renderObject.parentData is AutoLayoutParentData);
|
assert(renderObject.parentData is AutoLayoutParentData);
|
||||||
final AutoLayoutParentData parentData = renderObject.parentData;
|
final AutoLayoutParentData parentData = renderObject.parentData;
|
||||||
// AutoLayoutParentData filters out redundant writes and marks needs layout
|
// AutoLayoutParentData filters out redundant writes and marks needs layout
|
||||||
// as appropriate.
|
// as appropriate.
|
||||||
parentData.params = params;
|
parentData.rect = rect;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user