Showing
7 changed files
with
198 additions
and
148 deletions
| @@ -191,8 +191,11 @@ class Table extends Widget implements SpanningWidget { | @@ -191,8 +191,11 @@ class Table extends Widget implements SpanningWidget { | ||
| 191 | assert(defaultColumnWidth != null), | 191 | assert(defaultColumnWidth != null), |
| 192 | super(); | 192 | super(); |
| 193 | 193 | ||
| 194 | - factory Table.fromTextArray( | ||
| 195 | - {@required Context context, @required List<List<String>> data}) { | 194 | + factory Table.fromTextArray({ |
| 195 | + @required Context context, | ||
| 196 | + @required List<List<String>> data, | ||
| 197 | + EdgeInsets margin = const EdgeInsets.all(5), | ||
| 198 | + }) { | ||
| 196 | final List<TableRow> rows = <TableRow>[]; | 199 | final List<TableRow> rows = <TableRow>[]; |
| 197 | for (List<String> row in data) { | 200 | for (List<String> row in data) { |
| 198 | final List<Widget> tableRow = <Widget>[]; | 201 | final List<Widget> tableRow = <Widget>[]; |
| @@ -200,13 +203,13 @@ class Table extends Widget implements SpanningWidget { | @@ -200,13 +203,13 @@ class Table extends Widget implements SpanningWidget { | ||
| 200 | for (String cell in row) { | 203 | for (String cell in row) { |
| 201 | tableRow.add(Container( | 204 | tableRow.add(Container( |
| 202 | alignment: Alignment.center, | 205 | alignment: Alignment.center, |
| 203 | - margin: const EdgeInsets.all(5), | 206 | + margin: margin, |
| 204 | child: Text(cell, style: Theme.of(context).tableHeader))); | 207 | child: Text(cell, style: Theme.of(context).tableHeader))); |
| 205 | } | 208 | } |
| 206 | } else { | 209 | } else { |
| 207 | for (String cell in row) { | 210 | for (String cell in row) { |
| 208 | tableRow.add(Container( | 211 | tableRow.add(Container( |
| 209 | - margin: const EdgeInsets.all(5), | 212 | + margin: margin, |
| 210 | child: Text(cell, style: Theme.of(context).tableCell))); | 213 | child: Text(cell, style: Theme.of(context).tableCell))); |
| 211 | } | 214 | } |
| 212 | } | 215 | } |
| @@ -405,6 +405,7 @@ class RichText extends Widget { | @@ -405,6 +405,7 @@ class RichText extends Widget { | ||
| 405 | {@required this.text, | 405 | {@required this.text, |
| 406 | this.textAlign = TextAlign.left, | 406 | this.textAlign = TextAlign.left, |
| 407 | this.softWrap = true, | 407 | this.softWrap = true, |
| 408 | + this.tightBounds = false, | ||
| 408 | this.textScaleFactor = 1.0, | 409 | this.textScaleFactor = 1.0, |
| 409 | this.maxLines}) | 410 | this.maxLines}) |
| 410 | : assert(text != null); | 411 | : assert(text != null); |
| @@ -419,6 +420,8 @@ class RichText extends Widget { | @@ -419,6 +420,8 @@ class RichText extends Widget { | ||
| 419 | 420 | ||
| 420 | final bool softWrap; | 421 | final bool softWrap; |
| 421 | 422 | ||
| 423 | + final bool tightBounds; | ||
| 424 | + | ||
| 422 | final int maxLines; | 425 | final int maxLines; |
| 423 | 426 | ||
| 424 | final List<_Span> _spans = <_Span>[]; | 427 | final List<_Span> _spans = <_Span>[]; |
| @@ -551,14 +554,10 @@ class RichText extends Widget { | @@ -551,14 +554,10 @@ class RichText extends Widget { | ||
| 551 | } | 554 | } |
| 552 | 555 | ||
| 553 | final double baseline = span.baseline * textScaleFactor; | 556 | final double baseline = span.baseline * textScaleFactor; |
| 554 | - top = math.min( | ||
| 555 | - top ?? metrics.top + baseline, | ||
| 556 | - metrics.top + baseline, | ||
| 557 | - ); | ||
| 558 | - bottom = math.max( | ||
| 559 | - bottom ?? metrics.bottom + baseline, | ||
| 560 | - metrics.bottom + baseline, | ||
| 561 | - ); | 557 | + final double mt = tightBounds ? metrics.top : metrics.descent; |
| 558 | + final double mb = tightBounds ? metrics.bottom : metrics.ascent; | ||
| 559 | + top = math.min(top ?? mt + baseline, mt + baseline); | ||
| 560 | + bottom = math.max(bottom ?? mb + baseline, mb + baseline); | ||
| 562 | 561 | ||
| 563 | final _Word wd = _Word( | 562 | final _Word wd = _Word( |
| 564 | word, | 563 | word, |
| @@ -785,6 +784,7 @@ class Text extends RichText { | @@ -785,6 +784,7 @@ class Text extends RichText { | ||
| 785 | TextStyle style, | 784 | TextStyle style, |
| 786 | TextAlign textAlign = TextAlign.left, | 785 | TextAlign textAlign = TextAlign.left, |
| 787 | bool softWrap = true, | 786 | bool softWrap = true, |
| 787 | + bool tightBounds = false, | ||
| 788 | double textScaleFactor = 1.0, | 788 | double textScaleFactor = 1.0, |
| 789 | int maxLines, | 789 | int maxLines, |
| 790 | }) : assert(text != null), | 790 | }) : assert(text != null), |
| @@ -792,6 +792,7 @@ class Text extends RichText { | @@ -792,6 +792,7 @@ class Text extends RichText { | ||
| 792 | text: TextSpan(text: text, style: style), | 792 | text: TextSpan(text: text, style: style), |
| 793 | textAlign: textAlign, | 793 | textAlign: textAlign, |
| 794 | softWrap: softWrap, | 794 | softWrap: softWrap, |
| 795 | + tightBounds: tightBounds, | ||
| 795 | textScaleFactor: textScaleFactor, | 796 | textScaleFactor: textScaleFactor, |
| 796 | maxLines: maxLines); | 797 | maxLines: maxLines); |
| 797 | } | 798 | } |
| @@ -56,85 +56,116 @@ void main() { | @@ -56,85 +56,116 @@ void main() { | ||
| 56 | margin: const EdgeInsets.all(10), | 56 | margin: const EdgeInsets.all(10), |
| 57 | build: (Context context) => Column(children: <Widget>[ | 57 | build: (Context context) => Column(children: <Widget>[ |
| 58 | Container( | 58 | Container( |
| 59 | - padding: const EdgeInsets.all(5), | ||
| 60 | - margin: const EdgeInsets.only(bottom: 10), | ||
| 61 | - decoration: const BoxDecoration( | ||
| 62 | - color: PdfColors.amber, | ||
| 63 | - border: BoxBorder( | ||
| 64 | - top: true, | ||
| 65 | - bottom: true, | ||
| 66 | - left: true, | ||
| 67 | - right: true, | ||
| 68 | - width: 2)), | ||
| 69 | - child: Text('Hello World', | ||
| 70 | - textScaleFactor: 2, textAlign: TextAlign.center)), | 59 | + padding: const EdgeInsets.all(5), |
| 60 | + margin: const EdgeInsets.only(bottom: 10), | ||
| 61 | + decoration: const BoxDecoration( | ||
| 62 | + color: PdfColors.amber, | ||
| 63 | + border: BoxBorder( | ||
| 64 | + top: true, | ||
| 65 | + bottom: true, | ||
| 66 | + left: true, | ||
| 67 | + right: true, | ||
| 68 | + width: 2)), | ||
| 69 | + child: Text( | ||
| 70 | + 'Hello World', | ||
| 71 | + textScaleFactor: 2, | ||
| 72 | + textAlign: TextAlign.center, | ||
| 73 | + ), | ||
| 74 | + ), | ||
| 71 | Align( | 75 | Align( |
| 72 | - alignment: Alignment.topLeft, | ||
| 73 | - child: Link( | ||
| 74 | - destination: 'anchor', | ||
| 75 | - child: Text( | ||
| 76 | - 'Internal link', | ||
| 77 | - style: const TextStyle( | ||
| 78 | - color: PdfColors.blue, | ||
| 79 | - decoration: TextDecoration.underline, | ||
| 80 | - ), | ||
| 81 | - ))), | 76 | + alignment: Alignment.topLeft, |
| 77 | + child: Link( | ||
| 78 | + destination: 'anchor', | ||
| 79 | + child: Text( | ||
| 80 | + 'Internal link', | ||
| 81 | + style: const TextStyle( | ||
| 82 | + color: PdfColors.blue, | ||
| 83 | + decoration: TextDecoration.underline, | ||
| 84 | + ), | ||
| 85 | + ), | ||
| 86 | + ), | ||
| 87 | + ), | ||
| 82 | Padding(padding: const EdgeInsets.all(5)), | 88 | Padding(padding: const EdgeInsets.all(5)), |
| 83 | Row( | 89 | Row( |
| 84 | - mainAxisAlignment: MainAxisAlignment.spaceEvenly, | ||
| 85 | - children: <Widget>[ | ||
| 86 | - Image(im), | ||
| 87 | - PdfLogo(), | ||
| 88 | - Column(children: <Widget>[ | 90 | + mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
| 91 | + children: <Widget>[ | ||
| 92 | + Image(im), | ||
| 93 | + PdfLogo(), | ||
| 94 | + Column( | ||
| 95 | + children: <Widget>[ | ||
| 89 | Text('(', style: symbol), | 96 | Text('(', style: symbol), |
| 90 | Text('4', style: symbol), | 97 | Text('4', style: symbol), |
| 91 | - ]), | ||
| 92 | - ]), | 98 | + ], |
| 99 | + ), | ||
| 100 | + ], | ||
| 101 | + ), | ||
| 93 | Padding( | 102 | Padding( |
| 94 | - padding: const EdgeInsets.only(left: 30, top: 20), | ||
| 95 | - child: Lorem(textAlign: TextAlign.justify)), | 103 | + padding: const EdgeInsets.only(left: 30, top: 20), |
| 104 | + child: Lorem(textAlign: TextAlign.justify), | ||
| 105 | + ), | ||
| 96 | Expanded( | 106 | Expanded( |
| 97 | child: FittedBox( | 107 | child: FittedBox( |
| 98 | child: Transform.rotateBox( | 108 | child: Transform.rotateBox( |
| 99 | angle: 0.2, | 109 | angle: 0.2, |
| 100 | - child: Text('Expanded'), | 110 | + child: Text( |
| 111 | + 'Expanded', | ||
| 112 | + tightBounds: true, | ||
| 113 | + ), | ||
| 101 | ), | 114 | ), |
| 102 | ), | 115 | ), |
| 103 | ), | 116 | ), |
| 104 | Container( | 117 | Container( |
| 105 | - padding: const EdgeInsets.only(top: 5), | ||
| 106 | - decoration: const BoxDecoration( | ||
| 107 | - border: BoxBorder(top: true, width: 1)), | ||
| 108 | - child: Text("That's all Folks!", | ||
| 109 | - textAlign: TextAlign.center, | ||
| 110 | - style: Theme.of(context) | ||
| 111 | - .defaultTextStyle | ||
| 112 | - .copyWith(font: Font.timesBoldItalic()), | ||
| 113 | - textScaleFactor: 3)), | 118 | + decoration: |
| 119 | + const BoxDecoration(border: BoxBorder(top: true, width: 1)), | ||
| 120 | + child: Text( | ||
| 121 | + "That's all Folks!", | ||
| 122 | + tightBounds: true, | ||
| 123 | + textAlign: TextAlign.center, | ||
| 124 | + style: Theme.of(context).defaultTextStyle.copyWith( | ||
| 125 | + font: Font.timesBoldItalic(), | ||
| 126 | + ), | ||
| 127 | + textScaleFactor: 3, | ||
| 128 | + ), | ||
| 129 | + ), | ||
| 114 | ]))); | 130 | ]))); |
| 115 | }); | 131 | }); |
| 116 | 132 | ||
| 117 | test('Pdf Widgets page 2', () { | 133 | test('Pdf Widgets page 2', () { |
| 118 | - pdf.addPage(Page( | 134 | + pdf.addPage( |
| 135 | + Page( | ||
| 119 | pageFormat: const PdfPageFormat(400, 400), | 136 | pageFormat: const PdfPageFormat(400, 400), |
| 120 | margin: const EdgeInsets.all(10), | 137 | margin: const EdgeInsets.all(10), |
| 121 | build: (Context context) => Center( | 138 | build: (Context context) => Center( |
| 122 | - child: GridView( | ||
| 123 | - crossAxisCount: 3, | ||
| 124 | - direction: Axis.vertical, | ||
| 125 | - crossAxisSpacing: 10, | ||
| 126 | - mainAxisSpacing: 10, | ||
| 127 | - padding: const EdgeInsets.all(10), | ||
| 128 | - children: List<Widget>.generate( | ||
| 129 | - 9, (int n) => FittedBox(child: Text('${n + 1}'))))))); | 139 | + child: GridView( |
| 140 | + crossAxisCount: 3, | ||
| 141 | + direction: Axis.vertical, | ||
| 142 | + crossAxisSpacing: 10, | ||
| 143 | + mainAxisSpacing: 10, | ||
| 144 | + padding: const EdgeInsets.all(10), | ||
| 145 | + children: List<Widget>.generate( | ||
| 146 | + 9, | ||
| 147 | + (int n) => FittedBox( | ||
| 148 | + child: Text('${n + 1}', tightBounds: true), | ||
| 149 | + ), | ||
| 150 | + ), | ||
| 151 | + ), | ||
| 152 | + ), | ||
| 153 | + ), | ||
| 154 | + ); | ||
| 130 | }); | 155 | }); |
| 131 | 156 | ||
| 132 | - test('Pdf Widgets page 3', () { | ||
| 133 | - pdf.addPage(MultiPage( | ||
| 134 | - pageFormat: const PdfPageFormat(400, 200), | ||
| 135 | - margin: const EdgeInsets.all(10), | ||
| 136 | - build: (Context context) => <Widget>[ | ||
| 137 | - Table.fromTextArray(context: context, data: <List<String>>[ | 157 | + test( |
| 158 | + 'Pdf Widgets page 3', | ||
| 159 | + () { | ||
| 160 | + pdf.addPage( | ||
| 161 | + MultiPage( | ||
| 162 | + pageFormat: const PdfPageFormat(400, 200), | ||
| 163 | + margin: const EdgeInsets.all(10), | ||
| 164 | + build: (Context context) => <Widget>[ | ||
| 165 | + Table.fromTextArray( | ||
| 166 | + context: context, | ||
| 167 | + margin: const EdgeInsets.all(3), | ||
| 168 | + data: <List<String>>[ | ||
| 138 | <String>['Company', 'Contact', 'Country'], | 169 | <String>['Company', 'Contact', 'Country'], |
| 139 | <String>['Alfreds Futterkiste', 'Maria Anders', 'Germany'], | 170 | <String>['Alfreds Futterkiste', 'Maria Anders', 'Germany'], |
| 140 | <String>[ | 171 | <String>[ |
| @@ -165,82 +196,96 @@ void main() { | @@ -165,82 +196,96 @@ void main() { | ||
| 165 | <String>['Dynatronics Accessories', "Cong Ch'en", 'China'], | 196 | <String>['Dynatronics Accessories', "Cong Ch'en", 'China'], |
| 166 | <String>['York Steak House', 'Outi Vuorinen', 'Finland'], | 197 | <String>['York Steak House', 'Outi Vuorinen', 'Finland'], |
| 167 | <String>['Weathervane', 'Else Jeremiassen', 'Iceland'], | 198 | <String>['Weathervane', 'Else Jeremiassen', 'Iceland'], |
| 168 | - ]), | ||
| 169 | - Anchor(name: 'anchor', child: Text('Anchor')), | ||
| 170 | - ])); | ||
| 171 | - }); | 199 | + ], |
| 200 | + ), | ||
| 201 | + Anchor(name: 'anchor', child: Text('Anchor')), | ||
| 202 | + ], | ||
| 203 | + ), | ||
| 204 | + ); | ||
| 205 | + }, | ||
| 206 | + ); | ||
| 172 | 207 | ||
| 173 | - test('Pdf Widgets page 4', () { | ||
| 174 | - pdf.addPage(Page( | ||
| 175 | - pageFormat: const PdfPageFormat(400, 200), | ||
| 176 | - margin: const EdgeInsets.all(10), | ||
| 177 | - build: (Context context) => Stack(overflow: Overflow.visible, | ||
| 178 | - // fit: StackFit.expand, | ||
| 179 | - // alignment: Alignment.bottomRight, | ||
| 180 | - children: <Widget>[ | ||
| 181 | - Positioned( | ||
| 182 | - right: 10, | ||
| 183 | - top: 10, | ||
| 184 | - child: CustomPaint( | ||
| 185 | - size: const PdfPoint(50, 50), | ||
| 186 | - painter: (PdfGraphics canvas, PdfPoint size) { | ||
| 187 | - canvas | ||
| 188 | - ..setColor(PdfColors.indigo) | ||
| 189 | - ..drawRRect(0, 0, size.x, size.y, 10, 10) | ||
| 190 | - ..fillPath(); | ||
| 191 | - })), | ||
| 192 | - Positioned( | ||
| 193 | - left: 10, | ||
| 194 | - bottom: 10, | ||
| 195 | - child: RichText( | ||
| 196 | - text: TextSpan( | ||
| 197 | - text: 'Hello ', | ||
| 198 | - style: Theme.of(context).defaultTextStyle, | ||
| 199 | - children: <TextSpan>[ | ||
| 200 | - TextSpan( | ||
| 201 | - text: 'bold', | ||
| 202 | - style: TextStyle( | ||
| 203 | - fontWeight: FontWeight.bold, | ||
| 204 | - fontSize: 20, | ||
| 205 | - color: PdfColors.blue)), | ||
| 206 | - const TextSpan( | ||
| 207 | - text: ' world!', | ||
| 208 | - ), | ||
| 209 | - ], | 208 | + test( |
| 209 | + 'Pdf Widgets page 4', | ||
| 210 | + () { | ||
| 211 | + pdf.addPage( | ||
| 212 | + Page( | ||
| 213 | + pageFormat: const PdfPageFormat(400, 200), | ||
| 214 | + margin: const EdgeInsets.all(10), | ||
| 215 | + build: (Context context) => Stack( | ||
| 216 | + overflow: Overflow.visible, | ||
| 217 | + // fit: StackFit.expand, | ||
| 218 | + // alignment: Alignment.bottomRight, | ||
| 219 | + children: <Widget>[ | ||
| 220 | + Positioned( | ||
| 221 | + right: 10, | ||
| 222 | + top: 10, | ||
| 223 | + child: CustomPaint( | ||
| 224 | + size: const PdfPoint(50, 50), | ||
| 225 | + painter: (PdfGraphics canvas, PdfPoint size) { | ||
| 226 | + canvas | ||
| 227 | + ..setColor(PdfColors.indigo) | ||
| 228 | + ..drawRRect(0, 0, size.x, size.y, 10, 10) | ||
| 229 | + ..fillPath(); | ||
| 230 | + })), | ||
| 231 | + Positioned( | ||
| 232 | + left: 10, | ||
| 233 | + bottom: 10, | ||
| 234 | + child: RichText( | ||
| 235 | + text: TextSpan( | ||
| 236 | + text: 'Hello ', | ||
| 237 | + style: Theme.of(context).defaultTextStyle, | ||
| 238 | + children: <TextSpan>[ | ||
| 239 | + TextSpan( | ||
| 240 | + text: 'bold', | ||
| 241 | + style: TextStyle( | ||
| 242 | + fontWeight: FontWeight.bold, | ||
| 243 | + fontSize: 20, | ||
| 244 | + color: PdfColors.blue)), | ||
| 245 | + const TextSpan( | ||
| 246 | + text: ' world!', | ||
| 210 | ), | 247 | ), |
| 211 | - )), | ||
| 212 | - Positioned( | ||
| 213 | - right: 10, | ||
| 214 | - bottom: 10, | ||
| 215 | - child: UrlLink( | ||
| 216 | - child: Text( | ||
| 217 | - 'https://github.com/DavBfr/dart_pdf/', | ||
| 218 | - style: const TextStyle( | ||
| 219 | - color: PdfColors.grey, | ||
| 220 | - fontSize: 8, | ||
| 221 | - decoration: TextDecoration.underline, | ||
| 222 | - ), | ||
| 223 | - ), | ||
| 224 | - destination: 'https://github.com/DavBfr/dart_pdf/')), | ||
| 225 | - Positioned( | ||
| 226 | - left: 10, | ||
| 227 | - top: 10, | ||
| 228 | - child: Container( | ||
| 229 | - width: 100, | ||
| 230 | - height: 100, | ||
| 231 | - child: Stack( | ||
| 232 | - alignment: Alignment.center, | ||
| 233 | - fit: StackFit.expand, | ||
| 234 | - children: <Widget>[ | ||
| 235 | - Center( | ||
| 236 | - child: Text('30%', textScaleFactor: 1.5)), | ||
| 237 | - CircularProgressIndicator( | ||
| 238 | - value: .3, | ||
| 239 | - backgroundColor: PdfColors.grey300, | ||
| 240 | - strokeWidth: 15), | ||
| 241 | - ]))) | ||
| 242 | - ]))); | ||
| 243 | - }); | 248 | + ], |
| 249 | + ), | ||
| 250 | + )), | ||
| 251 | + Positioned( | ||
| 252 | + right: 10, | ||
| 253 | + bottom: 10, | ||
| 254 | + child: UrlLink( | ||
| 255 | + child: Text( | ||
| 256 | + 'https://github.com/DavBfr/dart_pdf/', | ||
| 257 | + style: const TextStyle( | ||
| 258 | + color: PdfColors.grey, | ||
| 259 | + fontSize: 8, | ||
| 260 | + decoration: TextDecoration.underline, | ||
| 261 | + ), | ||
| 262 | + ), | ||
| 263 | + destination: 'https://github.com/DavBfr/dart_pdf/')), | ||
| 264 | + Positioned( | ||
| 265 | + left: 10, | ||
| 266 | + top: 10, | ||
| 267 | + child: Container( | ||
| 268 | + width: 100, | ||
| 269 | + height: 100, | ||
| 270 | + child: Stack( | ||
| 271 | + alignment: Alignment.center, | ||
| 272 | + fit: StackFit.expand, | ||
| 273 | + children: <Widget>[ | ||
| 274 | + Center(child: Text('30%', textScaleFactor: 1.5)), | ||
| 275 | + CircularProgressIndicator( | ||
| 276 | + value: .3, | ||
| 277 | + backgroundColor: PdfColors.grey300, | ||
| 278 | + strokeWidth: 15), | ||
| 279 | + ], | ||
| 280 | + ), | ||
| 281 | + ), | ||
| 282 | + ), | ||
| 283 | + ], | ||
| 284 | + ), | ||
| 285 | + ), | ||
| 286 | + ); | ||
| 287 | + }, | ||
| 288 | + ); | ||
| 244 | 289 | ||
| 245 | tearDownAll(() { | 290 | tearDownAll(() { |
| 246 | final File file = File('widgets.pdf'); | 291 | final File file = File('widgets.pdf'); |
No preview for this file type
No preview for this file type
No preview for this file type
-
Please register or login to post a comment