/** * ng2-gm - Angular 2 components for Google Maps * @version v0.0.2 * @link https://github.com/williampaulo/angular2-google-maps#readme * @license MIT */ import {Injectable, NgZone} from '@angular/core'; import {Observable} from 'rxjs/Observable'; import {Observer} from 'rxjs/Observer'; import {SebmGoogleMapMarker} from '../directives/google-map-marker'; import {GoogleMapsAPIWrapper} from './google-maps-api-wrapper'; import {Marker} from './google-maps-types'; @Injectable() export class MarkerManager { private _markers: Map> = new Map>(); constructor(private _mapsWrapper: GoogleMapsAPIWrapper, private _zone: NgZone) {} deleteMarker(marker: SebmGoogleMapMarker): Promise { 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: SebmGoogleMapMarker): Promise { return this._markers.get(marker).then( (m: Marker) => m.setPosition({lat: marker.latitude, lng: marker.longitude})); } updateTitle(marker: SebmGoogleMapMarker): Promise { return this._markers.get(marker).then((m: Marker) => m.setTitle(marker.title)); } updateLabel(marker: SebmGoogleMapMarker): Promise { return this._markers.get(marker).then((m: Marker) => { m.setLabel(marker.label); }); } updateDraggable(marker: SebmGoogleMapMarker): Promise { return this._markers.get(marker).then((m: Marker) => m.setDraggable(marker.draggable)); } updateIcon(marker: SebmGoogleMapMarker): Promise { return this._markers.get(marker).then((m: Marker) => m.setIcon(marker.iconUrl)); } addMarker(marker: SebmGoogleMapMarker) { const markerPromise = this._mapsWrapper.createMarker({ position: {lat: marker.latitude, lng: marker.longitude}, label: marker.label, draggable: marker.draggable, icon: marker.iconUrl }); this._markers.set(marker, markerPromise); } getNativeMarker(marker: SebmGoogleMapMarker): Promise { return this._markers.get(marker); } createEventObservable(eventName: string, marker: SebmGoogleMapMarker): Observable { return Observable.create((observer: Observer) => { this._markers.get(marker).then((m: Marker) => { m.addListener(eventName, (e: T) => this._zone.run(() => observer.next(e))); }); }); } }