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