Showing
9 changed files
with
165 additions
and
38 deletions
@@ -87,7 +87,7 @@ class MultiPage extends Page { | @@ -87,7 +87,7 @@ class MultiPage extends Page { | ||
87 | this.crossAxisAlignment = CrossAxisAlignment.start, | 87 | this.crossAxisAlignment = CrossAxisAlignment.start, |
88 | this.header, | 88 | this.header, |
89 | this.footer, | 89 | this.footer, |
90 | - Theme theme, | 90 | + ThemeData theme, |
91 | this.maxPages = 20, | 91 | this.maxPages = 20, |
92 | PageOrientation orientation, | 92 | PageOrientation orientation, |
93 | EdgeInsets margin}) | 93 | EdgeInsets margin}) |
@@ -159,7 +159,8 @@ class MultiPage extends Page { | @@ -159,7 +159,8 @@ class MultiPage extends Page { | ||
159 | : BoxConstraints( | 159 | : BoxConstraints( |
160 | maxWidth: pageFormat.width - _margin.horizontal, | 160 | maxWidth: pageFormat.width - _margin.horizontal, |
161 | maxHeight: pageFormat.height - _margin.vertical); | 161 | maxHeight: pageFormat.height - _margin.vertical); |
162 | - final Theme calculatedTheme = theme ?? document.theme ?? Theme.base(); | 162 | + final ThemeData calculatedTheme = |
163 | + theme ?? document.theme ?? ThemeData.base(); | ||
163 | Context context; | 164 | Context context; |
164 | double offsetEnd; | 165 | double offsetEnd; |
165 | double offsetStart; | 166 | double offsetStart; |
@@ -28,7 +28,7 @@ class Page { | @@ -28,7 +28,7 @@ class Page { | ||
28 | {PageTheme pageTheme, | 28 | {PageTheme pageTheme, |
29 | PdfPageFormat pageFormat, | 29 | PdfPageFormat pageFormat, |
30 | BuildCallback build, | 30 | BuildCallback build, |
31 | - Theme theme, | 31 | + ThemeData theme, |
32 | PageOrientation orientation, | 32 | PageOrientation orientation, |
33 | EdgeInsets margin, | 33 | EdgeInsets margin, |
34 | bool clip = false}) | 34 | bool clip = false}) |
@@ -58,7 +58,7 @@ class Page { | @@ -58,7 +58,7 @@ class Page { | ||
58 | 58 | ||
59 | final BuildCallback _build; | 59 | final BuildCallback _build; |
60 | 60 | ||
61 | - Theme get theme => pageTheme.theme; | 61 | + ThemeData get theme => pageTheme.theme; |
62 | 62 | ||
63 | bool get mustRotate => pageTheme.mustRotate; | 63 | bool get mustRotate => pageTheme.mustRotate; |
64 | 64 | ||
@@ -100,7 +100,8 @@ class Page { | @@ -100,7 +100,8 @@ class Page { | ||
100 | maxWidth: pageFormat.width - _margin.horizontal, | 100 | maxWidth: pageFormat.width - _margin.horizontal, |
101 | maxHeight: pageFormat.height - _margin.vertical); | 101 | maxHeight: pageFormat.height - _margin.vertical); |
102 | 102 | ||
103 | - final Theme calculatedTheme = theme ?? document.theme ?? Theme.base(); | 103 | + final ThemeData calculatedTheme = |
104 | + theme ?? document.theme ?? ThemeData.base(); | ||
104 | final Context context = Context( | 105 | final Context context = Context( |
105 | document: document.document, | 106 | document: document.document, |
106 | page: _pdfPage, | 107 | page: _pdfPage, |
@@ -441,26 +441,32 @@ class TextSpan extends InlineSpan { | @@ -441,26 +441,32 @@ class TextSpan extends InlineSpan { | ||
441 | class RichText extends Widget { | 441 | class RichText extends Widget { |
442 | RichText( | 442 | RichText( |
443 | {@required this.text, | 443 | {@required this.text, |
444 | - this.textAlign = TextAlign.left, | ||
445 | - this.softWrap = true, | 444 | + TextAlign textAlign, |
445 | + bool softWrap, | ||
446 | this.tightBounds = false, | 446 | this.tightBounds = false, |
447 | this.textScaleFactor = 1.0, | 447 | this.textScaleFactor = 1.0, |
448 | - this.maxLines}) | ||
449 | - : assert(text != null); | 448 | + int maxLines}) |
449 | + : assert(text != null), | ||
450 | + _textAlign = textAlign, | ||
451 | + _softWrap = softWrap, | ||
452 | + _maxLines = maxLines; | ||
450 | 453 | ||
451 | static bool debug = false; | 454 | static bool debug = false; |
452 | 455 | ||
453 | final InlineSpan text; | 456 | final InlineSpan text; |
454 | 457 | ||
455 | - final TextAlign textAlign; | 458 | + TextAlign get textAlign => _textAlign; |
459 | + TextAlign _textAlign; | ||
456 | 460 | ||
457 | final double textScaleFactor; | 461 | final double textScaleFactor; |
458 | 462 | ||
459 | - final bool softWrap; | 463 | + bool get softWrap => _softWrap; |
464 | + bool _softWrap; | ||
460 | 465 | ||
461 | final bool tightBounds; | 466 | final bool tightBounds; |
462 | 467 | ||
463 | - final int maxLines; | 468 | + int get maxLines => _maxLines; |
469 | + int _maxLines; | ||
464 | 470 | ||
465 | final List<_Span> _spans = <_Span>[]; | 471 | final List<_Span> _spans = <_Span>[]; |
466 | 472 | ||
@@ -524,7 +530,11 @@ class RichText extends Widget { | @@ -524,7 +530,11 @@ class RichText extends Widget { | ||
524 | _spans.clear(); | 530 | _spans.clear(); |
525 | _decorations.clear(); | 531 | _decorations.clear(); |
526 | 532 | ||
527 | - final TextStyle defaultstyle = Theme.of(context).defaultTextStyle; | 533 | + final ThemeData theme = Theme.of(context); |
534 | + final TextStyle defaultstyle = theme.defaultTextStyle; | ||
535 | + _softWrap ??= theme.softWrap; | ||
536 | + _maxLines ??= theme.maxLines; | ||
537 | + _textAlign ??= theme.textAlign; | ||
528 | 538 | ||
529 | final double constraintWidth = constraints.hasBoundedWidth | 539 | final double constraintWidth = constraints.hasBoundedWidth |
530 | ? constraints.maxWidth | 540 | ? constraints.maxWidth |
@@ -821,8 +831,8 @@ class Text extends RichText { | @@ -821,8 +831,8 @@ class Text extends RichText { | ||
821 | Text( | 831 | Text( |
822 | String text, { | 832 | String text, { |
823 | TextStyle style, | 833 | TextStyle style, |
824 | - TextAlign textAlign = TextAlign.left, | ||
825 | - bool softWrap = true, | 834 | + TextAlign textAlign, |
835 | + bool softWrap, | ||
826 | bool tightBounds = false, | 836 | bool tightBounds = false, |
827 | double textScaleFactor = 1.0, | 837 | double textScaleFactor = 1.0, |
828 | int maxLines, | 838 | int maxLines, |
@@ -19,8 +19,8 @@ | @@ -19,8 +19,8 @@ | ||
19 | part of widget; | 19 | part of widget; |
20 | 20 | ||
21 | @immutable | 21 | @immutable |
22 | -class Theme extends Inherited { | ||
23 | - factory Theme({ | 22 | +class ThemeData extends Inherited { |
23 | + factory ThemeData({ | ||
24 | TextStyle defaultTextStyle, | 24 | TextStyle defaultTextStyle, |
25 | TextStyle paragraphStyle, | 25 | TextStyle paragraphStyle, |
26 | TextStyle header0, | 26 | TextStyle header0, |
@@ -32,8 +32,11 @@ class Theme extends Inherited { | @@ -32,8 +32,11 @@ class Theme extends Inherited { | ||
32 | TextStyle bulletStyle, | 32 | TextStyle bulletStyle, |
33 | TextStyle tableHeader, | 33 | TextStyle tableHeader, |
34 | TextStyle tableCell, | 34 | TextStyle tableCell, |
35 | + bool softWrap, | ||
36 | + TextAlign textAlign, | ||
37 | + int maxLines, | ||
35 | }) { | 38 | }) { |
36 | - final Theme base = Theme.base(); | 39 | + final ThemeData base = ThemeData.base(); |
37 | return base.copyWith( | 40 | return base.copyWith( |
38 | defaultTextStyle: defaultTextStyle, | 41 | defaultTextStyle: defaultTextStyle, |
39 | paragraphStyle: paragraphStyle, | 42 | paragraphStyle: paragraphStyle, |
@@ -46,10 +49,13 @@ class Theme extends Inherited { | @@ -46,10 +49,13 @@ class Theme extends Inherited { | ||
46 | header5: header5, | 49 | header5: header5, |
47 | tableHeader: tableHeader, | 50 | tableHeader: tableHeader, |
48 | tableCell: tableCell, | 51 | tableCell: tableCell, |
52 | + softWrap: softWrap, | ||
53 | + textAlign: textAlign, | ||
54 | + maxLines: maxLines, | ||
49 | ); | 55 | ); |
50 | } | 56 | } |
51 | 57 | ||
52 | - Theme._({ | 58 | + ThemeData._({ |
53 | @required this.defaultTextStyle, | 59 | @required this.defaultTextStyle, |
54 | @required this.paragraphStyle, | 60 | @required this.paragraphStyle, |
55 | @required this.header0, | 61 | @required this.header0, |
@@ -61,6 +67,9 @@ class Theme extends Inherited { | @@ -61,6 +67,9 @@ class Theme extends Inherited { | ||
61 | @required this.bulletStyle, | 67 | @required this.bulletStyle, |
62 | @required this.tableHeader, | 68 | @required this.tableHeader, |
63 | @required this.tableCell, | 69 | @required this.tableCell, |
70 | + @required this.softWrap, | ||
71 | + @required this.textAlign, | ||
72 | + this.maxLines, | ||
64 | }) : assert(defaultTextStyle.inherit == false), | 73 | }) : assert(defaultTextStyle.inherit == false), |
65 | assert(paragraphStyle.inherit == false), | 74 | assert(paragraphStyle.inherit == false), |
66 | assert(header0.inherit == false), | 75 | assert(header0.inherit == false), |
@@ -71,9 +80,12 @@ class Theme extends Inherited { | @@ -71,9 +80,12 @@ class Theme extends Inherited { | ||
71 | assert(header5.inherit == false), | 80 | assert(header5.inherit == false), |
72 | assert(bulletStyle.inherit == false), | 81 | assert(bulletStyle.inherit == false), |
73 | assert(tableHeader.inherit == false), | 82 | assert(tableHeader.inherit == false), |
74 | - assert(tableCell.inherit == false); | 83 | + assert(tableCell.inherit == false), |
84 | + assert(softWrap != null), | ||
85 | + assert(maxLines == null || maxLines > 0); | ||
75 | 86 | ||
76 | - factory Theme.withFont({Font base, Font bold, Font italic, Font boldItalic}) { | 87 | + factory ThemeData.withFont( |
88 | + {Font base, Font bold, Font italic, Font boldItalic}) { | ||
77 | final TextStyle defaultStyle = TextStyle.defaultStyle().copyWith( | 89 | final TextStyle defaultStyle = TextStyle.defaultStyle().copyWith( |
78 | font: base, | 90 | font: base, |
79 | fontNormal: base, | 91 | fontNormal: base, |
@@ -82,7 +94,7 @@ class Theme extends Inherited { | @@ -82,7 +94,7 @@ class Theme extends Inherited { | ||
82 | fontBoldItalic: boldItalic); | 94 | fontBoldItalic: boldItalic); |
83 | final double fontSize = defaultStyle.fontSize; | 95 | final double fontSize = defaultStyle.fontSize; |
84 | 96 | ||
85 | - return Theme._( | 97 | + return ThemeData._( |
86 | defaultTextStyle: defaultStyle, | 98 | defaultTextStyle: defaultStyle, |
87 | paragraphStyle: defaultStyle.copyWith(lineSpacing: 5), | 99 | paragraphStyle: defaultStyle.copyWith(lineSpacing: 5), |
88 | bulletStyle: defaultStyle.copyWith(lineSpacing: 5), | 100 | bulletStyle: defaultStyle.copyWith(lineSpacing: 5), |
@@ -95,12 +107,14 @@ class Theme extends Inherited { | @@ -95,12 +107,14 @@ class Theme extends Inherited { | ||
95 | tableHeader: defaultStyle.copyWith( | 107 | tableHeader: defaultStyle.copyWith( |
96 | fontSize: fontSize * 0.8, fontWeight: FontWeight.bold), | 108 | fontSize: fontSize * 0.8, fontWeight: FontWeight.bold), |
97 | tableCell: defaultStyle.copyWith(fontSize: fontSize * 0.8), | 109 | tableCell: defaultStyle.copyWith(fontSize: fontSize * 0.8), |
110 | + softWrap: true, | ||
111 | + textAlign: TextAlign.left, | ||
98 | ); | 112 | ); |
99 | } | 113 | } |
100 | 114 | ||
101 | - factory Theme.base() => Theme.withFont(); | 115 | + factory ThemeData.base() => ThemeData.withFont(); |
102 | 116 | ||
103 | - Theme copyWith({ | 117 | + ThemeData copyWith({ |
104 | TextStyle defaultTextStyle, | 118 | TextStyle defaultTextStyle, |
105 | TextStyle paragraphStyle, | 119 | TextStyle paragraphStyle, |
106 | TextStyle header0, | 120 | TextStyle header0, |
@@ -112,8 +126,11 @@ class Theme extends Inherited { | @@ -112,8 +126,11 @@ class Theme extends Inherited { | ||
112 | TextStyle bulletStyle, | 126 | TextStyle bulletStyle, |
113 | TextStyle tableHeader, | 127 | TextStyle tableHeader, |
114 | TextStyle tableCell, | 128 | TextStyle tableCell, |
129 | + bool softWrap, | ||
130 | + TextAlign textAlign, | ||
131 | + int maxLines, | ||
115 | }) => | 132 | }) => |
116 | - Theme._( | 133 | + ThemeData._( |
117 | defaultTextStyle: this.defaultTextStyle.merge(defaultTextStyle), | 134 | defaultTextStyle: this.defaultTextStyle.merge(defaultTextStyle), |
118 | paragraphStyle: this.paragraphStyle.merge(paragraphStyle), | 135 | paragraphStyle: this.paragraphStyle.merge(paragraphStyle), |
119 | bulletStyle: this.bulletStyle.merge(bulletStyle), | 136 | bulletStyle: this.bulletStyle.merge(bulletStyle), |
@@ -125,12 +142,11 @@ class Theme extends Inherited { | @@ -125,12 +142,11 @@ class Theme extends Inherited { | ||
125 | header5: this.header5.merge(header5), | 142 | header5: this.header5.merge(header5), |
126 | tableHeader: this.tableHeader.merge(tableHeader), | 143 | tableHeader: this.tableHeader.merge(tableHeader), |
127 | tableCell: this.tableCell.merge(tableCell), | 144 | tableCell: this.tableCell.merge(tableCell), |
145 | + softWrap: softWrap ?? this.softWrap, | ||
146 | + textAlign: textAlign ?? this.textAlign, | ||
147 | + maxLines: maxLines ?? this.maxLines, | ||
128 | ); | 148 | ); |
129 | 149 | ||
130 | - static Theme of(Context context) { | ||
131 | - return context.inherited[Theme]; | ||
132 | - } | ||
133 | - | ||
134 | final TextStyle defaultTextStyle; | 150 | final TextStyle defaultTextStyle; |
135 | 151 | ||
136 | final TextStyle paragraphStyle; | 152 | final TextStyle paragraphStyle; |
@@ -147,4 +163,102 @@ class Theme extends Inherited { | @@ -147,4 +163,102 @@ class Theme extends Inherited { | ||
147 | final TextStyle tableHeader; | 163 | final TextStyle tableHeader; |
148 | 164 | ||
149 | final TextStyle tableCell; | 165 | final TextStyle tableCell; |
166 | + | ||
167 | + final TextAlign textAlign; | ||
168 | + final bool softWrap; | ||
169 | + final int maxLines; | ||
170 | +} | ||
171 | + | ||
172 | +class Theme extends StatelessWidget { | ||
173 | + Theme({ | ||
174 | + @required this.data, | ||
175 | + @required this.child, | ||
176 | + }) : assert(data != null), | ||
177 | + assert(child != null); | ||
178 | + | ||
179 | + final ThemeData data; | ||
180 | + | ||
181 | + final Widget child; | ||
182 | + | ||
183 | + static ThemeData of(Context context) { | ||
184 | + return context.inherited[ThemeData]; | ||
185 | + } | ||
186 | + | ||
187 | + @Deprecated('Use ThemeData.base()') | ||
188 | + static ThemeData base() => ThemeData.base(); | ||
189 | + | ||
190 | + @Deprecated('Use ThemeData.withFont()') | ||
191 | + static ThemeData withFont( | ||
192 | + {Font base, Font bold, Font italic, Font boldItalic}) => | ||
193 | + ThemeData.withFont( | ||
194 | + base: base, bold: bold, italic: italic, boldItalic: boldItalic); | ||
195 | + | ||
196 | + @override | ||
197 | + Widget build(Context context) { | ||
198 | + return InheritedWidget( | ||
199 | + inherited: data, | ||
200 | + build: (Context context) => child, | ||
201 | + ); | ||
202 | + } | ||
203 | +} | ||
204 | + | ||
205 | +class DefaultTextStyle extends StatelessWidget implements Inherited { | ||
206 | + DefaultTextStyle({ | ||
207 | + @required this.style, | ||
208 | + @required this.child, | ||
209 | + this.textAlign, | ||
210 | + this.softWrap = true, | ||
211 | + this.maxLines, | ||
212 | + }) : assert(style != null), | ||
213 | + assert(child != null), | ||
214 | + assert(softWrap != null), | ||
215 | + assert(maxLines == null || maxLines > 0); | ||
216 | + | ||
217 | + static Widget merge({ | ||
218 | + TextStyle style, | ||
219 | + TextAlign textAlign, | ||
220 | + bool softWrap, | ||
221 | + int maxLines, | ||
222 | + @required Widget child, | ||
223 | + }) { | ||
224 | + assert(child != null); | ||
225 | + return Builder( | ||
226 | + builder: (Context context) { | ||
227 | + final ThemeData parent = Theme.of(context); | ||
228 | + | ||
229 | + return DefaultTextStyle( | ||
230 | + style: parent.defaultTextStyle.merge(style), | ||
231 | + textAlign: textAlign ?? parent.textAlign, | ||
232 | + softWrap: softWrap ?? parent.softWrap, | ||
233 | + maxLines: maxLines ?? parent.maxLines, | ||
234 | + child: child, | ||
235 | + ); | ||
236 | + }, | ||
237 | + ); | ||
238 | + } | ||
239 | + | ||
240 | + final TextStyle style; | ||
241 | + | ||
242 | + final Widget child; | ||
243 | + | ||
244 | + final TextAlign textAlign; | ||
245 | + | ||
246 | + final bool softWrap; | ||
247 | + | ||
248 | + final int maxLines; | ||
249 | + | ||
250 | + @override | ||
251 | + Widget build(Context context) { | ||
252 | + final ThemeData theme = Theme.of(context).copyWith( | ||
253 | + defaultTextStyle: style, | ||
254 | + textAlign: textAlign, | ||
255 | + softWrap: softWrap, | ||
256 | + maxLines: maxLines, | ||
257 | + ); | ||
258 | + | ||
259 | + return InheritedWidget( | ||
260 | + inherited: theme, | ||
261 | + build: (Context context) => child, | ||
262 | + ); | ||
263 | + } | ||
150 | } | 264 | } |
@@ -38,7 +38,7 @@ void main() { | @@ -38,7 +38,7 @@ void main() { | ||
38 | 38 | ||
39 | pdf = Document( | 39 | pdf = Document( |
40 | title: 'Widgets Test', | 40 | title: 'Widgets Test', |
41 | - theme: Theme.withFont( | 41 | + theme: ThemeData.withFont( |
42 | base: Font.ttf(defaultFont.buffer.asByteData()), | 42 | base: Font.ttf(defaultFont.buffer.asByteData()), |
43 | bold: Font.ttf(defaultFontBold.buffer.asByteData()), | 43 | bold: Font.ttf(defaultFontBold.buffer.asByteData()), |
44 | )); | 44 | )); |
@@ -73,7 +73,7 @@ void main() { | @@ -73,7 +73,7 @@ void main() { | ||
73 | }); | 73 | }); |
74 | 74 | ||
75 | test('Theme Page 1', () { | 75 | test('Theme Page 1', () { |
76 | - final Theme theme = Theme.withFont(base: roboto); | 76 | + final ThemeData theme = ThemeData.withFont(base: roboto); |
77 | 77 | ||
78 | pdf.addPage(Page( | 78 | pdf.addPage(Page( |
79 | theme: theme, | 79 | theme: theme, |
@@ -84,7 +84,7 @@ void main() { | @@ -84,7 +84,7 @@ void main() { | ||
84 | }); | 84 | }); |
85 | 85 | ||
86 | test('Theme Page 2', () { | 86 | test('Theme Page 2', () { |
87 | - final Theme theme = Theme.base().copyWith( | 87 | + final ThemeData theme = ThemeData.base().copyWith( |
88 | tableHeader: TextStyle(font: openSansBold), | 88 | tableHeader: TextStyle(font: openSansBold), |
89 | tableCell: TextStyle(font: roboto), | 89 | tableCell: TextStyle(font: roboto), |
90 | ); | 90 | ); |
@@ -107,11 +107,11 @@ void main() { | @@ -107,11 +107,11 @@ void main() { | ||
107 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, | 107 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
108 | children: <Widget>[ | 108 | children: <Widget>[ |
109 | Text('Hello default'), | 109 | Text('Hello default'), |
110 | - InheritedWidget( | ||
111 | - inherited: Theme.withFont( | 110 | + Theme( |
111 | + data: ThemeData.withFont( | ||
112 | base: roboto, | 112 | base: roboto, |
113 | ), | 113 | ), |
114 | - build: (Context context) => Text('Hello themed'), | 114 | + child: Text('Hello themed'), |
115 | ), | 115 | ), |
116 | ], | 116 | ], |
117 | ), | 117 | ), |
@@ -124,7 +124,7 @@ void main() { | @@ -124,7 +124,7 @@ void main() { | ||
124 | pageFormat: PdfPageFormat.a4, | 124 | pageFormat: PdfPageFormat.a4, |
125 | orientation: PageOrientation.portrait, | 125 | orientation: PageOrientation.portrait, |
126 | margin: const EdgeInsets.all(8.0), | 126 | margin: const EdgeInsets.all(8.0), |
127 | - theme: Theme( | 127 | + theme: ThemeData( |
128 | defaultTextStyle: TextStyle(font: Font.courier(), fontSize: 10.0), | 128 | defaultTextStyle: TextStyle(font: Font.courier(), fontSize: 10.0), |
129 | ), | 129 | ), |
130 | build: (Context context) { | 130 | build: (Context context) { |
-
Please register or login to post a comment