David PHAM-VAN

Fix Checkbox Widget

1 # Changelog 1 # Changelog
2 2
  3 +## 3.0.0-nullsafety.2
  4 +
  5 +- Fix Checkbox Widget
  6 +
3 ## 3.0.0-nullsafety.1 7 ## 3.0.0-nullsafety.1
4 8
5 - Fix Table border 9 - Fix Table border
@@ -82,7 +82,7 @@ enum PdfAnnotFlags { @@ -82,7 +82,7 @@ enum PdfAnnotFlags {
82 lockedContent, 82 lockedContent,
83 } 83 }
84 84
85 -enum PdfAnnotApparence { 85 +enum PdfAnnotAppearance {
86 normal, 86 normal,
87 rollover, 87 rollover,
88 down, 88 down,
@@ -125,6 +125,8 @@ abstract class PdfAnnotBase { @@ -125,6 +125,8 @@ abstract class PdfAnnotBase {
125 125
126 final Map<String?, PdfDataType> _appearances = <String?, PdfDataType>{}; 126 final Map<String?, PdfDataType> _appearances = <String?, PdfDataType>{};
127 127
  128 + PdfName? _as;
  129 +
128 int get flagValue { 130 int get flagValue {
129 if (flags == null || flags!.isEmpty) { 131 if (flags == null || flags!.isEmpty) {
130 return 0; 132 return 0;
@@ -137,21 +139,22 @@ abstract class PdfAnnotBase { @@ -137,21 +139,22 @@ abstract class PdfAnnotBase {
137 139
138 PdfGraphics appearance( 140 PdfGraphics appearance(
139 PdfDocument pdfDocument, 141 PdfDocument pdfDocument,
140 - PdfAnnotApparence type, { 142 + PdfAnnotAppearance type, {
141 String? name, 143 String? name,
142 Matrix4? matrix, 144 Matrix4? matrix,
143 PdfRect? boundingBox, 145 PdfRect? boundingBox,
  146 + bool selected = false,
144 }) { 147 }) {
145 final s = PdfGraphicXObject(pdfDocument, '/Form'); 148 final s = PdfGraphicXObject(pdfDocument, '/Form');
146 String? n; 149 String? n;
147 switch (type) { 150 switch (type) {
148 - case PdfAnnotApparence.normal: 151 + case PdfAnnotAppearance.normal:
149 n = '/N'; 152 n = '/N';
150 break; 153 break;
151 - case PdfAnnotApparence.rollover: 154 + case PdfAnnotAppearance.rollover:
152 n = '/R'; 155 n = '/R';
153 break; 156 break;
154 - case PdfAnnotApparence.down: 157 + case PdfAnnotAppearance.down:
155 n = '/D'; 158 n = '/D';
156 break; 159 break;
157 } 160 }
@@ -182,6 +185,10 @@ abstract class PdfAnnotBase { @@ -182,6 +185,10 @@ abstract class PdfAnnotBase {
182 s.params['/BBox'] = 185 s.params['/BBox'] =
183 PdfArray.fromNum(<double?>[bbox.x, bbox.y, bbox.width, bbox.height]); 186 PdfArray.fromNum(<double?>[bbox.x, bbox.y, bbox.width, bbox.height]);
184 final g = PdfGraphics(s, s.buf); 187 final g = PdfGraphics(s, s.buf);
  188 +
  189 + if (selected && name != null) {
  190 + _as = PdfName(name);
  191 + }
185 return g; 192 return g;
186 } 193 }
187 194
@@ -223,11 +230,8 @@ abstract class PdfAnnotBase { @@ -223,11 +230,8 @@ abstract class PdfAnnotBase {
223 230
224 if (_appearances.isNotEmpty) { 231 if (_appearances.isNotEmpty) {
225 params['/AP'] = PdfDict(_appearances); 232 params['/AP'] = PdfDict(_appearances);
226 - if (_appearances['/N'] is PdfDict) {  
227 - final n = _appearances['/N'];  
228 - if (n is PdfDict) {  
229 - params['/AS'] = PdfName(n.values.keys.first!);  
230 - } 233 + if (_as != null) {
  234 + params['/AS'] = _as;
231 } 235 }
232 } 236 }
233 } 237 }
@@ -656,7 +660,7 @@ class PdfTextField extends PdfFormField { @@ -656,7 +660,7 @@ class PdfTextField extends PdfFormField {
656 class PdfButtonField extends PdfFormField { 660 class PdfButtonField extends PdfFormField {
657 PdfButtonField({ 661 PdfButtonField({
658 required PdfRect rect, 662 required PdfRect rect,
659 - String? fieldName, 663 + required String fieldName,
660 String? alternateName, 664 String? alternateName,
661 String? mappingName, 665 String? mappingName,
662 PdfBorder? border, 666 PdfBorder? border,
@@ -683,20 +687,20 @@ class PdfButtonField extends PdfFormField { @@ -683,20 +687,20 @@ class PdfButtonField extends PdfFormField {
683 fieldFlags: fieldFlags, 687 fieldFlags: fieldFlags,
684 ); 688 );
685 689
686 - final bool? value; 690 + final String? value;
687 691
688 - final bool? defaultValue; 692 + final String? defaultValue;
689 693
690 @override 694 @override
691 void build(PdfPage page, PdfObject object, PdfDict params) { 695 void build(PdfPage page, PdfObject object, PdfDict params) {
692 super.build(page, object, params); 696 super.build(page, object, params);
693 697
694 if (value != null) { 698 if (value != null) {
695 - params['/V'] = value! ? const PdfName('/Yes') : const PdfName('/Off'); 699 + params['/V'] = PdfName(value!);
696 } 700 }
  701 +
697 if (defaultValue != null) { 702 if (defaultValue != null) {
698 - params['/DV'] =  
699 - defaultValue! ? const PdfName('/Yes') : const PdfName('/Off'); 703 + params['/DV'] = PdfName(defaultValue!);
700 } 704 }
701 } 705 }
702 } 706 }
@@ -290,7 +290,7 @@ class TextField extends Annotation { @@ -290,7 +290,7 @@ class TextField extends Annotation {
290 Widget? child, 290 Widget? child,
291 double width = 120, 291 double width = 120,
292 double height = 13, 292 double height = 13,
293 - String? name, 293 + required String name,
294 PdfBorder? border, 294 PdfBorder? border,
295 Set<PdfAnnotFlags>? flags, 295 Set<PdfAnnotFlags>? flags,
296 DateTime? date, 296 DateTime? date,
@@ -29,7 +29,6 @@ import 'widget.dart'; @@ -29,7 +29,6 @@ import 'widget.dart';
29 class Checkbox extends SingleChildWidget { 29 class Checkbox extends SingleChildWidget {
30 Checkbox({ 30 Checkbox({
31 required this.value, 31 required this.value,
32 - this.defaultValue,  
33 this.tristate = false, 32 this.tristate = false,
34 this.activeColor = PdfColors.blue, 33 this.activeColor = PdfColors.blue,
35 this.checkColor = PdfColors.white, 34 this.checkColor = PdfColors.white,
@@ -51,8 +50,6 @@ class Checkbox extends SingleChildWidget { @@ -51,8 +50,6 @@ class Checkbox extends SingleChildWidget {
51 50
52 final bool value; 51 final bool value;
53 52
54 - final bool? defaultValue;  
55 -  
56 final bool tristate; 53 final bool tristate;
57 54
58 final PdfColor activeColor; 55 final PdfColor activeColor;
@@ -69,13 +66,13 @@ class Checkbox extends SingleChildWidget { @@ -69,13 +66,13 @@ class Checkbox extends SingleChildWidget {
69 final bf = PdfButtonField( 66 final bf = PdfButtonField(
70 rect: context.localToGlobal(box!), 67 rect: context.localToGlobal(box!),
71 fieldName: name, 68 fieldName: name,
72 - value: value,  
73 - defaultValue: value, 69 + value: value ? '/Yes' : null,
  70 + defaultValue: value ? '/Yes' : null,
74 flags: <PdfAnnotFlags>{PdfAnnotFlags.print}, 71 flags: <PdfAnnotFlags>{PdfAnnotFlags.print},
75 ); 72 );
76 73
77 - final g =  
78 - bf.appearance(context.document, PdfAnnotApparence.normal, name: '/Yes'); 74 + final g = bf.appearance(context.document, PdfAnnotAppearance.normal,
  75 + name: '/Yes', selected: value);
79 g.drawRect(0, 0, bf.rect.width, bf.rect.height); 76 g.drawRect(0, 0, bf.rect.width, bf.rect.height);
80 g.setFillColor(activeColor); 77 g.setFillColor(activeColor);
81 g.fillPath(); 78 g.fillPath();
@@ -86,7 +83,8 @@ class Checkbox extends SingleChildWidget { @@ -86,7 +83,8 @@ class Checkbox extends SingleChildWidget {
86 g.setLineWidth(2); 83 g.setLineWidth(2);
87 g.strokePath(); 84 g.strokePath();
88 85
89 - bf.appearance(context.document, PdfAnnotApparence.normal, name: '/Off'); 86 + bf.appearance(context.document, PdfAnnotAppearance.normal,
  87 + name: '/Off', selected: !value);
90 88
91 PdfAnnot(context.page, bf); 89 PdfAnnot(context.page, bf);
92 } 90 }
@@ -144,12 +142,6 @@ class FlatButton extends SingleChildWidget { @@ -144,12 +142,6 @@ class FlatButton extends SingleChildWidget {
144 ), 142 ),
145 ); 143 );
146 144
147 - // final PdfColor textColor;  
148 -  
149 - // final PdfColor color;  
150 -  
151 - // final EdgeInsets padding;  
152 -  
153 final String name; 145 final String name;
154 146
155 final Widget _childDown; 147 final Widget _childDown;
@@ -177,21 +169,21 @@ class FlatButton extends SingleChildWidget { @@ -177,21 +169,21 @@ class FlatButton extends SingleChildWidget {
177 ..translate(box!.x, box!.y); 169 ..translate(box!.x, box!.y);
178 170
179 final cn = context.copyWith( 171 final cn = context.copyWith(
180 - canvas: bf.appearance(context.document, PdfAnnotApparence.normal, 172 + canvas: bf.appearance(context.document, PdfAnnotAppearance.normal,
181 matrix: mat, boundingBox: box)); 173 matrix: mat, boundingBox: box));
182 child!.layout( 174 child!.layout(
183 cn, BoxConstraints.tightFor(width: box!.width, height: box!.height)); 175 cn, BoxConstraints.tightFor(width: box!.width, height: box!.height));
184 child!.paint(cn); 176 child!.paint(cn);
185 177
186 final cd = context.copyWith( 178 final cd = context.copyWith(
187 - canvas: bf.appearance(context.document, PdfAnnotApparence.down, 179 + canvas: bf.appearance(context.document, PdfAnnotAppearance.down,
188 matrix: mat, boundingBox: box)); 180 matrix: mat, boundingBox: box));
189 _childDown.layout( 181 _childDown.layout(
190 cd, BoxConstraints.tightFor(width: box!.width, height: box!.height)); 182 cd, BoxConstraints.tightFor(width: box!.width, height: box!.height));
191 _childDown.paint(cd); 183 _childDown.paint(cd);
192 184
193 final cr = context.copyWith( 185 final cr = context.copyWith(
194 - canvas: bf.appearance(context.document, PdfAnnotApparence.rollover, 186 + canvas: bf.appearance(context.document, PdfAnnotAppearance.rollover,
195 matrix: mat, boundingBox: box)); 187 matrix: mat, boundingBox: box));
196 _childRollover.layout( 188 _childRollover.layout(
197 cr, BoxConstraints.tightFor(width: box!.width, height: box!.height)); 189 cr, BoxConstraints.tightFor(width: box!.width, height: box!.height));
@@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl @@ -4,7 +4,7 @@ description: A pdf producer for Dart. It can create pdf files for both web or fl
4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf 4 homepage: https://github.com/DavBfr/dart_pdf/tree/master/pdf
5 repository: https://github.com/DavBfr/dart_pdf 5 repository: https://github.com/DavBfr/dart_pdf
6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues 6 issue_tracker: https://github.com/DavBfr/dart_pdf/issues
7 -version: 3.0.0-nullsafety.1 7 +version: 3.0.0-nullsafety.2
8 8
9 environment: 9 environment:
10 sdk: ">=2.12.0-0 <3.0.0" 10 sdk: ">=2.12.0-0 <3.0.0"
@@ -118,7 +118,14 @@ void main() { @@ -118,7 +118,14 @@ void main() {
118 Checkbox( 118 Checkbox(
119 name: 'Checkbox', 119 name: 'Checkbox',
120 value: true, 120 value: true,
121 - defaultValue: true, 121 + ),
  122 + //
  123 + SizedBox(width: 20, height: 10),
  124 + //
  125 + Label(label: 'unchecked:', width: 100),
  126 + Checkbox(
  127 + name: 'Unchecked',
  128 + value: false,
122 ), 129 ),
123 // 130 //
124 SizedBox(width: double.infinity, height: 10), 131 SizedBox(width: double.infinity, height: 10),