blob: 30db477ee5f43c9912f88d92961683094ca55e63 [file] [log] [blame]
// Copyright 2017 The Chromium 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 {
gmaps.Marker _marker;
final bool _consumeTapEvents;
final gmaps.InfoWindow _infoWindow;
bool _infoWindowShown = false;
/// 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 onDragEnd,
ui.VoidCallback onTap,
}) : _marker = marker,
_infoWindow = infoWindow,
_consumeTapEvents = consumeTapEvents {
if (onTap != null) {
_marker.onClick.listen((event) {
onTap.call();
});
}
if (onDragEnd != null) {
_marker.onDragend.listen((event) {
_marker.position = event.latLng;
onDragEnd.call(event.latLng);
});
}
}
/// 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.
void update(
gmaps.MarkerOptions options, {
String newInfoWindowContent,
}) {
_marker.options = options;
if (_infoWindow != null && newInfoWindowContent != null) {
_infoWindow.content = newInfoWindowContent;
}
}
/// Disposes of the currently wrapped [gmaps.Marker].
void remove() {
_marker.visible = false;
_marker.map = null;
_marker = null;
}
/// Hide the associated [gmaps.InfoWindow].
void hideInfoWindow() {
if (_infoWindow != null) {
_infoWindow.close();
_infoWindowShown = false;
}
}
/// Show the associated [gmaps.InfoWindow].
void showInfoWindow() {
if (_infoWindow != null) {
_infoWindow.open(_marker.map, _marker);
_infoWindowShown = true;
}
}
}