Showing
3 changed files
with
51 additions
and
7 deletions
| @@ -700,4 +700,9 @@ class PdfGraphics { | @@ -700,4 +700,9 @@ class PdfGraphics { | ||
| 700 | PdfNum(limit).output(buf); | 700 | PdfNum(limit).output(buf); |
| 701 | buf.putString(' M\n'); | 701 | buf.putString(' M\n'); |
| 702 | } | 702 | } |
| 703 | + | ||
| 704 | + void setLineDashPattern([List<int> array = const <int>[], int phase = 0]) { | ||
| 705 | + PdfArray.fromNum(array).output(buf); | ||
| 706 | + buf.putString(' $phase d\n'); | ||
| 707 | + } | ||
| 703 | } | 708 | } |
| @@ -20,24 +20,30 @@ part of widget; | @@ -20,24 +20,30 @@ part of widget; | ||
| 20 | 20 | ||
| 21 | enum DecorationPosition { background, foreground } | 21 | enum DecorationPosition { background, foreground } |
| 22 | 22 | ||
| 23 | +enum BorderStyle { none, solid, dashed, dotted } | ||
| 24 | + | ||
| 23 | @immutable | 25 | @immutable |
| 24 | class BoxBorder { | 26 | class BoxBorder { |
| 25 | - const BoxBorder( | ||
| 26 | - {this.left = false, | 27 | + const BoxBorder({ |
| 28 | + this.left = false, | ||
| 27 | this.top = false, | 29 | this.top = false, |
| 28 | this.right = false, | 30 | this.right = false, |
| 29 | this.bottom = false, | 31 | this.bottom = false, |
| 30 | this.color = PdfColors.black, | 32 | this.color = PdfColors.black, |
| 31 | - this.width = 1.0}) | ||
| 32 | - : assert(color != null), | 33 | + this.width = 1.0, |
| 34 | + this.style = BorderStyle.solid, | ||
| 35 | + }) : assert(color != null), | ||
| 33 | assert(width != null), | 36 | assert(width != null), |
| 34 | - assert(width >= 0.0); | 37 | + assert(width >= 0.0), |
| 38 | + assert(style != null); | ||
| 35 | 39 | ||
| 36 | final bool top; | 40 | final bool top; |
| 37 | final bool bottom; | 41 | final bool bottom; |
| 38 | final bool left; | 42 | final bool left; |
| 39 | final bool right; | 43 | final bool right; |
| 40 | 44 | ||
| 45 | + final BorderStyle style; | ||
| 46 | + | ||
| 41 | /// The color of the | 47 | /// The color of the |
| 42 | final PdfColor color; | 48 | final PdfColor color; |
| 43 | 49 | ||
| @@ -50,7 +56,27 @@ class BoxBorder { | @@ -50,7 +56,27 @@ class BoxBorder { | ||
| 50 | assert(box.width != null); | 56 | assert(box.width != null); |
| 51 | assert(box.height != null); | 57 | assert(box.height != null); |
| 52 | 58 | ||
| 53 | - if (top || bottom || left || right) { | 59 | + if (!(top || bottom || left || right)) { |
| 60 | + return; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + switch (style) { | ||
| 64 | + case BorderStyle.none: | ||
| 65 | + return; | ||
| 66 | + case BorderStyle.solid: | ||
| 67 | + break; | ||
| 68 | + case BorderStyle.dashed: | ||
| 69 | + context.canvas | ||
| 70 | + ..saveContext() | ||
| 71 | + ..setLineDashPattern(const <int>[3, 3]); | ||
| 72 | + break; | ||
| 73 | + case BorderStyle.dotted: | ||
| 74 | + context.canvas | ||
| 75 | + ..saveContext() | ||
| 76 | + ..setLineDashPattern(const <int>[1, 1]); | ||
| 77 | + break; | ||
| 78 | + } | ||
| 79 | + | ||
| 54 | context.canvas | 80 | context.canvas |
| 55 | ..setStrokeColor(color) | 81 | ..setStrokeColor(color) |
| 56 | ..setLineWidth(width); | 82 | ..setLineWidth(width); |
| @@ -85,6 +111,8 @@ class BoxBorder { | @@ -85,6 +111,8 @@ class BoxBorder { | ||
| 85 | } | 111 | } |
| 86 | 112 | ||
| 87 | context.canvas.strokePath(); | 113 | context.canvas.strokePath(); |
| 114 | + if (style != BorderStyle.solid) { | ||
| 115 | + context.canvas.restoreContext(); | ||
| 88 | } | 116 | } |
| 89 | } | 117 | } |
| 90 | 118 | ||
| @@ -349,6 +377,8 @@ class RadialGradient extends Gradient { | @@ -349,6 +377,8 @@ class RadialGradient extends Gradient { | ||
| 349 | 377 | ||
| 350 | enum BoxShape { circle, rectangle } | 378 | enum BoxShape { circle, rectangle } |
| 351 | 379 | ||
| 380 | +enum PaintPhase { all, background, foreground } | ||
| 381 | + | ||
| 352 | @immutable | 382 | @immutable |
| 353 | class BoxDecoration { | 383 | class BoxDecoration { |
| 354 | const BoxDecoration( | 384 | const BoxDecoration( |
| @@ -368,12 +398,17 @@ class BoxDecoration { | @@ -368,12 +398,17 @@ class BoxDecoration { | ||
| 368 | final DecorationImage image; | 398 | final DecorationImage image; |
| 369 | final Gradient gradient; | 399 | final Gradient gradient; |
| 370 | 400 | ||
| 371 | - void paint(Context context, PdfRect box) { | 401 | + void paint( |
| 402 | + Context context, | ||
| 403 | + PdfRect box, [ | ||
| 404 | + PaintPhase phase = PaintPhase.all, | ||
| 405 | + ]) { | ||
| 372 | assert(box.x != null); | 406 | assert(box.x != null); |
| 373 | assert(box.y != null); | 407 | assert(box.y != null); |
| 374 | assert(box.width != null); | 408 | assert(box.width != null); |
| 375 | assert(box.height != null); | 409 | assert(box.height != null); |
| 376 | 410 | ||
| 411 | + if (phase == PaintPhase.all || phase == PaintPhase.background) { | ||
| 377 | if (color != null) { | 412 | if (color != null) { |
| 378 | switch (shape) { | 413 | switch (shape) { |
| 379 | case BoxShape.rectangle: | 414 | case BoxShape.rectangle: |
| @@ -435,7 +470,9 @@ class BoxDecoration { | @@ -435,7 +470,9 @@ class BoxDecoration { | ||
| 435 | image.paint(context, box); | 470 | image.paint(context, box); |
| 436 | context.canvas.restoreContext(); | 471 | context.canvas.restoreContext(); |
| 437 | } | 472 | } |
| 473 | + } | ||
| 438 | 474 | ||
| 475 | + if (phase == PaintPhase.all || phase == PaintPhase.foreground) { | ||
| 439 | if (border != null) { | 476 | if (border != null) { |
| 440 | switch (shape) { | 477 | switch (shape) { |
| 441 | case BoxShape.circle: | 478 | case BoxShape.circle: |
| @@ -451,4 +488,5 @@ class BoxDecoration { | @@ -451,4 +488,5 @@ class BoxDecoration { | ||
| 451 | } | 488 | } |
| 452 | } | 489 | } |
| 453 | } | 490 | } |
| 491 | + } | ||
| 454 | } | 492 | } |
-
Please register or login to post a comment