David PHAM-VAN

Add Page orientation on PdfPreview

@@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
3 ## 5.0.0-nullsafety.2 3 ## 5.0.0-nullsafety.2
4 4
5 - Add imageFromAssetBundle and networkImage 5 - Add imageFromAssetBundle and networkImage
  6 +- Add Page orientation on PdfPreview
6 7
7 ## 5.0.0-nullsafety.1 8 ## 5.0.0-nullsafety.1
8 9
@@ -22,6 +22,7 @@ class PdfPreview extends StatefulWidget { @@ -22,6 +22,7 @@ class PdfPreview extends StatefulWidget {
22 this.allowSharing = true, 22 this.allowSharing = true,
23 this.maxPageWidth, 23 this.maxPageWidth,
24 this.canChangePageFormat = true, 24 this.canChangePageFormat = true,
  25 + this.canChangeOrientation = true,
25 this.actions, 26 this.actions,
26 this.pageFormats, 27 this.pageFormats,
27 this.onError, 28 this.onError,
@@ -55,6 +56,9 @@ class PdfPreview extends StatefulWidget { @@ -55,6 +56,9 @@ class PdfPreview extends StatefulWidget {
55 /// Add a drop-down menu to choose the page format 56 /// Add a drop-down menu to choose the page format
56 final bool canChangePageFormat; 57 final bool canChangePageFormat;
57 58
  59 + /// Add a switch to change the page orientation
  60 + final bool canChangeOrientation;
  61 +
58 /// Additionnal actions to add to the widget 62 /// Additionnal actions to add to the widget
59 final List<PdfPreviewAction>? actions; 63 final List<PdfPreviewAction>? actions;
60 64
@@ -92,7 +96,9 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -92,7 +96,9 @@ class _PdfPreviewState extends State<PdfPreview> {
92 96
93 final List<_PdfPreviewPage> pages = <_PdfPreviewPage>[]; 97 final List<_PdfPreviewPage> pages = <_PdfPreviewPage>[];
94 98
95 - PdfPageFormat? pageFormat; 99 + late PdfPageFormat pageFormat;
  100 +
  101 + bool? horizontal;
96 102
97 PrintingInfo info = PrintingInfo.unavailable; 103 PrintingInfo info = PrintingInfo.unavailable;
98 bool infoLoaded = false; 104 bool infoLoaded = false;
@@ -116,6 +122,10 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -116,6 +122,10 @@ class _PdfPreviewState extends State<PdfPreview> {
116 'Letter': PdfPageFormat.letter, 122 'Letter': PdfPageFormat.letter,
117 }; 123 };
118 124
  125 + PdfPageFormat get computedPageFormat => horizontal != null
  126 + ? (horizontal! ? pageFormat.landscape : pageFormat.portrait)
  127 + : pageFormat;
  128 +
119 Future<void> _raster() async { 129 Future<void> _raster() async {
120 Uint8List _doc; 130 Uint8List _doc;
121 131
@@ -124,7 +134,7 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -124,7 +134,7 @@ class _PdfPreviewState extends State<PdfPreview> {
124 } 134 }
125 135
126 try { 136 try {
127 - _doc = await widget.build(pageFormat!); 137 + _doc = await widget.build(computedPageFormat);
128 } catch (e) { 138 } catch (e) {
129 error = e; 139 error = e;
130 return; 140 return;
@@ -178,7 +188,7 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -178,7 +188,7 @@ class _PdfPreviewState extends State<PdfPreview> {
178 pageFormat = PdfPageFormat.a4; 188 pageFormat = PdfPageFormat.a4;
179 } 189 }
180 } else { 190 } else {
181 - pageFormat = widget.initialPageFormat; 191 + pageFormat = widget.initialPageFormat!;
182 } 192 }
183 193
184 final _pageFormats = widget.pageFormats ?? defaultPageFormats; 194 final _pageFormats = widget.pageFormats ?? defaultPageFormats;
@@ -223,7 +233,7 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -223,7 +233,7 @@ class _PdfPreviewState extends State<PdfPreview> {
223 final mq = MediaQuery.of(context); 233 final mq = MediaQuery.of(context);
224 dpi = (min(mq.size.width - 16, widget.maxPageWidth ?? double.infinity)) * 234 dpi = (min(mq.size.width - 16, widget.maxPageWidth ?? double.infinity)) *
225 mq.devicePixelRatio / 235 mq.devicePixelRatio /
226 - pageFormat!.width * 236 + computedPageFormat.width *
227 72; 237 72;
228 238
229 _raster(); 239 _raster();
@@ -384,13 +394,42 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -384,13 +394,42 @@ class _PdfPreviewState extends State<PdfPreview> {
384 ), 394 ),
385 onChanged: (PdfPageFormat? _pageFormat) { 395 onChanged: (PdfPageFormat? _pageFormat) {
386 setState(() { 396 setState(() {
  397 + if (_pageFormat != null) {
387 pageFormat = _pageFormat; 398 pageFormat = _pageFormat;
388 _raster(); 399 _raster();
  400 + }
  401 + });
  402 + },
  403 + ),
  404 + );
  405 +
  406 + if (widget.canChangeOrientation) {
  407 + horizontal ??= pageFormat.width > pageFormat.height;
  408 + final color = theme.accentIconTheme.color!;
  409 + final disabledColor = color.withAlpha(120);
  410 + actions.add(
  411 + ToggleButtons(
  412 + renderBorder: false,
  413 + borderColor: disabledColor,
  414 + color: disabledColor,
  415 + selectedBorderColor: color,
  416 + selectedColor: color,
  417 + children: <Widget>[
  418 + Transform.rotate(
  419 + angle: -pi / 2, child: const Icon(Icons.note_outlined)),
  420 + const Icon(Icons.note_outlined),
  421 + ],
  422 + onPressed: (int index) {
  423 + setState(() {
  424 + horizontal = index == 1;
  425 + _raster();
389 }); 426 });
390 }, 427 },
  428 + isSelected: <bool>[horizontal == false, horizontal == true],
391 ), 429 ),
392 ); 430 );
393 } 431 }
  432 + }
394 433
395 if (widget.actions != null) { 434 if (widget.actions != null) {
396 for (final action in widget.actions!) { 435 for (final action in widget.actions!) {
@@ -403,7 +442,7 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -403,7 +442,7 @@ class _PdfPreviewState extends State<PdfPreview> {
403 : () => action.onPressed!( 442 : () => action.onPressed!(
404 context, 443 context,
405 widget.build, 444 widget.build,
406 - pageFormat!, 445 + computedPageFormat,
407 ), 446 ),
408 ), 447 ),
409 ); 448 );
@@ -439,19 +478,22 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -439,19 +478,22 @@ class _PdfPreviewState extends State<PdfPreview> {
439 Material( 478 Material(
440 elevation: 4, 479 elevation: 4,
441 color: theme.primaryColor, 480 color: theme.primaryColor,
  481 + child: SizedBox(
  482 + width: double.infinity,
442 child: SafeArea( 483 child: SafeArea(
443 - child: Row(  
444 - mainAxisAlignment: MainAxisAlignment.spaceAround, 484 + child: Wrap(
  485 + alignment: WrapAlignment.spaceAround,
445 children: actions, 486 children: actions,
446 ), 487 ),
447 ), 488 ),
  489 + ),
448 ) 490 )
449 ], 491 ],
450 ); 492 );
451 } 493 }
452 494
453 Future<void> _print() async { 495 Future<void> _print() async {
454 - var format = pageFormat; 496 + var format = computedPageFormat;
455 497
456 if (!widget.canChangePageFormat && pages.isNotEmpty) { 498 if (!widget.canChangePageFormat && pages.isNotEmpty) {
457 format = PdfPageFormat( 499 format = PdfPageFormat(
@@ -461,15 +503,21 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -461,15 +503,21 @@ class _PdfPreviewState extends State<PdfPreview> {
461 ); 503 );
462 } 504 }
463 505
  506 + try {
464 final result = await Printing.layoutPdf( 507 final result = await Printing.layoutPdf(
465 onLayout: widget.build, 508 onLayout: widget.build,
466 name: widget.pdfFileName ?? 'Document', 509 name: widget.pdfFileName ?? 'Document',
467 - format: format!, 510 + format: format,
468 ); 511 );
469 512
470 if (result && widget.onPrinted != null) { 513 if (result && widget.onPrinted != null) {
471 widget.onPrinted!(context); 514 widget.onPrinted!(context);
472 } 515 }
  516 + } catch (e) {
  517 + if (widget.onError != null) {
  518 + widget.onError!(context);
  519 + }
  520 + }
473 } 521 }
474 522
475 Future<void> _share() async { 523 Future<void> _share() async {
@@ -483,7 +531,7 @@ class _PdfPreviewState extends State<PdfPreview> { @@ -483,7 +531,7 @@ class _PdfPreviewState extends State<PdfPreview> {
483 referenceBox.localToGlobal(referenceBox.paintBounds.bottomRight); 531 referenceBox.localToGlobal(referenceBox.paintBounds.bottomRight);
484 final bounds = Rect.fromPoints(topLeft, bottomRight); 532 final bounds = Rect.fromPoints(topLeft, bottomRight);
485 533
486 - final bytes = await widget.build(pageFormat!); 534 + final bytes = await widget.build(computedPageFormat);
487 final result = await Printing.sharePdf( 535 final result = await Printing.sharePdf(
488 bytes: bytes, 536 bytes: bytes,
489 bounds: bounds, 537 bounds: bounds,