-
Notifications
You must be signed in to change notification settings - Fork 817
/
Copy pathmarker-manager.ts
94 lines (77 loc) · 3.01 KB
/
marker-manager.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import {Injectable, NgZone} from '@angular/core';
import {Observable} from 'rxjs/Observable';
import {Observer} from 'rxjs/Observer';
import {AgmMarker} from './../../directives/marker';
import {GoogleMapsAPIWrapper} from './../google-maps-api-wrapper';
import {Marker} from './../google-maps-types';
@Injectable()
export class MarkerManager {
protected _markers: Map<AgmMarker, Promise<Marker>> =
new Map<AgmMarker, Promise<Marker>>();
constructor(protected _mapsWrapper: GoogleMapsAPIWrapper, protected _zone: NgZone) {}
deleteMarker(marker: AgmMarker): Promise<void> {
const m = this._markers.get(marker);
if (m == null) {
// marker already deleted
return Promise.resolve();
}
return m.then((m: Marker) => {
return this._zone.run(() => {
m.setMap(null);
this._markers.delete(marker);
});
});
}
updateMarkerPosition(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then(
(m: Marker) => m.setPosition({lat: marker.latitude, lng: marker.longitude}));
}
updateTitle(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setTitle(marker.title));
}
updateLabel(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => { m.setLabel(marker.label); });
}
updateDraggable(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setDraggable(marker.draggable));
}
updateIcon(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setIcon(marker.iconUrl));
}
updateOpacity(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setOpacity(marker.opacity));
}
updateVisible(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setVisible(marker.visible));
}
updateZIndex(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setZIndex(marker.zIndex));
}
updateClickable(marker: AgmMarker): Promise<void> {
return this._markers.get(marker).then((m: Marker) => m.setClickable(marker.clickable));
}
addMarker(marker: AgmMarker) {
const markerPromise = this._mapsWrapper.createMarker({
position: {lat: marker.latitude, lng: marker.longitude},
label: marker.label,
draggable: marker.draggable,
icon: marker.iconUrl,
opacity: marker.opacity,
visible: marker.visible,
zIndex: marker.zIndex,
title: marker.title,
clickable: marker.clickable
});
this._markers.set(marker, markerPromise);
}
getNativeMarker(marker: AgmMarker): Promise<Marker> {
return this._markers.get(marker);
}
createEventObservable<T>(eventName: string, marker: AgmMarker): Observable<T> {
return Observable.create((observer: Observer<T>) => {
this._markers.get(marker).then((m: Marker) => {
m.addListener(eventName, (e: T) => this._zone.run(() => observer.next(e)));
});
});
}
}