Showing
5 changed files
with
75 additions
and
5 deletions
1 | # Changelog | 1 | # Changelog |
2 | 2 | ||
3 | -## 1.10.2 | 3 | +## 1.11.0 |
4 | 4 | ||
5 | - Fix mixing Arabic with English [Anas Altair] | 5 | - Fix mixing Arabic with English [Anas Altair] |
6 | - Support Dagger alif in Arabic [Anas Altair] | 6 | - Support Dagger alif in Arabic [Anas Altair] |
7 | - Support ARABIC TATWEEL [Anas Altair] | 7 | - Support ARABIC TATWEEL [Anas Altair] |
8 | - Update Arabic tests [Anas Altair] | 8 | - Update Arabic tests [Anas Altair] |
9 | +- Add Directionality Widget | ||
9 | 10 | ||
10 | ## 1.10.1 | 11 | ## 1.10.1 |
11 | 12 |
@@ -445,14 +445,13 @@ class RichText extends Widget { | @@ -445,14 +445,13 @@ class RichText extends Widget { | ||
445 | RichText( | 445 | RichText( |
446 | {@required this.text, | 446 | {@required this.text, |
447 | TextAlign textAlign, | 447 | TextAlign textAlign, |
448 | - TextDirection textDirection, | 448 | + this.textDirection, |
449 | bool softWrap, | 449 | bool softWrap, |
450 | this.tightBounds = false, | 450 | this.tightBounds = false, |
451 | this.textScaleFactor = 1.0, | 451 | this.textScaleFactor = 1.0, |
452 | int maxLines}) | 452 | int maxLines}) |
453 | : assert(text != null), | 453 | : assert(text != null), |
454 | _textAlign = textAlign, | 454 | _textAlign = textAlign, |
455 | - textDirection = textDirection ?? TextDirection.ltr, | ||
456 | _softWrap = softWrap, | 455 | _softWrap = softWrap, |
457 | _maxLines = maxLines; | 456 | _maxLines = maxLines; |
458 | 457 | ||
@@ -486,6 +485,7 @@ class RichText extends Widget { | @@ -486,6 +485,7 @@ class RichText extends Widget { | ||
486 | double wordsWidth, | 485 | double wordsWidth, |
487 | bool last, | 486 | bool last, |
488 | double baseline, | 487 | double baseline, |
488 | + TextDirection textDirection, | ||
489 | ) { | 489 | ) { |
490 | double delta = 0; | 490 | double delta = 0; |
491 | switch (textAlign) { | 491 | switch (textAlign) { |
@@ -553,6 +553,8 @@ class RichText extends Widget { | @@ -553,6 +553,8 @@ class RichText extends Widget { | ||
553 | _softWrap ??= theme.softWrap; | 553 | _softWrap ??= theme.softWrap; |
554 | _maxLines ??= theme.maxLines; | 554 | _maxLines ??= theme.maxLines; |
555 | _textAlign ??= theme.textAlign; | 555 | _textAlign ??= theme.textAlign; |
556 | + final TextDirection _textDirection = | ||
557 | + textDirection ?? Directionality.of(context); | ||
556 | 558 | ||
557 | final double constraintWidth = constraints.hasBoundedWidth | 559 | final double constraintWidth = constraints.hasBoundedWidth |
558 | ? constraints.maxWidth | 560 | ? constraints.maxWidth |
@@ -583,7 +585,7 @@ class RichText extends Widget { | @@ -583,7 +585,7 @@ class RichText extends Widget { | ||
583 | final PdfFontMetrics space = | 585 | final PdfFontMetrics space = |
584 | font.stringMetrics(' ') * (style.fontSize * textScaleFactor); | 586 | font.stringMetrics(' ') * (style.fontSize * textScaleFactor); |
585 | 587 | ||
586 | - final List<String> spanLines = (textDirection == TextDirection.rtl | 588 | + final List<String> spanLines = (_textDirection == TextDirection.rtl |
587 | ? PdfArabic.convert(span.text) | 589 | ? PdfArabic.convert(span.text) |
588 | : span.text) | 590 | : span.text) |
589 | .split('\n'); | 591 | .split('\n'); |
@@ -613,6 +615,7 @@ class RichText extends Widget { | @@ -613,6 +615,7 @@ class RichText extends Widget { | ||
613 | style.letterSpacing, | 615 | style.letterSpacing, |
614 | false, | 616 | false, |
615 | bottom, | 617 | bottom, |
618 | + _textDirection, | ||
616 | )); | 619 | )); |
617 | 620 | ||
618 | spanStart += spanCount; | 621 | spanStart += spanCount; |
@@ -676,6 +679,7 @@ class RichText extends Widget { | @@ -676,6 +679,7 @@ class RichText extends Widget { | ||
676 | style.letterSpacing, | 679 | style.letterSpacing, |
677 | true, | 680 | true, |
678 | bottom, | 681 | bottom, |
682 | + _textDirection, | ||
679 | )); | 683 | )); |
680 | 684 | ||
681 | spanStart += spanCount; | 685 | spanStart += spanCount; |
@@ -725,6 +729,7 @@ class RichText extends Widget { | @@ -725,6 +729,7 @@ class RichText extends Widget { | ||
725 | offsetX, | 729 | offsetX, |
726 | false, | 730 | false, |
727 | bottom, | 731 | bottom, |
732 | + _textDirection, | ||
728 | )); | 733 | )); |
729 | 734 | ||
730 | spanStart += spanCount; | 735 | spanStart += spanCount; |
@@ -782,6 +787,7 @@ class RichText extends Widget { | @@ -782,6 +787,7 @@ class RichText extends Widget { | ||
782 | offsetX, | 787 | offsetX, |
783 | true, | 788 | true, |
784 | bottom, | 789 | bottom, |
790 | + _textDirection, | ||
785 | )); | 791 | )); |
786 | 792 | ||
787 | bottom ??= 0.0; | 793 | bottom ??= 0.0; |
@@ -380,3 +380,45 @@ class TextStyle { | @@ -380,3 +380,45 @@ class TextStyle { | ||
380 | String toString() => | 380 | String toString() => |
381 | 'TextStyle(color:$color font:$font size:$fontSize weight:$fontWeight style:$fontStyle letterSpacing:$letterSpacing wordSpacing:$wordSpacing lineSpacing:$lineSpacing height:$height background:$background decoration:$decoration decorationColor:$decorationColor decorationStyle:$decorationStyle decorationThickness:$decorationThickness, renderingMode:$renderingMode)'; | 381 | 'TextStyle(color:$color font:$font size:$fontSize weight:$fontWeight style:$fontStyle letterSpacing:$letterSpacing wordSpacing:$wordSpacing lineSpacing:$lineSpacing height:$height background:$background decoration:$decoration decorationColor:$decorationColor decorationStyle:$decorationStyle decorationThickness:$decorationThickness, renderingMode:$renderingMode)'; |
382 | } | 382 | } |
383 | + | ||
384 | +class Directionality extends StatelessWidget implements Inherited { | ||
385 | + /// Creates a widget that determines the directionality of text and | ||
386 | + /// text-direction-sensitive render objects. | ||
387 | + /// | ||
388 | + /// The [textDirection] and [child] arguments must not be null. | ||
389 | + Directionality({ | ||
390 | + @required this.textDirection, | ||
391 | + @required this.child, | ||
392 | + }) : assert(textDirection != null), | ||
393 | + assert(child != null); | ||
394 | + | ||
395 | + /// The subtree | ||
396 | + final Widget child; | ||
397 | + | ||
398 | + /// The text direction for this subtree. | ||
399 | + final TextDirection textDirection; | ||
400 | + | ||
401 | + /// The text direction from the closest instance of this class that encloses | ||
402 | + /// the given context. | ||
403 | + /// | ||
404 | + /// If there is no [Directionality] ancestor widget in the tree at the given | ||
405 | + /// context, then this will return TextDirection.ltr. | ||
406 | + /// | ||
407 | + /// Typical usage is as follows: | ||
408 | + /// | ||
409 | + /// ```dart | ||
410 | + /// TextDirection textDirection = Directionality.of(context); | ||
411 | + /// ``` | ||
412 | + static TextDirection of(Context context) { | ||
413 | + final Directionality widget = context.inherited[Directionality]; | ||
414 | + return widget?.textDirection ?? TextDirection.ltr; | ||
415 | + } | ||
416 | + | ||
417 | + @override | ||
418 | + Widget build(Context context) { | ||
419 | + return InheritedWidget( | ||
420 | + build: (context) => child, | ||
421 | + inherited: this, | ||
422 | + ); | ||
423 | + } | ||
424 | +} |
@@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | @@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl | ||
4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf | 4 | homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf |
5 | repository: https://github.com/DavBfr/dart_pdf | 5 | repository: https://github.com/DavBfr/dart_pdf |
6 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues | 6 | issue_tracker: https://github.com/DavBfr/dart_pdf/issues |
7 | -version: 1.10.2 | 7 | +version: 1.11.0 |
8 | 8 | ||
9 | environment: | 9 | environment: |
10 | sdk: ">=2.3.0 <3.0.0" | 10 | sdk: ">=2.3.0 <3.0.0" |
@@ -24,6 +24,8 @@ import 'package:test/test.dart'; | @@ -24,6 +24,8 @@ import 'package:test/test.dart'; | ||
24 | import 'package:pdf/pdf.dart'; | 24 | import 'package:pdf/pdf.dart'; |
25 | import 'package:pdf/widgets.dart'; | 25 | import 'package:pdf/widgets.dart'; |
26 | 26 | ||
27 | +import 'utils.dart'; | ||
28 | + | ||
27 | Document pdf; | 29 | Document pdf; |
28 | 30 | ||
29 | List<TableRow> buildTable( | 31 | List<TableRow> buildTable( |
@@ -232,6 +234,25 @@ void main() { | @@ -232,6 +234,25 @@ void main() { | ||
232 | )); | 234 | )); |
233 | }); | 235 | }); |
234 | 236 | ||
237 | + test('Table fromTextArray with directionality', () { | ||
238 | + pdf.addPage(Page( | ||
239 | + theme: ThemeData.withFont( | ||
240 | + base: loadFont('hacen-tunisia.ttf'), | ||
241 | + ), | ||
242 | + build: (Context context) => Directionality( | ||
243 | + textDirection: TextDirection.rtl, | ||
244 | + child: Table.fromTextArray( | ||
245 | + headers: <dynamic>['ثلاثة', 'اثنان', 'واحد'], | ||
246 | + cellAlignment: Alignment.centerRight, | ||
247 | + data: <List<dynamic>>[ | ||
248 | + <dynamic>['الكلب', 'قط', 'ذئب'], | ||
249 | + <dynamic>['فأر', 'بقرة', 'طائر'], | ||
250 | + ], | ||
251 | + ), | ||
252 | + ), | ||
253 | + )); | ||
254 | + }); | ||
255 | + | ||
235 | tearDownAll(() { | 256 | tearDownAll(() { |
236 | final File file = File('widgets-table.pdf'); | 257 | final File file = File('widgets-table.pdf'); |
237 | file.writeAsBytesSync(pdf.save()); | 258 | file.writeAsBytesSync(pdf.save()); |
-
Please register or login to post a comment