blob: 9d607e9bbc6ae3f0af8346cf560966f937e4fc46 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of google_maps_flutter_web;
/// The `MarkerController` class wraps a [gmaps.Marker], how it handles events, and its associated (optional) [gmaps.InfoWindow] widget.
class MarkerController {
/// Creates a `MarkerController`, which wraps a [gmaps.Marker] object, its `onTap`/`onDrag` behavior, and its associated [gmaps.InfoWindow].
MarkerController({
required gmaps.Marker marker,
gmaps.InfoWindow? infoWindow,
bool consumeTapEvents = false,
LatLngCallback? onDragStart,
LatLngCallback? onDrag,
LatLngCallback? onDragEnd,
ui.VoidCallback? onTap,
}) : _marker = marker,
_infoWindow = infoWindow,
_consumeTapEvents = consumeTapEvents {
if (onTap != null) {
marker.onClick.listen((gmaps.MapMouseEvent event) {
onTap.call();
});
}
if (onDragStart != null) {
marker.onDragstart.listen((gmaps.MapMouseEvent event) {
if (marker != null) {
marker.position = event.latLng;
}
onDragStart.call(event.latLng ?? _nullGmapsLatLng);
});
}
if (onDrag != null) {
marker.onDrag.listen((gmaps.MapMouseEvent event) {
if (marker != null) {
marker.position = event.latLng;
}
onDrag.call(event.latLng ?? _nullGmapsLatLng);
});
}
if (onDragEnd != null) {
marker.onDragend.listen((gmaps.MapMouseEvent event) {
if (marker != null) {
marker.position = event.latLng;
}
onDragEnd.call(event.latLng ?? _nullGmapsLatLng);
});
}
}
gmaps.Marker? _marker;
final bool _consumeTapEvents;
final gmaps.InfoWindow? _infoWindow;
bool _infoWindowShown = false;
/// Returns `true` if this Controller will use its own `onTap` handler to consume events.
bool get consumeTapEvents => _consumeTapEvents;
/// Returns `true` if the [gmaps.InfoWindow] associated to this marker is being shown.
bool get infoWindowShown => _infoWindowShown;
/// Returns the [gmaps.Marker] associated to this controller.
gmaps.Marker? get marker => _marker;
/// Returns the [gmaps.InfoWindow] associated to the marker.
@visibleForTesting
gmaps.InfoWindow? get infoWindow => _infoWindow;
/// Updates the options of the wrapped [gmaps.Marker] object.
///
/// This cannot be called after [remove].
void update(
gmaps.MarkerOptions options, {
HtmlElement? newInfoWindowContent,
}) {
assert(_marker != null, 'Cannot `update` Marker after calling `remove`.');
_marker!.options = options;
if (_infoWindow != null && newInfoWindowContent != null) {
_infoWindow!.content = newInfoWindowContent;
}
}
/// Disposes of the currently wrapped [gmaps.Marker].
void remove() {
if (_marker != null) {
_infoWindowShown = false;
_marker!.visible = false;
_marker!.map = null;
_marker = null;
}
}
/// Hide the associated [gmaps.InfoWindow].
///
/// This cannot be called after [remove].
void hideInfoWindow() {
assert(_marker != null, 'Cannot `hideInfoWindow` on a `remove`d Marker.');
if (_infoWindow != null) {
_infoWindow!.close();
_infoWindowShown = false;
}
}
/// Show the associated [gmaps.InfoWindow].
///
/// This cannot be called after [remove].
void showInfoWindow() {
assert(_marker != null, 'Cannot `showInfoWindow` on a `remove`d Marker.');
if (_infoWindow != null) {
_infoWindow!.open(_marker!.map, _marker);
_infoWindowShown = true;
}
}
}