Skip to content

Commit 6ad8444

Browse files
authored
feat: add minZoom, maxZoom (#374)
- #371
1 parent 0c7ceb7 commit 6ad8444

19 files changed

+76
-14
lines changed

lib/src/layer/circle_layer.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class CircleLayer extends Layer<Feature<Point>> {
1313
this.blur = 0,
1414
this.strokeWidth = 0,
1515
this.strokeColor = const Color(0xFF000000),
16+
super.minZoom = 0,
17+
super.maxZoom = 24,
1618
}) : super._(list: points);
1719

1820
/// Circle radius in pixels. Defaults to 5px.
@@ -43,6 +45,8 @@ class CircleLayer extends Layer<Feature<Point>> {
4345
sourceId: getSourceId(index),
4446
paint: getPaint(),
4547
layout: getLayout(),
48+
minZoom: minZoom,
49+
maxZoom: maxZoom,
4650
);
4751

4852
@override

lib/src/layer/layer.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@ part 'polyline_layer.dart';
1515
/// {@category Layers}
1616
@immutable
1717
sealed class Layer<G extends Feature<Geometry>> {
18-
const Layer._({required this.list});
18+
const Layer._({required this.list, this.minZoom = 0, this.maxZoom = 24});
1919

20-
/// The [List] of layers.
20+
/// The [List] of geometry features.
2121
final List<G> list;
2222

23+
/// The minimum zoom level that the [Layer] is displayed.
24+
final double minZoom;
25+
26+
/// The maximum zoom level that the [Layer] is displayed.
27+
final double maxZoom;
28+
2329
/// Get a unique source id.
2430
String getSourceId(int index) => 'maplibre-source-$index';
2531

@@ -38,8 +44,12 @@ sealed class Layer<G extends Feature<Geometry>> {
3844
@override
3945
bool operator ==(Object other) =>
4046
identical(this, other) ||
41-
other is Layer && runtimeType == other.runtimeType && list == other.list;
47+
other is Layer &&
48+
runtimeType == other.runtimeType &&
49+
list == other.list &&
50+
minZoom == other.minZoom &&
51+
maxZoom == other.maxZoom;
4252

4353
@override
44-
int get hashCode => list.hashCode;
54+
int get hashCode => Object.hash(minZoom, maxZoom, list);
4555
}

lib/src/layer/marker_layer.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class MarkerLayer extends Layer<Feature<Point>> {
4545
this.textHaloBlur = 0,
4646
this.textTranslate = const [0, 0],
4747
this.iconAnchor = IconAnchor.center,
48+
super.minZoom = 0,
49+
super.maxZoom = 24,
4850
}) : super._(list: points);
4951

5052
/// If true, the icon will be visible even if it collides with other
@@ -236,6 +238,8 @@ class MarkerLayer extends Layer<Feature<Point>> {
236238
sourceId: getSourceId(index),
237239
paint: getPaint(),
238240
layout: getLayout(),
241+
minZoom: minZoom,
242+
maxZoom: maxZoom,
239243
);
240244

241245
@override

lib/src/layer/polygon_layer.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ class PolygonLayer extends Layer<Feature<Polygon>> {
1010
required List<Feature<Polygon>> polygons,
1111
this.color = const Color(0xFF000000),
1212
this.outlineColor = const Color(0xFF000000),
13+
super.minZoom = 0,
14+
super.maxZoom = 24,
1315
}) : super._(list: polygons);
1416

1517
/// The color of the polygon. Defaults to black.
@@ -37,6 +39,8 @@ class PolygonLayer extends Layer<Feature<Polygon>> {
3739
sourceId: getSourceId(index),
3840
paint: getPaint(),
3941
layout: getLayout(),
42+
minZoom: minZoom,
43+
maxZoom: maxZoom,
4044
);
4145

4246
@override

lib/src/layer/polyline_layer.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class PolylineLayer extends Layer<Feature<LineString>> {
1313
this.gapWidth = 0,
1414
this.blur = 0,
1515
this.dashArray,
16+
super.minZoom = 0,
17+
super.maxZoom = 24,
1618
}) : super._(list: polylines);
1719

1820
/// The color of the polyline. Defaults to black
@@ -52,6 +54,8 @@ class PolylineLayer extends Layer<Feature<LineString>> {
5254
sourceId: getSourceId(index),
5355
paint: getPaint(),
5456
layout: getLayout(),
57+
minZoom: minZoom,
58+
maxZoom: maxZoom,
5559
);
5660

5761
@override

lib/src/platform/android/style_controller.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class StyleControllerAndroid implements StyleController {
4848
'The Layer is not supported: ${layer.runtimeType}',
4949
),
5050
};
51+
jLayer.setMinZoom(layer.minZoom);
52+
jLayer.setMaxZoom(layer.maxZoom);
5153

5254
// paint and layout properties
5355
final layoutEntries = layer.layout.entries.toList(growable: false);

lib/src/platform/ios/style_controller.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,10 @@ class StyleControllerIos implements StyleController {
7373
'The Layer is not supported: ${layer.runtimeType}',
7474
);
7575
}
76+
ffiStyleLayer.minimumZoomLevel = layer.minZoom;
77+
ffiStyleLayer.maximumZoomLevel = layer.maxZoom;
7678
ffiStyleLayer.setProperties(layer.paint);
7779
ffiStyleLayer.setProperties(layer.layout);
78-
if (layer.minZoom case final double minZoom) {
79-
ffiStyleLayer.minimumZoomLevel = minZoom;
80-
}
81-
if (layer.maxZoom case final double maxZoom) {
82-
ffiStyleLayer.maximumZoomLevel = maxZoom;
83-
}
8480
_ffiStyle.addLayer(ffiStyleLayer);
8581
}
8682

lib/src/platform/web/interop/map.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,8 @@ extension type LayerSpecification._(JSObject _) implements JSObject {
221221
required String? source,
222222
required JSAny layout,
223223
required JSAny paint,
224+
required double? minzoom,
225+
required double? maxzoom,
224226
});
225227

226228
/// Get the layer id.

lib/src/platform/web/style_controller.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class StyleControllerWeb implements StyleController {
8080
source: layer.sourceId,
8181
layout: layer.layout.jsify()!,
8282
paint: layer.paint.jsify()!,
83+
minzoom: layer.minZoom,
84+
maxzoom: layer.maxZoom,
8385
),
8486
belowLayerId,
8587
);
@@ -91,6 +93,8 @@ class StyleControllerWeb implements StyleController {
9193
source: layer.sourceId,
9294
layout: layer.layout.jsify()!,
9395
paint: layer.paint.jsify()!,
96+
minzoom: layer.minZoom,
97+
maxzoom: layer.maxZoom,
9498
),
9599
belowLayerId,
96100
);
@@ -102,6 +106,8 @@ class StyleControllerWeb implements StyleController {
102106
source: null,
103107
layout: layer.layout.jsify()!,
104108
paint: layer.paint.jsify()!,
109+
minzoom: layer.minZoom,
110+
maxzoom: layer.maxZoom,
105111
),
106112
belowLayerId,
107113
);
@@ -113,6 +119,8 @@ class StyleControllerWeb implements StyleController {
113119
source: layer.sourceId,
114120
layout: layer.layout.jsify()!,
115121
paint: layer.paint.jsify()!,
122+
minzoom: layer.minZoom,
123+
maxzoom: layer.maxZoom,
116124
),
117125
belowLayerId,
118126
);
@@ -124,6 +132,8 @@ class StyleControllerWeb implements StyleController {
124132
source: layer.sourceId,
125133
layout: layer.layout.jsify()!,
126134
paint: layer.paint.jsify()!,
135+
minzoom: layer.minZoom,
136+
maxzoom: layer.maxZoom,
127137
),
128138
belowLayerId,
129139
);
@@ -135,6 +145,8 @@ class StyleControllerWeb implements StyleController {
135145
source: layer.sourceId,
136146
layout: layer.layout.jsify()!,
137147
paint: layer.paint.jsify()!,
148+
minzoom: layer.minZoom,
149+
maxzoom: layer.maxZoom,
138150
),
139151
belowLayerId,
140152
);
@@ -146,6 +158,8 @@ class StyleControllerWeb implements StyleController {
146158
source: layer.sourceId,
147159
layout: layer.layout.jsify()!,
148160
paint: layer.paint.jsify()!,
161+
minzoom: layer.minZoom,
162+
maxzoom: layer.maxZoom,
149163
),
150164
belowLayerId,
151165
);
@@ -157,6 +171,8 @@ class StyleControllerWeb implements StyleController {
157171
source: layer.sourceId,
158172
layout: layer.layout.jsify()!,
159173
paint: layer.paint.jsify()!,
174+
minzoom: layer.minZoom,
175+
maxzoom: layer.maxZoom,
160176
),
161177
belowLayerId,
162178
);
@@ -168,6 +184,8 @@ class StyleControllerWeb implements StyleController {
168184
source: layer.sourceId,
169185
layout: layer.layout.jsify()!,
170186
paint: layer.paint.jsify()!,
187+
minzoom: layer.minZoom,
188+
maxzoom: layer.maxZoom,
171189
),
172190
belowLayerId,
173191
);

lib/src/style/layers/background_style_layer.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ final class BackgroundStyleLayer extends StyleLayer {
1515
this.opacity = 1,
1616
super.layout,
1717
super.paint,
18+
super.minZoom = 0,
19+
super.maxZoom = 24,
1820
});
1921

2022
/// Whether this layer is displayed.

0 commit comments

Comments
 (0)