Showing
3 changed files
with
69 additions
and
3 deletions
| @@ -62,7 +62,7 @@ class LimitedBox extends SingleChildWidget { | @@ -62,7 +62,7 @@ class LimitedBox extends SingleChildWidget { | ||
| 62 | assert(child!.box != null); | 62 | assert(child!.box != null); |
| 63 | size = constraints.constrain(child!.box!.size); | 63 | size = constraints.constrain(child!.box!.size); |
| 64 | } else { | 64 | } else { |
| 65 | - size = _limitConstraints(constraints).constrain(PdfPoint.zero); | 65 | + size = _limitConstraints(constraints).smallest; |
| 66 | } | 66 | } |
| 67 | box = PdfRect.fromPoints(PdfPoint.zero, size); | 67 | box = PdfRect.fromPoints(PdfPoint.zero, size); |
| 68 | } | 68 | } |
| @@ -425,8 +425,8 @@ class ConstrainedBox extends SingleChildWidget { | @@ -425,8 +425,8 @@ class ConstrainedBox extends SingleChildWidget { | ||
| 425 | assert(child!.box != null); | 425 | assert(child!.box != null); |
| 426 | box = child!.box; | 426 | box = child!.box; |
| 427 | } else { | 427 | } else { |
| 428 | - box = PdfRect.fromPoints(PdfPoint.zero, | ||
| 429 | - this.constraints.enforce(constraints).constrain(PdfPoint.zero)); | 428 | + box = PdfRect.fromPoints( |
| 429 | + PdfPoint.zero, this.constraints.enforce(constraints).smallest); | ||
| 430 | } | 430 | } |
| 431 | } | 431 | } |
| 432 | 432 |
| @@ -28,10 +28,14 @@ class CircularProgressIndicator extends Widget { | @@ -28,10 +28,14 @@ class CircularProgressIndicator extends Widget { | ||
| 28 | this.strokeWidth = 4.0, | 28 | this.strokeWidth = 4.0, |
| 29 | this.backgroundColor}); | 29 | this.backgroundColor}); |
| 30 | 30 | ||
| 31 | + /// The value of this progress indicator. | ||
| 32 | + /// A value of 0.0 means no progress and 1.0 means that progress is complete. | ||
| 31 | final double value; | 33 | final double value; |
| 32 | 34 | ||
| 35 | + /// The progress indicator's color | ||
| 33 | final PdfColor? color; | 36 | final PdfColor? color; |
| 34 | 37 | ||
| 38 | + /// The progress indicator's background color. | ||
| 35 | final PdfColor? backgroundColor; | 39 | final PdfColor? backgroundColor; |
| 36 | 40 | ||
| 37 | final double strokeWidth; | 41 | final double strokeWidth; |
| @@ -97,3 +101,64 @@ class CircularProgressIndicator extends Widget { | @@ -97,3 +101,64 @@ class CircularProgressIndicator extends Widget { | ||
| 97 | } | 101 | } |
| 98 | } | 102 | } |
| 99 | } | 103 | } |
| 104 | + | ||
| 105 | +/// A material design linear progress indicator, also known as a progress bar. | ||
| 106 | +class LinearProgressIndicator extends Widget { | ||
| 107 | + /// Creates a linear progress indicator. | ||
| 108 | + LinearProgressIndicator({ | ||
| 109 | + required this.value, | ||
| 110 | + this.backgroundColor, | ||
| 111 | + this.valueColor, | ||
| 112 | + this.minHeight, | ||
| 113 | + }); | ||
| 114 | + | ||
| 115 | + /// The progress indicator's background color. | ||
| 116 | + final PdfColor? backgroundColor; | ||
| 117 | + | ||
| 118 | + /// The minimum height of the line used to draw the indicator. | ||
| 119 | + final double? minHeight; | ||
| 120 | + | ||
| 121 | + /// The value of this progress indicator. | ||
| 122 | + /// A value of 0.0 means no progress and 1.0 means that progress is complete. | ||
| 123 | + final double value; | ||
| 124 | + | ||
| 125 | + /// The progress indicator's color | ||
| 126 | + final PdfColor? valueColor; | ||
| 127 | + | ||
| 128 | + @override | ||
| 129 | + void layout(Context context, BoxConstraints constraints, | ||
| 130 | + {bool parentUsesSize = false}) { | ||
| 131 | + box = PdfRect.fromPoints( | ||
| 132 | + PdfPoint.zero, | ||
| 133 | + BoxConstraints( | ||
| 134 | + minWidth: double.infinity, | ||
| 135 | + minHeight: minHeight ?? 4.0, | ||
| 136 | + ).enforce(constraints).smallest, | ||
| 137 | + ); | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + @override | ||
| 141 | + void paint(Context context) { | ||
| 142 | + super.paint(context); | ||
| 143 | + | ||
| 144 | + final vc = value.clamp(0.0, 1.0); | ||
| 145 | + final _valueColor = valueColor ?? PdfColors.blue; | ||
| 146 | + final _backgroundColor = backgroundColor ?? _valueColor.shade(0.1); | ||
| 147 | + | ||
| 148 | + if (vc < 1.0) { | ||
| 149 | + final epsilon = vc == 0 ? 0 : 0.01; | ||
| 150 | + context.canvas | ||
| 151 | + ..drawRect(box!.left + box!.width * vc - epsilon, box!.bottom, | ||
| 152 | + box!.width * (1 - vc) + epsilon, box!.height) | ||
| 153 | + ..setFillColor(_backgroundColor) | ||
| 154 | + ..fillPath(); | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + if (vc > 0.0) { | ||
| 158 | + context.canvas | ||
| 159 | + ..drawRect(box!.left, box!.bottom, box!.width * vc, box!.height) | ||
| 160 | + ..setFillColor(_valueColor) | ||
| 161 | + ..fillPath(); | ||
| 162 | + } | ||
| 163 | + } | ||
| 164 | +} |
-
Please register or login to post a comment