@@ -13,49 +13,114 @@ final class FreeformResizer extends Resizer {
1313 required HandlePosition handle,
1414 required Constraints constraints,
1515 required Flip flip,
16+ required double rotation,
17+ required BindingStrategy bindingStrategy,
1618 }) {
19+ final Box effectiveInitialRect = flipRect (initialRect, flip, handle);
20+ final Box initialBoundingRect = BoxTransformer .calculateBoundingRect (
21+ rotation: rotation,
22+ unrotatedBox: effectiveInitialRect,
23+ );
24+
1725 final flippedHandle = handle.flip (flip);
18- Box effectiveInitialRect = flipRect (initialRect, flip, handle);
26+
27+ final Box effectiveInitialBoundingRect =
28+ flipRect (initialBoundingRect, flip, handle);
1929
2030 Box newRect = Box .fromLTRB (
2131 max (explodedRect.left, clampingRect.left),
2232 max (explodedRect.top, clampingRect.top),
2333 min (explodedRect.right, clampingRect.right),
2434 min (explodedRect.bottom, clampingRect.bottom),
2535 );
36+ Box newBoundingRect = BoxTransformer .calculateBoundingRect (
37+ rotation: rotation,
38+ unrotatedBox: newRect,
39+ );
2640
2741 bool isValid = true ;
2842 if (! constraints.isUnconstrained) {
29- final constrainedWidth =
30- newRect.width.clamp (constraints.minWidth, constraints.maxWidth);
31- final constrainedHeight =
32- newRect.height.clamp (constraints.minHeight, constraints.maxHeight);
43+ final bindingRect = bindingStrategy == BindingStrategy .originalBox
44+ ? newRect
45+ : newBoundingRect;
46+
47+ final Dimension constrainedSize = Dimension (
48+ bindingRect.width.clamp (constraints.minWidth, constraints.maxWidth),
49+ bindingRect.height.clamp (constraints.minHeight, constraints.maxHeight),
50+ );
51+ final Dimension constrainedDelta = Dimension (
52+ constrainedSize.width - bindingRect.width,
53+ constrainedSize.height - bindingRect.height,
54+ );
3355
3456 newRect = Box .fromHandle (
3557 flippedHandle.anchor (effectiveInitialRect),
3658 flippedHandle,
37- constrainedWidth,
38- constrainedHeight,
59+ newRect.width + constrainedDelta.width,
60+ newRect.height + constrainedDelta.height,
61+ );
62+ newBoundingRect = Box .fromHandle (
63+ flippedHandle.anchor (effectiveInitialBoundingRect),
64+ flippedHandle,
65+ newBoundingRect.width + constrainedDelta.width,
66+ newBoundingRect.height + constrainedDelta.height,
3967 );
4068
41- isValid = isValidRect (newRect, constraints, clampingRect);
69+ isValid = isValidRect (
70+ switch (bindingStrategy) {
71+ BindingStrategy .originalBox => newRect,
72+ BindingStrategy .boundingBox => newBoundingRect,
73+ },
74+ constraints,
75+ clampingRect,
76+ );
4277 if (! isValid) {
4378 newRect = Box .fromHandle (
4479 handle.anchor (initialRect),
4580 handle,
4681 ! handle.isSide || handle.isHorizontal
4782 ? constraints.minWidth
48- : constrainedWidth ,
83+ : newRect.width ,
4984 ! handle.isSide || handle.isVertical
5085 ? constraints.minHeight
51- : constrainedHeight,
86+ : newRect.height,
87+ );
88+ newBoundingRect = Box .fromHandle (
89+ handle.anchor (initialBoundingRect),
90+ handle,
91+ ! handle.isSide || handle.isHorizontal
92+ ? constraints.minWidth
93+ : newBoundingRect.width,
94+ ! handle.isSide || handle.isVertical
95+ ? constraints.minHeight
96+ : newBoundingRect.height,
5297 );
5398 }
5499 }
55100
56- // Not used but calculating it for returning correct largest box.
101+ if (rotation != 0 ) {
102+ final Vector2 positionDelta = newRect.topLeft - initialRect.topLeft;
103+ final Vector2 newPos = BoxTransformer .calculateUnrotatedPos (
104+ initialRect,
105+ rotation,
106+ positionDelta,
107+ newRect.size,
108+ );
109+ newRect = Box .fromLTWH (newPos.x, newPos.y, newRect.width, newRect.height);
110+ }
111+
112+ final Box effectiveBindingRect = switch (bindingStrategy) {
113+ BindingStrategy .originalBox => effectiveInitialRect,
114+ BindingStrategy .boundingBox => effectiveInitialBoundingRect,
115+ };
116+ final Box bindingRect = switch (bindingStrategy) {
117+ BindingStrategy .originalBox => initialRect,
118+ BindingStrategy .boundingBox => initialBoundingRect,
119+ };
120+
121+ // Only used for calculating the correct largest box.
57122 final Box area = getAvailableAreaForHandle (
58- rect: isValid ? effectiveInitialRect : initialRect ,
123+ rect: isValid ? effectiveBindingRect : bindingRect ,
59124 handle: isValid ? flippedHandle : handle,
60125 clampingRect: clampingRect,
61126 );
0 commit comments