David PHAM-VAN

Fix Table Widget

1 # 1.3.10 1 # 1.3.10
2 * Deprecate the document argument in Printing.sharePdf() 2 * Deprecate the document argument in Printing.sharePdf()
3 * Add default value to alpha in PdfColor variants 3 * Add default value to alpha in PdfColor variants
  4 +* Fix Table Widget
4 5
5 # 1.3.9 6 # 1.3.9
6 * Fix Transform Widget alignment 7 * Fix Transform Widget alignment
@@ -182,6 +182,11 @@ class Table extends Widget implements SpanningWidget { @@ -182,6 +182,11 @@ class Table extends Widget implements SpanningWidget {
182 } 182 }
183 } 183 }
184 184
  185 + if (_widths.isEmpty) {
  186 + box = PdfRect.fromPoints(PdfPoint.zero, constraints.smallest);
  187 + return;
  188 + }
  189 +
185 final double maxWidth = _widths.reduce((double a, double b) => a + b); 190 final double maxWidth = _widths.reduce((double a, double b) => a + b);
186 191
187 // Compute column widths using flex and estimated width 192 // Compute column widths using flex and estimated width
@@ -277,6 +282,10 @@ class Table extends Widget implements SpanningWidget { @@ -277,6 +282,10 @@ class Table extends Widget implements SpanningWidget {
277 ..saveContext() 282 ..saveContext()
278 ..setTransform(mat); 283 ..setTransform(mat);
279 284
  285 + if (_context.lastLine == 0) {
  286 + return;
  287 + }
  288 +
280 int index = 0; 289 int index = 0;
281 for (TableRow row in children) { 290 for (TableRow row in children) {
282 if (index++ < _context.firstLine && !row.repeat) { 291 if (index++ < _context.firstLine && !row.repeat) {
@@ -28,6 +28,7 @@ import 'type1_test.dart' as type1; @@ -28,6 +28,7 @@ import 'type1_test.dart' as type1;
28 import 'widget_basic_test.dart' as widget_basic; 28 import 'widget_basic_test.dart' as widget_basic;
29 import 'widget_clip_test.dart' as widget_clip; 29 import 'widget_clip_test.dart' as widget_clip;
30 import 'widget_container_test.dart' as widget_container; 30 import 'widget_container_test.dart' as widget_container;
  31 +import 'widget_table_test.dart' as widget_table;
31 import 'widget_test.dart' as widget; 32 import 'widget_test.dart' as widget;
32 33
33 void main() { 34 void main() {
@@ -42,6 +43,7 @@ void main() { @@ -42,6 +43,7 @@ void main() {
42 widget_basic.main(); 43 widget_basic.main();
43 widget_clip.main(); 44 widget_clip.main();
44 widget_container.main(); 45 widget_container.main();
  46 + widget_table.main();
45 widget.main(); 47 widget.main();
46 example.main(); 48 example.main();
47 } 49 }
  1 +/*
  2 + * Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
  3 + *
  4 + * Licensed under the Apache License, Version 2.0 (the "License");
  5 + * you may not use this file except in compliance with the License.
  6 + * You may obtain a copy of the License at
  7 + *
  8 + * http://www.apache.org/licenses/LICENSE-2.0
  9 + *
  10 + * Unless required by applicable law or agreed to in writing, software
  11 + * distributed under the License is distributed on an "AS IS" BASIS,
  12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13 + * See the License for the specific language governing permissions and
  14 + * limitations under the License.
  15 + */
  16 +
  17 +import 'dart:io';
  18 +import 'dart:math' as math;
  19 +
  20 +import 'package:meta/meta.dart';
  21 +import 'package:test/test.dart';
  22 +import 'package:pdf/pdf.dart';
  23 +import 'package:pdf/widgets.dart';
  24 +
  25 +Document pdf;
  26 +
  27 +List<TableRow> buildTable(
  28 + {@required Context context, int count = 10, bool repeatHeader = false}) {
  29 + final List<TableRow> rows = <TableRow>[];
  30 + {
  31 + final List<Widget> tableRow = <Widget>[];
  32 + for (String cell in <String>['Hue', 'Color', 'ARGB']) {
  33 + tableRow.add(Container(
  34 + alignment: Alignment.center,
  35 + margin: const EdgeInsets.all(5),
  36 + child: Text(cell, style: Theme.of(context).tableHeader)));
  37 + }
  38 + rows.add(TableRow(children: tableRow, repeat: repeatHeader));
  39 + }
  40 +
  41 + for (int y = 0; y < count; y++) {
  42 + final double h = math.sin(y / count) * 365;
  43 + final PdfColor color = PdfColorHsv(h, 1.0, 1.0);
  44 + final List<Widget> tableRow = <Widget>[
  45 + Container(
  46 + margin: const EdgeInsets.all(5),
  47 + child: Text('${h.toInt()}°', style: Theme.of(context).tableCell)),
  48 + Container(
  49 + margin: const EdgeInsets.all(5),
  50 + decoration: BoxDecoration(color: color, borderRadius: 5),
  51 + height: Theme.of(context).tableCell.fontSize),
  52 + Container(
  53 + margin: const EdgeInsets.all(5),
  54 + child: Text('${color.toHex()}', style: Theme.of(context).tableCell)),
  55 + ];
  56 + rows.add(TableRow(children: tableRow));
  57 + }
  58 +
  59 + return rows;
  60 +}
  61 +
  62 +void main() {
  63 + setUpAll(() {
  64 + Document.debug = true;
  65 + pdf = Document();
  66 + });
  67 +
  68 + test('Table Widget empty', () {
  69 + pdf.addPage(Page(
  70 + build: (Context context) => Table(),
  71 + ));
  72 + });
  73 +
  74 + test('Table Widget filled', () {
  75 + pdf.addPage(Page(
  76 + build: (Context context) => Table(
  77 + children: buildTable(context: context, count: 20),
  78 + border: const TableBorder(),
  79 + tableWidth: TableWidth.max,
  80 + ),
  81 + ));
  82 + });
  83 +
  84 + test('Table Widget multi-pages', () {
  85 + pdf.addPage(MultiPage(
  86 + build: (Context context) => <Widget>[
  87 + Table(
  88 + children: buildTable(context: context, count: 200),
  89 + border: const TableBorder(),
  90 + tableWidth: TableWidth.max,
  91 + ),
  92 + ]));
  93 + });
  94 +
  95 + test('Table Widget multi-pages with header', () {
  96 + pdf.addPage(MultiPage(
  97 + build: (Context context) => <Widget>[
  98 + Table(
  99 + children: buildTable(
  100 + context: context, count: 200, repeatHeader: true),
  101 + border: const TableBorder(),
  102 + tableWidth: TableWidth.max,
  103 + ),
  104 + ]));
  105 + });
  106 +
  107 + test('Table Widget multi-pages short', () {
  108 + pdf.addPage(MultiPage(
  109 + build: (Context context) => <Widget>[
  110 + SizedBox(height: 710),
  111 + Table(
  112 + children: buildTable(context: context, count: 4),
  113 + border: const TableBorder(),
  114 + tableWidth: TableWidth.max,
  115 + ),
  116 + ]));
  117 + });
  118 +
  119 + test('Table Widget multi-pages short header', () {
  120 + pdf.addPage(MultiPage(
  121 + build: (Context context) => <Widget>[
  122 + SizedBox(height: 710),
  123 + Table(
  124 + children:
  125 + buildTable(context: context, count: 4, repeatHeader: true),
  126 + border: const TableBorder(),
  127 + tableWidth: TableWidth.max,
  128 + ),
  129 + ]));
  130 + });
  131 +
  132 + tearDownAll(() {
  133 + final File file = File('widgets-table.pdf');
  134 + file.writeAsBytesSync(pdf.save());
  135 + });
  136 +}