Milad akarie
Committed by David PHAM-VAN

Add RTL support to GridView

@@ -38,13 +38,13 @@ class ChartLegend extends StatelessWidget { @@ -38,13 +38,13 @@ class ChartLegend extends StatelessWidget {
38 38
39 final TextStyle? textStyle; 39 final TextStyle? textStyle;
40 40
41 - final Alignment position; 41 + final AlignmentGeometry position;
42 42
43 final Axis direction; 43 final Axis direction;
44 44
45 final BoxDecoration? decoration; 45 final BoxDecoration? decoration;
46 46
47 - final EdgeInsets padding; 47 + final EdgeInsetsGeometry padding;
48 48
49 Widget _buildLegend(Context context, Dataset dataset) { 49 Widget _buildLegend(Context context, Dataset dataset) {
50 final style = Theme.of(context).defaultTextStyle.merge(textStyle); 50 final style = Theme.of(context).defaultTextStyle.merge(textStyle);
@@ -75,9 +75,9 @@ class Container extends StatelessWidget { @@ -75,9 +75,9 @@ class Container extends StatelessWidget {
75 75
76 final Widget? child; 76 final Widget? child;
77 77
78 - final Alignment? alignment; 78 + final AlignmentGeometry? alignment;
79 79
80 - final EdgeInsets? padding; 80 + final EdgeInsetsGeometry? padding;
81 81
82 /// The decoration to paint behind the [child]. 82 /// The decoration to paint behind the [child].
83 final BoxDecoration? decoration; 83 final BoxDecoration? decoration;
@@ -89,7 +89,7 @@ class Container extends StatelessWidget { @@ -89,7 +89,7 @@ class Container extends StatelessWidget {
89 final BoxConstraints? constraints; 89 final BoxConstraints? constraints;
90 90
91 /// Empty space to surround the [decoration] and [child]. 91 /// Empty space to surround the [decoration] and [child].
92 - final EdgeInsets? margin; 92 + final EdgeInsetsGeometry? margin;
93 93
94 /// The transformation matrix to apply before painting the container. 94 /// The transformation matrix to apply before painting the container.
95 final Matrix4? transform; 95 final Matrix4? transform;
@@ -56,9 +56,9 @@ class Header extends StatelessWidget { @@ -56,9 +56,9 @@ class Header extends StatelessWidget {
56 56
57 final BoxDecoration? decoration; 57 final BoxDecoration? decoration;
58 58
59 - final EdgeInsets? margin; 59 + final EdgeInsetsGeometry? margin;
60 60
61 - final EdgeInsets? padding; 61 + final EdgeInsetsGeometry? padding;
62 62
63 final TextStyle? textStyle; 63 final TextStyle? textStyle;
64 64
@@ -190,9 +190,9 @@ class Paragraph extends StatelessWidget { @@ -190,9 +190,9 @@ class Paragraph extends StatelessWidget {
190 190
191 final TextStyle? style; 191 final TextStyle? style;
192 192
193 - final EdgeInsets margin; 193 + final EdgeInsetsGeometry margin;
194 194
195 - final EdgeInsets? padding; 195 + final EdgeInsetsGeometry? padding;
196 196
197 @override 197 @override
198 Widget build(Context context) { 198 Widget build(Context context) {
@@ -232,11 +232,11 @@ class Bullet extends StatelessWidget { @@ -232,11 +232,11 @@ class Bullet extends StatelessWidget {
232 232
233 final TextStyle? style; 233 final TextStyle? style;
234 234
235 - final EdgeInsets margin; 235 + final EdgeInsetsGeometry margin;
236 236
237 - final EdgeInsets? padding; 237 + final EdgeInsetsGeometry? padding;
238 238
239 - final EdgeInsets bulletMargin; 239 + final EdgeInsetsGeometry bulletMargin;
240 240
241 final double bulletSize; 241 final double bulletSize;
242 242
@@ -649,7 +649,7 @@ class ListView extends StatelessWidget { @@ -649,7 +649,7 @@ class ListView extends StatelessWidget {
649 super(); 649 super();
650 650
651 final Axis direction; 651 final Axis direction;
652 - final EdgeInsets? padding; 652 + final EdgeInsetsGeometry? padding;
653 final double? spacing; 653 final double? spacing;
654 final bool reverse; 654 final bool reverse;
655 final IndexedWidgetBuilder? itemBuilder; 655 final IndexedWidgetBuilder? itemBuilder;
@@ -15,9 +15,7 @@ @@ -15,9 +15,7 @@
15 */ 15 */
16 16
17 import '../../pdf.dart'; 17 import '../../pdf.dart';
18 -import 'box_border.dart';  
19 -import 'geometry.dart';  
20 -import 'widget.dart'; 18 +import '../../widgets.dart';
21 19
22 /// A widget that draws a rectilinear grid of lines. 20 /// A widget that draws a rectilinear grid of lines.
23 /// The grid is drawn over the [child] widget. 21 /// The grid is drawn over the [child] widget.
@@ -187,7 +185,7 @@ class GridPaper extends SingleChildWidget { @@ -187,7 +185,7 @@ class GridPaper extends SingleChildWidget {
187 final int verticalSubdivisions; 185 final int verticalSubdivisions;
188 186
189 /// The margin to apply to the horizontal and vertical lines 187 /// The margin to apply to the horizontal and vertical lines
190 - final EdgeInsets margin; 188 + final EdgeInsetsGeometry margin;
191 189
192 final int horizontalOffset; 190 final int horizontalOffset;
193 191
@@ -202,12 +200,14 @@ class GridPaper extends SingleChildWidget { @@ -202,12 +200,14 @@ class GridPaper extends SingleChildWidget {
202 @override 200 @override
203 void layout(Context context, BoxConstraints constraints, 201 void layout(Context context, BoxConstraints constraints,
204 {bool parentUsesSize = false}) { 202 {bool parentUsesSize = false}) {
  203 +
  204 + final resolvedMargin = margin.resolve(Directionality.of(context));
205 box = PdfRect.fromPoints(PdfPoint.zero, constraints.biggest); 205 box = PdfRect.fromPoints(PdfPoint.zero, constraints.biggest);
206 if (child != null) { 206 if (child != null) {
207 if (constraints.hasBoundedWidth && constraints.hasBoundedHeight) { 207 if (constraints.hasBoundedWidth && constraints.hasBoundedHeight) {
208 final childConstraints = BoxConstraints( 208 final childConstraints = BoxConstraints(
209 - maxWidth: constraints.maxWidth - margin.horizontal,  
210 - maxHeight: constraints.maxHeight - margin.vertical, 209 + maxWidth: constraints.maxWidth - resolvedMargin.horizontal,
  210 + maxHeight: constraints.maxHeight - resolvedMargin.vertical,
211 ); 211 );
212 child!.layout(context, childConstraints, parentUsesSize: false); 212 child!.layout(context, childConstraints, parentUsesSize: false);
213 } else { 213 } else {
@@ -216,7 +216,7 @@ class GridPaper extends SingleChildWidget { @@ -216,7 +216,7 @@ class GridPaper extends SingleChildWidget {
216 216
217 assert(child!.box != null); 217 assert(child!.box != null);
218 child!.box = PdfRect.fromPoints( 218 child!.box = PdfRect.fromPoints(
219 - PdfPoint(margin.left, box!.top - margin.top - child!.box!.height), 219 + PdfPoint(resolvedMargin.left, box!.top - resolvedMargin.top - child!.box!.height),
220 child!.box!.size); 220 child!.box!.size);
221 } 221 }
222 } 222 }
@@ -225,7 +225,7 @@ class GridPaper extends SingleChildWidget { @@ -225,7 +225,7 @@ class GridPaper extends SingleChildWidget {
225 void paint(Context context) { 225 void paint(Context context) {
226 super.paint(context); 226 super.paint(context);
227 paintChild(context); 227 paintChild(context);
228 - 228 + final resolvedMargin = margin.resolve(Directionality.of(context));
229 context.canvas.saveContext(); 229 context.canvas.saveContext();
230 context.canvas.setGraphicState(PdfGraphicState(opacity: opacity)); 230 context.canvas.setGraphicState(PdfGraphicState(opacity: opacity));
231 context.canvas.setStrokeColor(horizontalColor); 231 context.canvas.setStrokeColor(horizontalColor);
@@ -236,8 +236,8 @@ class GridPaper extends SingleChildWidget { @@ -236,8 +236,8 @@ class GridPaper extends SingleChildWidget {
236 final allHorizontalDivisions = 236 final allHorizontalDivisions =
237 (horizontalDivisions * horizontalSubdivisions).toDouble(); 237 (horizontalDivisions * horizontalSubdivisions).toDouble();
238 var n = horizontalOffset; 238 var n = horizontalOffset;
239 - for (var x = box!.left + margin.left;  
240 - x <= box!.right - margin.right; 239 + for (var x = box!.left + resolvedMargin.left;
  240 + x <= box!.right - resolvedMargin.right;
241 x += horizontalInterval / allHorizontalDivisions) { 241 x += horizontalInterval / allHorizontalDivisions) {
242 context.canvas 242 context.canvas
243 ..setLineWidth((n % (horizontalSubdivisions * horizontalDivisions) == 0) 243 ..setLineWidth((n % (horizontalSubdivisions * horizontalDivisions) == 0)
@@ -254,8 +254,8 @@ class GridPaper extends SingleChildWidget { @@ -254,8 +254,8 @@ class GridPaper extends SingleChildWidget {
254 final allVerticalDivisions = 254 final allVerticalDivisions =
255 (verticalDivisions * verticalSubdivisions).toDouble(); 255 (verticalDivisions * verticalSubdivisions).toDouble();
256 n = verticalOffset; 256 n = verticalOffset;
257 - for (var y = box!.top - margin.top;  
258 - y >= box!.bottom + margin.bottom; 257 + for (var y = box!.top - resolvedMargin.top;
  258 + y >= box!.bottom + resolvedMargin.bottom;
259 y -= verticalInterval / allVerticalDivisions) { 259 y -= verticalInterval / allVerticalDivisions) {
260 context.canvas 260 context.canvas
261 ..setLineWidth((n % (verticalSubdivisions * verticalDivisions) == 0) 261 ..setLineWidth((n % (verticalSubdivisions * verticalDivisions) == 0)
@@ -273,7 +273,7 @@ class GridPaper extends SingleChildWidget { @@ -273,7 +273,7 @@ class GridPaper extends SingleChildWidget {
273 context.canvas 273 context.canvas
274 ..setStrokeColor(border.left.color) 274 ..setStrokeColor(border.left.color)
275 ..setLineWidth(border.left.width) 275 ..setLineWidth(border.left.width)
276 - ..drawLine(box!.left + margin.left, box!.top, box!.left + margin.left, 276 + ..drawLine(box!.left + resolvedMargin.left, box!.top, box!.left + resolvedMargin.left,
277 box!.bottom) 277 box!.bottom)
278 ..strokePath(); 278 ..strokePath();
279 border.left.style.unsetStyle(context); 279 border.left.style.unsetStyle(context);
@@ -283,8 +283,8 @@ class GridPaper extends SingleChildWidget { @@ -283,8 +283,8 @@ class GridPaper extends SingleChildWidget {
283 context.canvas 283 context.canvas
284 ..setStrokeColor(border.right.color) 284 ..setStrokeColor(border.right.color)
285 ..setLineWidth(border.right.width) 285 ..setLineWidth(border.right.width)
286 - ..drawLine(box!.right - margin.right, box!.top,  
287 - box!.right - margin.right, box!.bottom) 286 + ..drawLine(box!.right - resolvedMargin.right, box!.top,
  287 + box!.right - resolvedMargin.right, box!.bottom)
288 ..strokePath(); 288 ..strokePath();
289 border.right.style.unsetStyle(context); 289 border.right.style.unsetStyle(context);
290 } 290 }
@@ -294,7 +294,7 @@ class GridPaper extends SingleChildWidget { @@ -294,7 +294,7 @@ class GridPaper extends SingleChildWidget {
294 ..setStrokeColor(border.top.color) 294 ..setStrokeColor(border.top.color)
295 ..setLineWidth(border.top.width) 295 ..setLineWidth(border.top.width)
296 ..drawLine( 296 ..drawLine(
297 - box!.left, box!.top - margin.top, box!.right, box!.top - margin.top) 297 + box!.left, box!.top - resolvedMargin.top, box!.right, box!.top - resolvedMargin.top)
298 ..strokePath(); 298 ..strokePath();
299 border.top.style.unsetStyle(context); 299 border.top.style.unsetStyle(context);
300 } 300 }
@@ -303,8 +303,8 @@ class GridPaper extends SingleChildWidget { @@ -303,8 +303,8 @@ class GridPaper extends SingleChildWidget {
303 context.canvas 303 context.canvas
304 ..setStrokeColor(border.bottom.color) 304 ..setStrokeColor(border.bottom.color)
305 ..setLineWidth(border.bottom.width) 305 ..setLineWidth(border.bottom.width)
306 - ..drawLine(box!.left, box!.bottom + margin.bottom, box!.right,  
307 - box!.bottom + margin.bottom) 306 + ..drawLine(box!.left, box!.bottom + resolvedMargin.bottom, box!.right,
  307 + box!.bottom + resolvedMargin.bottom)
308 ..strokePath(); 308 ..strokePath();
309 border.bottom.style.unsetStyle(context); 309 border.bottom.style.unsetStyle(context);
310 } 310 }
@@ -16,12 +16,14 @@ @@ -16,12 +16,14 @@
16 16
17 import 'dart:math' as math; 17 import 'dart:math' as math;
18 18
  19 +import 'package:pdf/widgets.dart';
19 import 'package:vector_math/vector_math_64.dart'; 20 import 'package:vector_math/vector_math_64.dart';
20 21
21 import '../../pdf.dart'; 22 import '../../pdf.dart';
22 import 'flex.dart'; 23 import 'flex.dart';
23 import 'geometry.dart'; 24 import 'geometry.dart';
24 import 'multi_page.dart'; 25 import 'multi_page.dart';
  26 +import 'text_style.dart';
25 import 'widget.dart'; 27 import 'widget.dart';
26 28
27 class GridViewContext extends WidgetContext { 29 class GridViewContext extends WidgetContext {
@@ -45,8 +47,7 @@ class GridViewContext extends WidgetContext { @@ -45,8 +47,7 @@ class GridViewContext extends WidgetContext {
45 } 47 }
46 48
47 @override 49 @override
48 - String toString() =>  
49 - '$runtimeType first:$firstChild last:$lastChild size:${childCrossAxis}x$childMainAxis'; 50 + String toString() => '$runtimeType first:$firstChild last:$lastChild size:${childCrossAxis}x$childMainAxis';
50 } 51 }
51 52
52 class GridView extends MultiChildWidget with SpanningWidget { 53 class GridView extends MultiChildWidget with SpanningWidget {
@@ -61,7 +62,7 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -61,7 +62,7 @@ class GridView extends MultiChildWidget with SpanningWidget {
61 : super(children: children); 62 : super(children: children);
62 63
63 final Axis direction; 64 final Axis direction;
64 - final EdgeInsets padding; 65 + final EdgeInsetsGeometry padding;
65 final int crossAxisCount; 66 final int crossAxisCount;
66 final double mainAxisSpacing; 67 final double mainAxisSpacing;
67 final double crossAxisSpacing; 68 final double crossAxisSpacing;
@@ -72,8 +73,7 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -72,8 +73,7 @@ class GridView extends MultiChildWidget with SpanningWidget {
72 int? _mainAxisCount; 73 int? _mainAxisCount;
73 74
74 @override 75 @override
75 - void layout(Context context, BoxConstraints constraints,  
76 - {bool parentUsesSize = false}) { 76 + void layout(Context context, BoxConstraints constraints, {bool parentUsesSize = false}) {
77 if (children.isEmpty) { 77 if (children.isEmpty) {
78 box = PdfRect.zero; 78 box = PdfRect.zero;
79 return; 79 return;
@@ -81,13 +81,13 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -81,13 +81,13 @@ class GridView extends MultiChildWidget with SpanningWidget {
81 81
82 assert(() { 82 assert(() {
83 if (constraints.maxHeight.isInfinite && childAspectRatio.isInfinite) { 83 if (constraints.maxHeight.isInfinite && childAspectRatio.isInfinite) {
84 - print(  
85 - 'Unable to calculate the GridView dimensions. Please set the height constraints or childAspectRatio.'); 84 + print('Unable to calculate the GridView dimensions. Please set the height constraints or childAspectRatio.');
86 return false; 85 return false;
87 } 86 }
88 return true; 87 return true;
89 }()); 88 }());
90 - 89 + final textDirection = Directionality.of(context);
  90 + final resolvedPadding = padding.resolve(textDirection);
91 late double mainAxisExtent; 91 late double mainAxisExtent;
92 late double crossAxisExtent; 92 late double crossAxisExtent;
93 switch (direction) { 93 switch (direction) {
@@ -102,25 +102,19 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -102,25 +102,19 @@ class GridView extends MultiChildWidget with SpanningWidget {
102 } 102 }
103 103
104 if (constraints.maxHeight.isInfinite || _mainAxisCount == null) { 104 if (constraints.maxHeight.isInfinite || _mainAxisCount == null) {
105 - _mainAxisCount =  
106 - ((children.length - _context.firstChild) / crossAxisCount).ceil(); 105 + _mainAxisCount = ((children.length - _context.firstChild) / crossAxisCount).ceil();
107 106
108 - _context.childCrossAxis = crossAxisExtent / crossAxisCount -  
109 - (crossAxisSpacing * (crossAxisCount - 1) / crossAxisCount); 107 + _context.childCrossAxis =
  108 + crossAxisExtent / crossAxisCount - (crossAxisSpacing * (crossAxisCount - 1) / crossAxisCount);
110 109
111 - _context.childMainAxis = math.min(  
112 - _context.childCrossAxis! * childAspectRatio,  
113 - mainAxisExtent / _mainAxisCount! -  
114 - (mainAxisSpacing * (_mainAxisCount! - 1) / _mainAxisCount!)); 110 + _context.childMainAxis = math.min(_context.childCrossAxis! * childAspectRatio,
  111 + mainAxisExtent / _mainAxisCount! - (mainAxisSpacing * (_mainAxisCount! - 1) / _mainAxisCount!));
115 112
116 if (_context.childCrossAxis!.isInfinite) { 113 if (_context.childCrossAxis!.isInfinite) {
117 - throw Exception(  
118 - 'Unable to calculate child height as the height constraint is infinite.'); 114 + throw Exception('Unable to calculate child height as the height constraint is infinite.');
119 } 115 }
120 } else { 116 } else {
121 - _mainAxisCount = ((mainAxisExtent + mainAxisSpacing) /  
122 - (mainAxisSpacing + _context.childMainAxis!))  
123 - .floor(); 117 + _mainAxisCount = ((mainAxisExtent + mainAxisSpacing) / (mainAxisSpacing + _context.childMainAxis!)).floor();
124 118
125 if (_mainAxisCount! < 0) { 119 if (_mainAxisCount! < 0) {
126 // Not enough space to put one line, try to ask for more space. 120 // Not enough space to put one line, try to ask for more space.
@@ -128,28 +122,22 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -128,28 +122,22 @@ class GridView extends MultiChildWidget with SpanningWidget {
128 } 122 }
129 } 123 }
130 124
131 - final totalMain =  
132 - (_context.childMainAxis! + mainAxisSpacing) * _mainAxisCount! -  
133 - mainAxisSpacing;  
134 - final totalCross =  
135 - (_context.childCrossAxis! + crossAxisSpacing) * crossAxisCount -  
136 - crossAxisSpacing; 125 + final totalMain = (_context.childMainAxis! + mainAxisSpacing) * _mainAxisCount! - mainAxisSpacing;
  126 + final totalCross = (_context.childCrossAxis! + crossAxisSpacing) * crossAxisCount - crossAxisSpacing;
137 127
138 - final startX = padding.left; 128 + final startX = resolvedPadding.left;
139 const startY = 0.0; 129 const startY = 0.0;
140 late double mainAxis; 130 late double mainAxis;
141 late double crossAxis; 131 late double crossAxis;
142 BoxConstraints? innerConstraints; 132 BoxConstraints? innerConstraints;
143 switch (direction) { 133 switch (direction) {
144 case Axis.vertical: 134 case Axis.vertical:
145 - innerConstraints = BoxConstraints.tightFor(  
146 - width: _context.childCrossAxis, height: _context.childMainAxis); 135 + innerConstraints = BoxConstraints.tightFor(width: _context.childCrossAxis, height: _context.childMainAxis);
147 crossAxis = startX; 136 crossAxis = startX;
148 mainAxis = startY; 137 mainAxis = startY;
149 break; 138 break;
150 case Axis.horizontal: 139 case Axis.horizontal:
151 - innerConstraints = BoxConstraints.tightFor(  
152 - width: _context.childMainAxis, height: _context.childCrossAxis); 140 + innerConstraints = BoxConstraints.tightFor(width: _context.childMainAxis, height: _context.childCrossAxis);
153 mainAxis = startX; 141 mainAxis = startX;
154 crossAxis = startY; 142 crossAxis = startY;
155 break; 143 break;
@@ -158,10 +146,9 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -158,10 +146,9 @@ class GridView extends MultiChildWidget with SpanningWidget {
158 var c = 0; 146 var c = 0;
159 _context.lastChild = _context.firstChild; 147 _context.lastChild = _context.firstChild;
160 148
  149 + final isRtl = textDirection == TextDirection.rtl;
161 for (final child in children.sublist( 150 for (final child in children.sublist(
162 - _context.firstChild,  
163 - math.min(children.length,  
164 - _context.firstChild + crossAxisCount * _mainAxisCount!))) { 151 + _context.firstChild, math.min(children.length, _context.firstChild + crossAxisCount * _mainAxisCount!))) {
165 child.layout(context, innerConstraints); 152 child.layout(context, innerConstraints);
166 assert(child.box != null); 153 assert(child.box != null);
167 154
@@ -169,21 +156,26 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -169,21 +156,26 @@ class GridView extends MultiChildWidget with SpanningWidget {
169 case Axis.vertical: 156 case Axis.vertical:
170 child.box = PdfRect.fromPoints( 157 child.box = PdfRect.fromPoints(
171 PdfPoint( 158 PdfPoint(
172 - (_context.childCrossAxis! - child.box!.width) / 2.0 +  
173 - crossAxis,  
174 - totalMain +  
175 - padding.bottom -  
176 - (_context.childMainAxis! - child.box!.height) / 2.0 -  
177 - mainAxis -  
178 - child.box!.height), 159 + isRtl
  160 + ? (_context.childCrossAxis! + child.box!.width - crossAxis)
  161 + : (_context.childCrossAxis! - child.box!.width) / 2.0 + crossAxis,
  162 + totalMain +
  163 + resolvedPadding.bottom -
  164 + (_context.childMainAxis! - child.box!.height) / 2.0 -
  165 + mainAxis -
  166 + child.box!.height,
  167 + ),
179 child.box!.size); 168 child.box!.size);
  169 +
180 break; 170 break;
181 case Axis.horizontal: 171 case Axis.horizontal:
182 child.box = PdfRect.fromPoints( 172 child.box = PdfRect.fromPoints(
183 PdfPoint( 173 PdfPoint(
184 - (_context.childMainAxis! - child.box!.width) / 2.0 + mainAxis, 174 + isRtl
  175 + ? totalMain - (child.box!.width + mainAxis)
  176 + : (_context.childMainAxis! - child.box!.width) / 2.0 + mainAxis,
185 totalCross + 177 totalCross +
186 - padding.bottom - 178 + resolvedPadding.bottom -
187 (_context.childCrossAxis! - child.box!.height) / 2.0 - 179 (_context.childCrossAxis! - child.box!.height) / 2.0 -
188 crossAxis - 180 crossAxis -
189 child.box!.height), 181 child.box!.height),
@@ -216,14 +208,10 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -216,14 +208,10 @@ class GridView extends MultiChildWidget with SpanningWidget {
216 208
217 switch (direction) { 209 switch (direction) {
218 case Axis.vertical: 210 case Axis.vertical:
219 - box = constraints.constrainRect(  
220 - width: totalCross + padding.horizontal,  
221 - height: totalMain + padding.vertical); 211 + box = constraints.constrainRect(width: totalCross + padding.horizontal, height: totalMain + padding.vertical);
222 break; 212 break;
223 case Axis.horizontal: 213 case Axis.horizontal:
224 - box = constraints.constrainRect(  
225 - width: totalMain + padding.horizontal,  
226 - height: totalCross + padding.vertical); 214 + box = constraints.constrainRect(width: totalMain + padding.horizontal, height: totalCross + padding.vertical);
227 break; 215 break;
228 } 216 }
229 } 217 }
@@ -235,6 +223,7 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -235,6 +223,7 @@ class GridView extends MultiChildWidget with SpanningWidget {
235 if (children.isEmpty) { 223 if (children.isEmpty) {
236 return; 224 return;
237 } 225 }
  226 + final resolvedPadding = padding.resolve(Directionality.of(context));
238 227
239 context.canvas 228 context.canvas
240 ..setFillColor(PdfColors.lime) 229 ..setFillColor(PdfColors.lime)
@@ -242,35 +231,26 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -242,35 +231,26 @@ class GridView extends MultiChildWidget with SpanningWidget {
242 ..lineTo(box!.right, box!.bottom) 231 ..lineTo(box!.right, box!.bottom)
243 ..lineTo(box!.right, box!.top) 232 ..lineTo(box!.right, box!.top)
244 ..lineTo(box!.left, box!.top) 233 ..lineTo(box!.left, box!.top)
245 - ..moveTo(box!.left + padding.left, box!.bottom + padding.bottom)  
246 - ..lineTo(box!.left + padding.left, box!.top - padding.top)  
247 - ..lineTo(box!.right - padding.right, box!.top - padding.top)  
248 - ..lineTo(box!.right - padding.right, box!.bottom + padding.bottom) 234 + ..moveTo(box!.left + resolvedPadding.left, box!.bottom + resolvedPadding.bottom)
  235 + ..lineTo(box!.left + resolvedPadding.left, box!.top - resolvedPadding.top)
  236 + ..lineTo(box!.right - resolvedPadding.right, box!.top - resolvedPadding.top)
  237 + ..lineTo(box!.right - resolvedPadding.right, box!.bottom + resolvedPadding.bottom)
249 ..fillPath(); 238 ..fillPath();
250 239
251 for (var c = 1; c < crossAxisCount; c++) { 240 for (var c = 1; c < crossAxisCount; c++) {
252 switch (direction) { 241 switch (direction) {
253 case Axis.vertical: 242 case Axis.vertical:
254 context.canvas 243 context.canvas
255 - ..drawRect(  
256 - box!.left +  
257 - padding.left +  
258 - (_context.childCrossAxis! + crossAxisSpacing) * c -  
259 - crossAxisSpacing,  
260 - box!.bottom + padding.bottom,  
261 - math.max(crossAxisSpacing, 1),  
262 - box!.height - padding.vertical) 244 + ..drawRect(box!.left + resolvedPadding.left + (_context.childCrossAxis! + crossAxisSpacing) * c - crossAxisSpacing,
  245 + box!.bottom + resolvedPadding.bottom, math.max(crossAxisSpacing, 1), box!.height - resolvedPadding.vertical)
263 ..fillPath(); 246 ..fillPath();
264 break; 247 break;
265 case Axis.horizontal: 248 case Axis.horizontal:
266 context.canvas 249 context.canvas
267 ..drawRect( 250 ..drawRect(
268 - box!.left + padding.left,  
269 - box!.bottom +  
270 - padding.bottom +  
271 - (_context.childCrossAxis! + crossAxisSpacing) * c -  
272 - crossAxisSpacing,  
273 - box!.width - padding.horizontal, 251 + box!.left + resolvedPadding.left,
  252 + box!.bottom + resolvedPadding.bottom + (_context.childCrossAxis! + crossAxisSpacing) * c - crossAxisSpacing,
  253 + box!.width - resolvedPadding.horizontal,
274 math.max(crossAxisSpacing, 1)) 254 math.max(crossAxisSpacing, 1))
275 ..fillPath(); 255 ..fillPath();
276 break; 256 break;
@@ -282,25 +262,16 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -282,25 +262,16 @@ class GridView extends MultiChildWidget with SpanningWidget {
282 case Axis.vertical: 262 case Axis.vertical:
283 context.canvas 263 context.canvas
284 ..drawRect( 264 ..drawRect(
285 - box!.left + padding.left,  
286 - box!.bottom +  
287 - padding.bottom +  
288 - (_context.childMainAxis! + mainAxisSpacing) * c -  
289 - mainAxisSpacing,  
290 - box!.width - padding.horizontal, 265 + box!.left + resolvedPadding.left,
  266 + box!.bottom + resolvedPadding.bottom + (_context.childMainAxis! + mainAxisSpacing) * c - mainAxisSpacing,
  267 + box!.width - resolvedPadding.horizontal,
291 math.max(mainAxisSpacing, 1)) 268 math.max(mainAxisSpacing, 1))
292 ..fillPath(); 269 ..fillPath();
293 break; 270 break;
294 case Axis.horizontal: 271 case Axis.horizontal:
295 context.canvas 272 context.canvas
296 - ..drawRect(  
297 - box!.left +  
298 - padding.left +  
299 - (_context.childMainAxis! + mainAxisSpacing) * c -  
300 - mainAxisSpacing,  
301 - box!.bottom + padding.bottom,  
302 - math.max(mainAxisSpacing, 1),  
303 - box!.height - padding.vertical) 273 + ..drawRect(box!.left + resolvedPadding.left + (_context.childMainAxis! + mainAxisSpacing) * c - mainAxisSpacing,
  274 + box!.bottom + resolvedPadding.bottom, math.max(mainAxisSpacing, 1), box!.height - resolvedPadding.vertical)
304 ..fillPath(); 275 ..fillPath();
305 break; 276 break;
306 } 277 }
@@ -317,8 +288,7 @@ class GridView extends MultiChildWidget with SpanningWidget { @@ -317,8 +288,7 @@ class GridView extends MultiChildWidget with SpanningWidget {
317 ..saveContext() 288 ..saveContext()
318 ..setTransform(mat); 289 ..setTransform(mat);
319 290
320 - for (var child  
321 - in children.sublist(_context.firstChild, _context.lastChild)) { 291 + for (var child in children.sublist(_context.firstChild, _context.lastChild)) {
322 child.paint(context); 292 child.paint(context);
323 } 293 }
324 context.canvas.restoreContext(); 294 context.canvas.restoreContext();
@@ -38,7 +38,7 @@ mixin TableHelper { @@ -38,7 +38,7 @@ mixin TableHelper {
38 static Table fromTextArray({ 38 static Table fromTextArray({
39 Context? context, 39 Context? context,
40 required List<List<dynamic>> data, 40 required List<List<dynamic>> data,
41 - EdgeInsets cellPadding = const EdgeInsets.all(5), 41 + EdgeInsetsGeometry cellPadding = const EdgeInsets.all(5),
42 double cellHeight = 0, 42 double cellHeight = 0,
43 Alignment cellAlignment = Alignment.topLeft, 43 Alignment cellAlignment = Alignment.topLeft,
44 Map<int, Alignment>? cellAlignments, 44 Map<int, Alignment>? cellAlignments,
@@ -48,7 +48,7 @@ mixin TableHelper { @@ -48,7 +48,7 @@ mixin TableHelper {
48 OnCellDecoration? cellDecoration, 48 OnCellDecoration? cellDecoration,
49 int headerCount = 1, 49 int headerCount = 1,
50 List<dynamic>? headers, 50 List<dynamic>? headers,
51 - EdgeInsets? headerPadding, 51 + EdgeInsetsGeometry? headerPadding,
52 double? headerHeight, 52 double? headerHeight,
53 Alignment headerAlignment = Alignment.center, 53 Alignment headerAlignment = Alignment.center,
54 Map<int, Alignment>? headerAlignments, 54 Map<int, Alignment>? headerAlignments,
@@ -40,7 +40,6 @@ final _yellowBox = Container( @@ -40,7 +40,6 @@ final _yellowBox = Container(
40 color: PdfColors.yellow, 40 color: PdfColors.yellow,
41 ); 41 );
42 42
43 -  
44 void main() { 43 void main() {
45 setUpAll(() { 44 setUpAll(() {
46 Document.debug = true; 45 Document.debug = true;
@@ -227,10 +226,7 @@ void main() { @@ -227,10 +226,7 @@ void main() {
227 pageFormat: const PdfPageFormat(150, 150), 226 pageFormat: const PdfPageFormat(150, 150),
228 build: (Context context) { 227 build: (Context context) {
229 return [ 228 return [
230 - ListView(children: [  
231 - for(int i = 0; i < 30; i++)  
232 - Text('Hello World')  
233 - ]), 229 + ListView(children: [for (int i = 0; i < 30; i++) Text('Hello World')]),
234 ]; 230 ];
235 }, 231 },
236 ), 232 ),
@@ -244,10 +240,7 @@ void main() { @@ -244,10 +240,7 @@ void main() {
244 pageFormat: const PdfPageFormat(150, 150), 240 pageFormat: const PdfPageFormat(150, 150),
245 build: (Context context) { 241 build: (Context context) {
246 return [ 242 return [
247 - ListView(children: [  
248 - for(int i = 0; i < 30; i++)  
249 - Text('Hello World')  
250 - ]), 243 + ListView(children: [for (int i = 0; i < 30; i++) Text('Hello World')]),
251 ]; 244 ];
252 }, 245 },
253 ), 246 ),
@@ -291,7 +284,7 @@ void main() { @@ -291,7 +284,7 @@ void main() {
291 pageFormat: const PdfPageFormat(150, 150), 284 pageFormat: const PdfPageFormat(150, 150),
292 build: (Context context) { 285 build: (Context context) {
293 return Align( 286 return Align(
294 - alignment: AlignmentDirectional.centerStart, 287 + alignment: AlignmentDirectional.centerStart,
295 child: _blueBox, 288 child: _blueBox,
296 ); 289 );
297 }, 290 },
@@ -398,6 +391,93 @@ void main() { @@ -398,6 +391,93 @@ void main() {
398 ); 391 );
399 }); 392 });
400 393
  394 + test('Should render Grid with run alignment right', () {
  395 + pdf.addPage(
  396 + Page(
  397 + textDirection: TextDirection.rtl,
  398 + pageFormat: const PdfPageFormat(150, 150),
  399 + build: (Context context) {
  400 + return GridView(
  401 + crossAxisCount: 3,
  402 + childAspectRatio: 1,
  403 + direction: Axis.vertical,
  404 + children: [
  405 + for (int i = 0; i < 8; i++)
  406 + Container(
  407 + color: [PdfColors.blue, PdfColors.red, PdfColors.yellow][i % 3],
  408 + ),
  409 + ],
  410 + );
  411 + },
  412 + ),
  413 + );
  414 + });
  415 +
  416 + test('Should render Grid with run alignment left', () {
  417 + pdf.addPage(
  418 + Page(
  419 + textDirection: TextDirection.ltr,
  420 + pageFormat: const PdfPageFormat(150, 150),
  421 + build: (Context context) {
  422 + return GridView(
  423 + crossAxisCount: 3,
  424 + childAspectRatio: 1,
  425 + direction: Axis.vertical,
  426 + children: [
  427 + for (int i = 0; i < 7; i++)
  428 + Container(
  429 + color: [PdfColors.blue, PdfColors.red, PdfColors.yellow][i % 3],
  430 + ),
  431 + ],
  432 + );
  433 + },
  434 + ),
  435 + );
  436 + });
  437 + test('Should render Grid (horizontal) with run alignment right', () {
  438 + pdf.addPage(
  439 + Page(
  440 + textDirection: TextDirection.rtl,
  441 + pageFormat: const PdfPageFormat(150, 150),
  442 + build: (Context context) {
  443 + return GridView(
  444 + crossAxisCount: 3,
  445 + childAspectRatio: 1,
  446 + direction: Axis.horizontal,
  447 + children: [
  448 + for (int i = 0; i < 7; i++)
  449 + Container(
  450 + color: [PdfColors.blue, PdfColors.red, PdfColors.yellow][i % 3],
  451 + ),
  452 + ],
  453 + );
  454 + },
  455 + ),
  456 + );
  457 + });
  458 +
  459 + test('Should render Grid (horizontal) with run alignment left', () {
  460 + pdf.addPage(
  461 + Page(
  462 + textDirection: TextDirection.ltr,
  463 + pageFormat: const PdfPageFormat(150, 150),
  464 + build: (Context context) {
  465 + return GridView(
  466 + crossAxisCount: 3,
  467 + childAspectRatio: 1,
  468 + direction: Axis.horizontal,
  469 + children: [
  470 + for (int i = 0; i < 7; i++)
  471 + Container(
  472 + color: [PdfColors.blue, PdfColors.red, PdfColors.yellow][i % 3],
  473 + ),
  474 + ],
  475 + );
  476 + },
  477 + ),
  478 + );
  479 + });
  480 +
401 tearDownAll(() async { 481 tearDownAll(() async {
402 final file = File('rtl-layout.pdf'); 482 final file = File('rtl-layout.pdf');
403 await file.writeAsBytes(await pdf.save()); 483 await file.writeAsBytes(await pdf.save());