@@ -5,55 +5,47 @@ import 'package:flutter/material.dart';
5
5
import 'package:flutter_map/plugin_api.dart' ;
6
6
import 'package:polylabel/polylabel.dart' ;
7
7
8
- @immutable
9
- class Label {
10
- final List <Offset > points;
11
- final String ? labelText;
12
- final TextStyle ? labelStyle;
13
- final double rotationRad;
14
- final bool rotate;
15
- final PolygonLabelPlacement labelPlacement;
8
+ void Function (Canvas canvas)? buildLabelTextPainter ({
9
+ required String labelText,
10
+ required List <Offset > points,
11
+ required double rotationRad,
12
+ bool rotate = false ,
13
+ TextStyle ? labelStyle,
14
+ PolygonLabelPlacement labelPlacement = PolygonLabelPlacement .polylabel,
15
+ double padding = 0 ,
16
+ }) {
17
+ final placementPoint = switch (labelPlacement) {
18
+ PolygonLabelPlacement .centroid => _computeCentroid (points),
19
+ PolygonLabelPlacement .polylabel => _computePolylabel (points),
20
+ };
16
21
17
- const Label ({
18
- required this .points,
19
- this .labelText,
20
- this .labelStyle,
21
- required this .rotationRad,
22
- this .rotate = false ,
23
- this .labelPlacement = PolygonLabelPlacement .polylabel,
24
- });
25
-
26
- void paintText (Canvas canvas) {
27
- final placementPoint = switch (labelPlacement) {
28
- PolygonLabelPlacement .centroid => _computeCentroid (points),
29
- PolygonLabelPlacement .polylabel => _computePolylabel (points),
30
- };
31
-
32
- var dx = placementPoint.dx;
33
- var dy = placementPoint.dy;
22
+ var dx = placementPoint.dx;
23
+ var dy = placementPoint.dy;
34
24
25
+ if (dx > 0 ) {
35
26
final textSpan = TextSpan (text: labelText, style: labelStyle);
36
27
final textPainter = TextPainter (
37
28
text: textSpan,
38
29
textAlign: TextAlign .center,
39
30
textDirection: TextDirection .ltr,
40
31
maxLines: 1 ,
41
32
);
42
- if (dx > 0 ) {
43
- textPainter.layout ();
44
- dx -= textPainter.width / 2 ;
45
- dy -= textPainter.height / 2 ;
46
33
47
- var maxDx = 0.0 ;
48
- var minDx = double .infinity;
49
- for (final point in points) {
50
- maxDx = math.max (maxDx, point.dx);
51
- minDx = math.min (minDx, point.dx);
52
- }
34
+ textPainter.layout ();
35
+ dx -= textPainter.width / 2 ;
36
+ dy -= textPainter.height / 2 ;
37
+
38
+ var maxDx = 0.0 ;
39
+ var minDx = double .infinity;
40
+ for (final point in points) {
41
+ maxDx = math.max (maxDx, point.dx);
42
+ minDx = math.min (minDx, point.dx);
43
+ }
53
44
54
- if (maxDx - minDx > textPainter.width) {
55
- canvas. save ();
45
+ if (maxDx - minDx - padding > textPainter.width) {
46
+ return (canvas) {
56
47
if (rotate) {
48
+ canvas.save ();
57
49
canvas.translate (placementPoint.dx, placementPoint.dy);
58
50
canvas.rotate (- rotationRad);
59
51
canvas.translate (- placementPoint.dx, - placementPoint.dy);
@@ -62,22 +54,26 @@ class Label {
62
54
canvas,
63
55
Offset (dx, dy),
64
56
);
65
- canvas.restore ();
66
- }
57
+ if (rotate) {
58
+ canvas.restore ();
59
+ }
60
+ };
67
61
}
68
62
}
63
+ return null ;
64
+ }
69
65
70
- Offset _computeCentroid (List <Offset > points) {
71
- return Offset (
72
- points.map ((e) => e.dx). toList ( ).average,
73
- points.map ((e) => e.dy). toList ( ).average,
74
- );
75
- }
66
+ Offset _computeCentroid (List <Offset > points) {
67
+ return Offset (
68
+ points.map ((e) => e.dx).average,
69
+ points.map ((e) => e.dy).average,
70
+ );
71
+ }
76
72
77
- Offset _computePolylabel (List <Offset > points) {
78
- final labelPosition = polylabel ([
79
- points. map ((p) => math.Point (p.dx, p.dy)). toList (),
80
- ]);
81
- return labelPosition.point. toOffset ( );
82
- }
73
+ Offset _computePolylabel (List <Offset > points) {
74
+ final labelPosition = polylabel ([
75
+ List < math.Point >. generate (
76
+ points.length, (i) => math. Point (points[i].dx, points[i].dy)),
77
+ ] );
78
+ return labelPosition.point. toOffset ();
83
79
}
0 commit comments