Showing
5 changed files
with
88 additions
and
10 deletions
| @@ -666,3 +666,74 @@ class Builder extends StatelessWidget { | @@ -666,3 +666,74 @@ class Builder extends StatelessWidget { | ||
| 666 | @override | 666 | @override |
| 667 | Widget build(Context context) => builder(context); | 667 | Widget build(Context context) => builder(context); |
| 668 | } | 668 | } |
| 669 | + | ||
| 670 | +class FullPage extends SingleChildWidget { | ||
| 671 | + FullPage({ | ||
| 672 | + @required this.ignoreMargins, | ||
| 673 | + Widget child, | ||
| 674 | + }) : assert(ignoreMargins != null), | ||
| 675 | + super(child: child); | ||
| 676 | + | ||
| 677 | + final bool ignoreMargins; | ||
| 678 | + | ||
| 679 | + BoxConstraints _getConstraints(Context context) { | ||
| 680 | + return ignoreMargins | ||
| 681 | + ? BoxConstraints.tightFor( | ||
| 682 | + width: context.page.pageFormat.width, | ||
| 683 | + height: context.page.pageFormat.height, | ||
| 684 | + ) | ||
| 685 | + : BoxConstraints.tightFor( | ||
| 686 | + width: context.page.pageFormat.availableWidth, | ||
| 687 | + height: context.page.pageFormat.availableHeight, | ||
| 688 | + ); | ||
| 689 | + } | ||
| 690 | + | ||
| 691 | + PdfRect _getBox(Context context) { | ||
| 692 | + final PdfRect box = _getConstraints(context).constrainRect(); | ||
| 693 | + if (ignoreMargins) { | ||
| 694 | + return box; | ||
| 695 | + } | ||
| 696 | + | ||
| 697 | + return PdfRect.fromPoints( | ||
| 698 | + PdfPoint( | ||
| 699 | + context.page.pageFormat.marginLeft, | ||
| 700 | + context.page.pageFormat.marginTop, | ||
| 701 | + ), | ||
| 702 | + box.size); | ||
| 703 | + } | ||
| 704 | + | ||
| 705 | + @override | ||
| 706 | + void layout(Context context, BoxConstraints constraints, | ||
| 707 | + {bool parentUsesSize = false}) { | ||
| 708 | + final BoxConstraints constraints = _getConstraints(context); | ||
| 709 | + | ||
| 710 | + if (child != null) { | ||
| 711 | + child.layout(context, constraints, parentUsesSize: false); | ||
| 712 | + assert(child.box != null); | ||
| 713 | + } | ||
| 714 | + | ||
| 715 | + box = _getBox(context); | ||
| 716 | + print('layout box: $box'); | ||
| 717 | + } | ||
| 718 | + | ||
| 719 | + @override | ||
| 720 | + void debugPaint(Context context) {} | ||
| 721 | + | ||
| 722 | + @override | ||
| 723 | + void paint(Context context) { | ||
| 724 | + super.paint(context); | ||
| 725 | + | ||
| 726 | + if (child == null) { | ||
| 727 | + return; | ||
| 728 | + } | ||
| 729 | + | ||
| 730 | + final PdfRect box = _getBox(context); | ||
| 731 | + final Matrix4 mat = Matrix4.tryInvert(context.canvas.getTransform()); | ||
| 732 | + mat.translate(box.x, box.y); | ||
| 733 | + context.canvas | ||
| 734 | + ..saveContext() | ||
| 735 | + ..setTransform(mat); | ||
| 736 | + child.paint(context); | ||
| 737 | + context.canvas.restoreContext(); | ||
| 738 | + } | ||
| 739 | +} |
| @@ -104,6 +104,14 @@ class Page { | @@ -104,6 +104,14 @@ class Page { | ||
| 104 | page: _pdfPage, | 104 | page: _pdfPage, |
| 105 | canvas: canvas, | 105 | canvas: canvas, |
| 106 | ).inheritFrom(calculatedTheme); | 106 | ).inheritFrom(calculatedTheme); |
| 107 | + | ||
| 108 | + assert(() { | ||
| 109 | + if (Document.debug) { | ||
| 110 | + debugPaint(context); | ||
| 111 | + } | ||
| 112 | + return true; | ||
| 113 | + }()); | ||
| 114 | + | ||
| 107 | if (pageTheme.buildBackground != null) { | 115 | if (pageTheme.buildBackground != null) { |
| 108 | final Widget child = pageTheme.buildBackground(context); | 116 | final Widget child = pageTheme.buildBackground(context); |
| 109 | if (child != null) { | 117 | if (child != null) { |
| @@ -111,6 +119,7 @@ class Page { | @@ -111,6 +119,7 @@ class Page { | ||
| 111 | paint(child, context); | 119 | paint(child, context); |
| 112 | } | 120 | } |
| 113 | } | 121 | } |
| 122 | + | ||
| 114 | if (_build != null) { | 123 | if (_build != null) { |
| 115 | final Widget child = _build(context); | 124 | final Widget child = _build(context); |
| 116 | if (child != null) { | 125 | if (child != null) { |
| @@ -118,6 +127,7 @@ class Page { | @@ -118,6 +127,7 @@ class Page { | ||
| 118 | paint(child, context); | 127 | paint(child, context); |
| 119 | } | 128 | } |
| 120 | } | 129 | } |
| 130 | + | ||
| 121 | if (pageTheme.buildForeground != null) { | 131 | if (pageTheme.buildForeground != null) { |
| 122 | final Widget child = pageTheme.buildForeground(context); | 132 | final Widget child = pageTheme.buildForeground(context); |
| 123 | if (child != null) { | 133 | if (child != null) { |
| @@ -144,13 +154,6 @@ class Page { | @@ -144,13 +154,6 @@ class Page { | ||
| 144 | 154 | ||
| 145 | @protected | 155 | @protected |
| 146 | void paint(Widget child, Context context) { | 156 | void paint(Widget child, Context context) { |
| 147 | - assert(() { | ||
| 148 | - if (Document.debug) { | ||
| 149 | - debugPaint(context); | ||
| 150 | - } | ||
| 151 | - return true; | ||
| 152 | - }()); | ||
| 153 | - | ||
| 154 | if (child == null) { | 157 | if (child == null) { |
| 155 | return; | 158 | return; |
| 156 | } | 159 | } |
| @@ -25,7 +25,10 @@ void main() { | @@ -25,7 +25,10 @@ void main() { | ||
| 25 | final Document pdf = Document(); | 25 | final Document pdf = Document(); |
| 26 | 26 | ||
| 27 | final PageTheme pageTheme = PageTheme( | 27 | final PageTheme pageTheme = PageTheme( |
| 28 | - buildBackground: (Context context) => Watermark.text('DRAFT'), | 28 | + buildBackground: (Context context) => FullPage( |
| 29 | + ignoreMargins: true, | ||
| 30 | + child: Watermark.text('DRAFT'), | ||
| 31 | + ), | ||
| 29 | buildForeground: (Context context) => Align( | 32 | buildForeground: (Context context) => Align( |
| 30 | alignment: Alignment.bottomLeft, | 33 | alignment: Alignment.bottomLeft, |
| 31 | child: SizedBox( | 34 | child: SizedBox( |
No preview for this file type
-
Please register or login to post a comment