@@ -998,9 +998,26 @@ class PinnedPos {
998
998
xOffset.hashCode ^ xType.hashCode ^ yOffset.hashCode ^ yType.hashCode;
999
999
}
1000
1000
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
+
1001
1018
class PinnedInfo {
1002
1019
/// [0,360]
1003
- int rotateDegree ;
1020
+ int angle ;
1004
1021
ConstraintId anchorId;
1005
1022
PinnedPos selfPos;
1006
1023
PinnedPos targetPos;
@@ -1009,22 +1026,22 @@ class PinnedInfo {
1009
1026
this .anchorId,
1010
1027
this .selfPos,
1011
1028
this .targetPos, {
1012
- this .rotateDegree = 0 ,
1029
+ this .angle = 0 ,
1013
1030
});
1014
1031
1015
1032
@override
1016
1033
bool operator == (Object other) =>
1017
1034
identical (this , other) ||
1018
1035
other is PinnedInfo &&
1019
1036
runtimeType == other.runtimeType &&
1020
- rotateDegree == other.rotateDegree &&
1037
+ angle == other.angle &&
1021
1038
anchorId == other.anchorId &&
1022
1039
selfPos == other.selfPos &&
1023
1040
targetPos == other.targetPos;
1024
1041
1025
1042
@override
1026
1043
int get hashCode =>
1027
- rotateDegree .hashCode ^
1044
+ angle .hashCode ^
1028
1045
anchorId.hashCode ^
1029
1046
selfPos.hashCode ^
1030
1047
targetPos.hashCode;
@@ -1920,14 +1937,42 @@ class Constraint extends ConstraintDefine {
1920
1937
needsLayout = true ;
1921
1938
}
1922
1939
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
+ }
1927
1952
} 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
+ }
1929
1973
}
1930
1974
}
1975
+ parentData.translate = translate;
1931
1976
1932
1977
if (parentData.widthPercent != widthPercent) {
1933
1978
parentData.widthPercent = widthPercent;
@@ -2010,8 +2055,7 @@ class Constraint extends ConstraintDefine {
2010
2055
} else if (parentData.pinnedInfo! .selfPos != pinnedInfo! .selfPos ||
2011
2056
parentData.pinnedInfo! .targetPos != pinnedInfo! .targetPos) {
2012
2057
needsLayout = true ;
2013
- } else if (parentData.pinnedInfo! .rotateDegree !=
2014
- pinnedInfo! .rotateDegree) {
2058
+ } else if (parentData.pinnedInfo! .angle != pinnedInfo! .angle) {
2015
2059
needsPaint = true ;
2016
2060
}
2017
2061
}
@@ -2387,7 +2431,14 @@ class _ConstraintRenderBox extends RenderBox
2387
2431
}
2388
2432
2389
2433
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;
2391
2442
markNeedsRecalculateConstraints ();
2392
2443
markNeedsLayout ();
2393
2444
} else {
@@ -2410,9 +2461,9 @@ class _ConstraintRenderBox extends RenderBox
2410
2461
value._eventOrderVersion) {
2411
2462
needsReorderEventOrder = true ;
2412
2463
}
2464
+ _constraintVersion = value;
2413
2465
}
2414
2466
}
2415
- _constraintVersion = value;
2416
2467
}
2417
2468
2418
2469
@override
@@ -2478,6 +2529,10 @@ class _ConstraintRenderBox extends RenderBox
2478
2529
if (childParentData.pinnedInfo != null ) {
2479
2530
constraintsIdSet.add (childParentData.pinnedInfo! .anchorId);
2480
2531
}
2532
+ if (childParentData.translate is PinnedTranslate ) {
2533
+ constraintsIdSet.add (
2534
+ (childParentData.translate as PinnedTranslate ).pinnedInfo.anchorId);
2535
+ }
2481
2536
child = childParentData.nextSibling;
2482
2537
}
2483
2538
@@ -2760,6 +2815,12 @@ class _ConstraintRenderBox extends RenderBox
2760
2815
childParentData.pinnedInfo! .anchorId, childIndex);
2761
2816
}
2762
2817
2818
+ if (childParentData.translate is PinnedTranslate ) {
2819
+ currentNode.pinnedConstraint = _getConstrainedNodeForChild (
2820
+ (childParentData.translate as PinnedTranslate ).pinnedInfo.anchorId,
2821
+ childIndex);
2822
+ }
2823
+
2763
2824
child = childParentData.nextSibling;
2764
2825
}
2765
2826
@@ -3458,9 +3519,14 @@ class _ConstraintRenderBox extends RenderBox
3458
3519
}
3459
3520
3460
3521
Offset calculateChildOffset (_ConstrainedNode node) {
3522
+ PinnedInfo ? pinnedInfo;
3461
3523
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 ());
3464
3530
Offset targetOffset =
3465
3531
pinnedInfo.targetPos.resolve (node.pinnedConstraint! .getSize (this ));
3466
3532
double offsetX =
@@ -3674,6 +3740,12 @@ class _ConstraintRenderBox extends RenderBox
3674
3740
}
3675
3741
}
3676
3742
3743
+ if (node.translateConstraint) {
3744
+ Offset translate = node.translate;
3745
+ offsetX += translate.dx;
3746
+ offsetY += translate.dy;
3747
+ }
3748
+
3677
3749
return Offset (offsetX, offsetY);
3678
3750
}
3679
3751
@@ -3778,15 +3850,33 @@ class _ConstraintRenderBox extends RenderBox
3778
3850
paintShift = element.translate;
3779
3851
}
3780
3852
3853
+ PinnedInfo ? pinnedInfo;
3781
3854
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 ) {
3782
3874
context.canvas.save ();
3783
- Offset anchorOffset =
3784
- element.pinnedInfo! .selfPos.resolve (element.getSize ());
3875
+ Offset anchorOffset = pinnedInfo.selfPos.resolve (element.getSize ());
3785
3876
context.canvas.translate (
3786
3877
element.offset.dx + offset.dx + paintShift.dx + anchorOffset.dx,
3787
3878
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 ));
3790
3880
context.paintChild (
3791
3881
element.renderBox! ,
3792
3882
Offset (- element.getMeasuredWidth () + anchorOffset.dx,
@@ -4049,16 +4139,10 @@ class _ConstrainedNode {
4049
4139
4050
4140
bool laidOutLater = false ;
4051
4141
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;
4059
4143
4060
4144
Offset get translate {
4061
- if (! percentageTranslate) {
4145
+ if (! percentageTranslate || parentData.translate is PinnedTranslate ) {
4062
4146
return parentData.translate! ;
4063
4147
} else {
4064
4148
double dx = renderBox! .size.width * parentData.translate! .dx;
0 commit comments