Skip to content

Commit 64a88a5

Browse files
committed
add pinned translate support
1 parent e729942 commit 64a88a5

File tree

3 files changed

+135
-51
lines changed

3 files changed

+135
-51
lines changed

example/pinned_position.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class PinnedPositionExampleState extends State<PinnedPositionExample> {
5858
anchor,
5959
PinnedPos(0.2, PinnedType.percent, 0.2, PinnedType.percent),
6060
PinnedPos(1, PinnedType.percent, 1, PinnedType.percent),
61-
rotateDegree: angle,
61+
angle: angle,
6262
),
6363
),
6464
Container(
@@ -69,7 +69,7 @@ class PinnedPositionExampleState extends State<PinnedPositionExample> {
6969
anchor,
7070
PinnedPos(1, PinnedType.percent, 1, PinnedType.percent),
7171
PinnedPos(0, PinnedType.percent, 0, PinnedType.percent),
72-
rotateDegree: 360 - angle,
72+
angle: 360 - angle,
7373
),
7474
),
7575
Container(
@@ -80,7 +80,7 @@ class PinnedPositionExampleState extends State<PinnedPositionExample> {
8080
anchor,
8181
PinnedPos(0.5, PinnedType.percent, 0.5, PinnedType.percent),
8282
PinnedPos(0.5, PinnedType.percent, 0.5, PinnedType.percent),
83-
rotateDegree: angle,
83+
angle: angle,
8484
),
8585
),
8686
Container(

lib/src/constraint_layout.dart

Lines changed: 111 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -998,9 +998,26 @@ class PinnedPos {
998998
xOffset.hashCode ^ xType.hashCode ^ yOffset.hashCode ^ yType.hashCode;
999999
}
10001000

1001+
class PinnedTranslate extends Offset {
1002+
PinnedInfo pinnedInfo;
1003+
1004+
PinnedTranslate(this.pinnedInfo) : super(0, 0);
1005+
1006+
@override
1007+
bool operator ==(Object other) =>
1008+
identical(this, other) ||
1009+
super == other &&
1010+
other is PinnedTranslate &&
1011+
runtimeType == other.runtimeType &&
1012+
pinnedInfo == other.pinnedInfo;
1013+
1014+
@override
1015+
int get hashCode => super.hashCode ^ pinnedInfo.hashCode;
1016+
}
1017+
10011018
class PinnedInfo {
10021019
/// [0,360]
1003-
int rotateDegree;
1020+
int angle;
10041021
ConstraintId anchorId;
10051022
PinnedPos selfPos;
10061023
PinnedPos targetPos;
@@ -1009,22 +1026,22 @@ class PinnedInfo {
10091026
this.anchorId,
10101027
this.selfPos,
10111028
this.targetPos, {
1012-
this.rotateDegree = 0,
1029+
this.angle = 0,
10131030
});
10141031

10151032
@override
10161033
bool operator ==(Object other) =>
10171034
identical(this, other) ||
10181035
other is PinnedInfo &&
10191036
runtimeType == other.runtimeType &&
1020-
rotateDegree == other.rotateDegree &&
1037+
angle == other.angle &&
10211038
anchorId == other.anchorId &&
10221039
selfPos == other.selfPos &&
10231040
targetPos == other.targetPos;
10241041

10251042
@override
10261043
int get hashCode =>
1027-
rotateDegree.hashCode ^
1044+
angle.hashCode ^
10281045
anchorId.hashCode ^
10291046
selfPos.hashCode ^
10301047
targetPos.hashCode;
@@ -1920,14 +1937,42 @@ class Constraint extends ConstraintDefine {
19201937
needsLayout = true;
19211938
}
19221939

1923-
if (parentData.translate != translate) {
1924-
parentData.translate = translate;
1925-
if (translateConstraint) {
1926-
needsLayout = true;
1940+
if (parentData.translate.runtimeType != translate.runtimeType) {
1941+
needsRecalculateConstraints = true;
1942+
needsLayout = true;
1943+
} else {
1944+
if (translate.runtimeType == Offset) {
1945+
if (parentData.translate != translate) {
1946+
if (translateConstraint) {
1947+
needsLayout = true;
1948+
} else {
1949+
needsPaint = true;
1950+
}
1951+
}
19271952
} else {
1928-
needsPaint = true;
1953+
PinnedInfo lastInfo =
1954+
(parentData.translate as PinnedTranslate).pinnedInfo;
1955+
PinnedInfo currentInto = (translate as PinnedTranslate).pinnedInfo;
1956+
if (lastInfo.anchorId == currentInto.anchorId) {
1957+
if (lastInfo.selfPos != currentInto.selfPos ||
1958+
lastInfo.targetPos != currentInto.targetPos) {
1959+
if (translateConstraint) {
1960+
needsLayout = true;
1961+
} else {
1962+
needsPaint = true;
1963+
}
1964+
} else {
1965+
if (lastInfo.angle != currentInto.angle) {
1966+
needsPaint = true;
1967+
}
1968+
}
1969+
} else {
1970+
needsRecalculateConstraints = true;
1971+
needsLayout = true;
1972+
}
19291973
}
19301974
}
1975+
parentData.translate = translate;
19311976

19321977
if (parentData.widthPercent != widthPercent) {
19331978
parentData.widthPercent = widthPercent;
@@ -2010,8 +2055,7 @@ class Constraint extends ConstraintDefine {
20102055
} else if (parentData.pinnedInfo!.selfPos != pinnedInfo!.selfPos ||
20112056
parentData.pinnedInfo!.targetPos != pinnedInfo!.targetPos) {
20122057
needsLayout = true;
2013-
} else if (parentData.pinnedInfo!.rotateDegree !=
2014-
pinnedInfo!.rotateDegree) {
2058+
} else if (parentData.pinnedInfo!.angle != pinnedInfo!.angle) {
20152059
needsPaint = true;
20162060
}
20172061
}
@@ -2387,7 +2431,14 @@ class _ConstraintRenderBox extends RenderBox
23872431
}
23882432

23892433
set constraintVersion(ConstraintVersion? value) {
2390-
if (_constraintVersion == null || value == null) {
2434+
if (_constraintVersion == null && value == null) {
2435+
// do nothing
2436+
} else if (_constraintVersion == null) {
2437+
_constraintVersion = value;
2438+
markNeedsRecalculateConstraints();
2439+
markNeedsLayout();
2440+
} else if (value == null) {
2441+
_constraintVersion = value;
23912442
markNeedsRecalculateConstraints();
23922443
markNeedsLayout();
23932444
} else {
@@ -2410,9 +2461,9 @@ class _ConstraintRenderBox extends RenderBox
24102461
value._eventOrderVersion) {
24112462
needsReorderEventOrder = true;
24122463
}
2464+
_constraintVersion = value;
24132465
}
24142466
}
2415-
_constraintVersion = value;
24162467
}
24172468

24182469
@override
@@ -2478,6 +2529,10 @@ class _ConstraintRenderBox extends RenderBox
24782529
if (childParentData.pinnedInfo != null) {
24792530
constraintsIdSet.add(childParentData.pinnedInfo!.anchorId);
24802531
}
2532+
if (childParentData.translate is PinnedTranslate) {
2533+
constraintsIdSet.add(
2534+
(childParentData.translate as PinnedTranslate).pinnedInfo.anchorId);
2535+
}
24812536
child = childParentData.nextSibling;
24822537
}
24832538

@@ -2760,6 +2815,12 @@ class _ConstraintRenderBox extends RenderBox
27602815
childParentData.pinnedInfo!.anchorId, childIndex);
27612816
}
27622817

2818+
if (childParentData.translate is PinnedTranslate) {
2819+
currentNode.pinnedConstraint = _getConstrainedNodeForChild(
2820+
(childParentData.translate as PinnedTranslate).pinnedInfo.anchorId,
2821+
childIndex);
2822+
}
2823+
27632824
child = childParentData.nextSibling;
27642825
}
27652826

@@ -3458,9 +3519,14 @@ class _ConstraintRenderBox extends RenderBox
34583519
}
34593520

34603521
Offset calculateChildOffset(_ConstrainedNode node) {
3522+
PinnedInfo? pinnedInfo;
34613523
if (node.pinnedInfo != null) {
3462-
PinnedInfo pinnedInfo = node.pinnedInfo!;
3463-
Offset selfOffset = pinnedInfo.selfPos.resolve(node.renderBox!.size);
3524+
pinnedInfo = node.pinnedInfo!;
3525+
} else if (node.translate is PinnedTranslate && node.translateConstraint) {
3526+
pinnedInfo = (node.translate as PinnedTranslate).pinnedInfo;
3527+
}
3528+
if (pinnedInfo != null) {
3529+
Offset selfOffset = pinnedInfo.selfPos.resolve(node.getSize());
34643530
Offset targetOffset =
34653531
pinnedInfo.targetPos.resolve(node.pinnedConstraint!.getSize(this));
34663532
double offsetX =
@@ -3674,6 +3740,12 @@ class _ConstraintRenderBox extends RenderBox
36743740
}
36753741
}
36763742

3743+
if (node.translateConstraint) {
3744+
Offset translate = node.translate;
3745+
offsetX += translate.dx;
3746+
offsetY += translate.dy;
3747+
}
3748+
36773749
return Offset(offsetX, offsetY);
36783750
}
36793751

@@ -3778,15 +3850,33 @@ class _ConstraintRenderBox extends RenderBox
37783850
paintShift = element.translate;
37793851
}
37803852

3853+
PinnedInfo? pinnedInfo;
37813854
if (element.pinnedInfo != null) {
3855+
pinnedInfo = element.pinnedInfo;
3856+
} else if (element.translate is PinnedTranslate) {
3857+
pinnedInfo = (element.translate as PinnedTranslate).pinnedInfo;
3858+
if (!element.translateConstraint) {
3859+
Offset selfOffset = pinnedInfo.selfPos.resolve(element.getSize());
3860+
Offset targetOffset = pinnedInfo.targetPos
3861+
.resolve(element.pinnedConstraint!.getSize(this));
3862+
double offsetX = element.pinnedConstraint!.getX() +
3863+
targetOffset.dx -
3864+
selfOffset.dx -
3865+
element.getX();
3866+
double offsetY = element.pinnedConstraint!.getY() +
3867+
targetOffset.dy -
3868+
selfOffset.dy -
3869+
element.getY();
3870+
paintShift = Offset(offsetX, offsetY);
3871+
}
3872+
}
3873+
if (pinnedInfo != null) {
37823874
context.canvas.save();
3783-
Offset anchorOffset =
3784-
element.pinnedInfo!.selfPos.resolve(element.getSize());
3875+
Offset anchorOffset = pinnedInfo.selfPos.resolve(element.getSize());
37853876
context.canvas.translate(
37863877
element.offset.dx + offset.dx + paintShift.dx + anchorOffset.dx,
37873878
element.offset.dy + offset.dy + paintShift.dy + anchorOffset.dy);
3788-
context.canvas
3789-
.rotate(pi + pi * (element.pinnedInfo!.rotateDegree / 180));
3879+
context.canvas.rotate(pi + pi * (pinnedInfo.angle / 180));
37903880
context.paintChild(
37913881
element.renderBox!,
37923882
Offset(-element.getMeasuredWidth() + anchorOffset.dx,
@@ -4049,16 +4139,10 @@ class _ConstrainedNode {
40494139

40504140
bool laidOutLater = false;
40514141

4052-
Offset get offset {
4053-
if (translateConstraint) {
4054-
return parentData.offset + translate;
4055-
} else {
4056-
return parentData.offset;
4057-
}
4058-
}
4142+
Offset get offset => parentData.offset;
40594143

40604144
Offset get translate {
4061-
if (!percentageTranslate) {
4145+
if (!percentageTranslate || parentData.translate is PinnedTranslate) {
40624146
return parentData.translate!;
40634147
} else {
40644148
double dx = renderBox!.size.width * parentData.translate!.dx;

0 commit comments

Comments
 (0)