Showing
3 changed files
with
72 additions
and
0 deletions
@@ -4,6 +4,7 @@ | @@ -4,6 +4,7 @@ | ||
4 | 4 | ||
5 | * Add better debugPaint on Align Widget | 5 | * Add better debugPaint on Align Widget |
6 | * Fix Transform placement when Alignment and Origin are Null | 6 | * Fix Transform placement when Alignment and Origin are Null |
7 | +* Add Transform.rotateBox constructor | ||
7 | 8 | ||
8 | ## 1.3.15 | 9 | ## 1.3.15 |
9 | 10 |
@@ -128,6 +128,7 @@ class Transform extends SingleChildWidget { | @@ -128,6 +128,7 @@ class Transform extends SingleChildWidget { | ||
128 | this.alignment, | 128 | this.alignment, |
129 | Widget child, | 129 | Widget child, |
130 | }) : assert(transform != null), | 130 | }) : assert(transform != null), |
131 | + _relayout = false, | ||
131 | super(child: child); | 132 | super(child: child); |
132 | 133 | ||
133 | /// Creates a widget that transforms its child using a rotation around the | 134 | /// Creates a widget that transforms its child using a rotation around the |
@@ -138,6 +139,18 @@ class Transform extends SingleChildWidget { | @@ -138,6 +139,18 @@ class Transform extends SingleChildWidget { | ||
138 | this.alignment = Alignment.center, | 139 | this.alignment = Alignment.center, |
139 | Widget child, | 140 | Widget child, |
140 | }) : transform = Matrix4.rotationZ(angle), | 141 | }) : transform = Matrix4.rotationZ(angle), |
142 | + _relayout = false, | ||
143 | + super(child: child); | ||
144 | + | ||
145 | + /// Creates a widget that transforms its child using a rotation around the | ||
146 | + /// center and relayout the bounding box. | ||
147 | + Transform.rotateBox({ | ||
148 | + @required double angle, | ||
149 | + Widget child, | ||
150 | + }) : transform = Matrix4.rotationZ(angle), | ||
151 | + _relayout = true, | ||
152 | + alignment = null, | ||
153 | + origin = null, | ||
141 | super(child: child); | 154 | super(child: child); |
142 | 155 | ||
143 | /// Creates a widget that transforms its child using a translation. | 156 | /// Creates a widget that transforms its child using a translation. |
@@ -147,6 +160,7 @@ class Transform extends SingleChildWidget { | @@ -147,6 +160,7 @@ class Transform extends SingleChildWidget { | ||
147 | }) : transform = Matrix4.translationValues(offset.x, offset.y, 0), | 160 | }) : transform = Matrix4.translationValues(offset.x, offset.y, 0), |
148 | origin = null, | 161 | origin = null, |
149 | alignment = null, | 162 | alignment = null, |
163 | + _relayout = false, | ||
150 | super(child: child); | 164 | super(child: child); |
151 | 165 | ||
152 | /// Creates a widget that scales its child uniformly. | 166 | /// Creates a widget that scales its child uniformly. |
@@ -156,6 +170,7 @@ class Transform extends SingleChildWidget { | @@ -156,6 +170,7 @@ class Transform extends SingleChildWidget { | ||
156 | this.alignment = Alignment.center, | 170 | this.alignment = Alignment.center, |
157 | Widget child, | 171 | Widget child, |
158 | }) : transform = Matrix4.diagonal3Values(scale, scale, 1), | 172 | }) : transform = Matrix4.diagonal3Values(scale, scale, 1), |
173 | + _relayout = false, | ||
159 | super(child: child); | 174 | super(child: child); |
160 | 175 | ||
161 | /// The matrix to transform the child by during painting. | 176 | /// The matrix to transform the child by during painting. |
@@ -167,6 +182,8 @@ class Transform extends SingleChildWidget { | @@ -167,6 +182,8 @@ class Transform extends SingleChildWidget { | ||
167 | /// The alignment of the origin, relative to the size of the box. | 182 | /// The alignment of the origin, relative to the size of the box. |
168 | final Alignment alignment; | 183 | final Alignment alignment; |
169 | 184 | ||
185 | + final bool _relayout; | ||
186 | + | ||
170 | Matrix4 get _effectiveTransform { | 187 | Matrix4 get _effectiveTransform { |
171 | final Matrix4 result = Matrix4.identity(); | 188 | final Matrix4 result = Matrix4.identity(); |
172 | if (origin != null) { | 189 | if (origin != null) { |
@@ -189,6 +206,50 @@ class Transform extends SingleChildWidget { | @@ -189,6 +206,50 @@ class Transform extends SingleChildWidget { | ||
189 | } | 206 | } |
190 | 207 | ||
191 | @override | 208 | @override |
209 | + void layout(Context context, BoxConstraints constraints, | ||
210 | + {bool parentUsesSize = false}) { | ||
211 | + if (!_relayout) { | ||
212 | + return super.layout(context, constraints, parentUsesSize: parentUsesSize); | ||
213 | + } | ||
214 | + | ||
215 | + if (child != null) { | ||
216 | + child.layout(context, constraints, parentUsesSize: parentUsesSize); | ||
217 | + assert(child.box != null); | ||
218 | + box = child.box; | ||
219 | + | ||
220 | + final Matrix4 mat = transform; | ||
221 | + final List<double> values = mat.applyToVector3Array(<double>[ | ||
222 | + child.box.left, | ||
223 | + child.box.top, | ||
224 | + 0, | ||
225 | + child.box.right, | ||
226 | + child.box.top, | ||
227 | + 0, | ||
228 | + child.box.right, | ||
229 | + child.box.bottom, | ||
230 | + 0, | ||
231 | + child.box.left, | ||
232 | + child.box.bottom, | ||
233 | + 0, | ||
234 | + ]); | ||
235 | + | ||
236 | + box = PdfRect.fromLTRB( | ||
237 | + math.min( | ||
238 | + math.min(math.min(values[0], values[3]), values[6]), values[9]), | ||
239 | + math.min( | ||
240 | + math.min(math.min(values[1], values[4]), values[7]), values[10]), | ||
241 | + math.max( | ||
242 | + math.max(math.max(values[0], values[3]), values[6]), values[9]), | ||
243 | + math.max( | ||
244 | + math.max(math.max(values[1], values[4]), values[7]), values[10]), | ||
245 | + ); | ||
246 | + transform.leftTranslate(-box.x, -box.y); | ||
247 | + } else { | ||
248 | + box = PdfRect.fromPoints(PdfPoint.zero, constraints.smallest); | ||
249 | + } | ||
250 | + } | ||
251 | + | ||
252 | + @override | ||
192 | void paint(Context context) { | 253 | void paint(Context context) { |
193 | super.paint(context); | 254 | super.paint(context); |
194 | 255 |
@@ -191,6 +191,16 @@ void main() { | @@ -191,6 +191,16 @@ void main() { | ||
191 | ))); | 191 | ))); |
192 | }); | 192 | }); |
193 | 193 | ||
194 | + test('Basic Widgets Transform rotateBox', () { | ||
195 | + pdf.addPage(Page( | ||
196 | + build: (Context context) => Center( | ||
197 | + child: Transform.rotateBox( | ||
198 | + angle: 3.1416 / 2, | ||
199 | + child: Text('Hello'), | ||
200 | + ), | ||
201 | + ))); | ||
202 | + }); | ||
203 | + | ||
194 | tearDownAll(() { | 204 | tearDownAll(() { |
195 | final File file = File('widgets-basic.pdf'); | 205 | final File file = File('widgets-basic.pdf'); |
196 | file.writeAsBytesSync(pdf.save()); | 206 | file.writeAsBytesSync(pdf.save()); |
-
Please register or login to post a comment