diff --git a/src/ui-carto/ui/index.android.ts b/src/ui-carto/ui/index.android.ts index 00cba247..f8bdcb51 100644 --- a/src/ui-carto/ui/index.android.ts +++ b/src/ui-carto/ui/index.android.ts @@ -55,9 +55,10 @@ export class CartoMap extends CartoViewBase { }; mProjection: IProjection; - get mapView() { - return this.nativeViewProtected; + override get mapView(): com.akylas.carto.additions.AKMapView { + return super.mapView; } + get projection() { return this.mProjection; } @@ -229,42 +230,10 @@ export class CartoMap extends CartoViewBase { this.mapView.getOptions().setRestrictedPanning(value); } - getLayers() { - if (this.mapView) { - return new Layers(this.mapView.getLayers()); - } - return null; - } - addLayer(layer: TileLayer, index?: number) { - if (this.mapView) { - const native: com.carto.layers.TileLayer = layer.getNative(); - if (!!native) { - try { - const layers = this.mapView.getLayers(); - if (index !== undefined && index < layers.count()) { - layers.insert(index, native); - } else { - layers.add(native); - } - } catch (error) { - console.error(error); - } - } - } + createLayersInstance(): Layers { + return new Layers(this.mapView.getLayers()); } - removeLayer(layer: TileLayer) { - if (this.mapView) { - this.mapView.getLayers().remove(layer.getNative()); - } - } - removeAllLayers(layers: TileLayer[]) { - if (this.mapView) { - const vector = new com.carto.layers.LayerVector(); - layers.forEach((l) => vector.add(l.getNative())); - this.mapView.getLayers().removeAll(vector); - } - } clearAllCaches() { this.mapView && this.mapView.clearAllCaches(); } @@ -324,37 +293,35 @@ export class Layers extends BaseLayers { return this.native.count(); } insert(index: number, layer: Layer) { - return this.native.insert(index, layer.getNative()); + super.insert(index, layer); + this.native.insert(index, layer.getNative()); } //@ts-ignore set(index: number, layer: Layer) { - return this.native.set(index, layer.getNative()); - } - removeAll(layers: Layer[]) { - layers.forEach(this.remove); + super.set(index, layer); + this.native.set(index, layer.getNative()); } remove(layer: Layer) { - return this.native.remove(layer.getNative()); + const removed = this.native.remove(layer.getNative()); + if (removed) { + super.remove(layer); + } + return removed; } add(layer: Layer) { - return this.native.add(layer.getNative()); + super.add(layer); + this.native.add(layer.getNative()); } //@ts-ignore get(index: number) { return this.native.get(index); } - addAll(layers: Layer[]) { - layers.forEach(this.add); - } - setAll(layers: Layer[]) { - this.clear(); - this.addAll(layers); - } getAll() { return nativeVectorToArray(this.native.getAll()); } clear() { - return this.native.clear(); + super.clear(); + this.native.clear(); } // public getNative() { diff --git a/src/ui-carto/ui/index.common.ts b/src/ui-carto/ui/index.common.ts index c7d443da..72483e79 100644 --- a/src/ui-carto/ui/index.common.ts +++ b/src/ui-carto/ui/index.common.ts @@ -71,22 +71,64 @@ export function mapProperty(...args) { } export abstract class Layers extends BaseNative { + private readonly mLayerArray: Layer[] = []; + constructor(native) { super(null, native); } + abstract count(): number; - abstract insert(index: number, layer: Layer); - abstract removeAll(layers: Layer[]); - abstract remove(layer: Layer); - abstract add(layer: Layer); + + insert(index: number, layer: Layer) { + this.mLayerArray.splice(index, 0, layer); + } + //@ts-ignore - abstract set(index: number, layer: Layer); + set(index: number, layer: Layer) { + this.mLayerArray[index] = layer; + } + + removeAll(layers: Layer[]): boolean { + let hasRemovedAll: boolean = true; + + layers.forEach((layer) => { + if (!this.remove(layer)) { + if (hasRemovedAll) { + hasRemovedAll = false; + } + } + }); + return hasRemovedAll; + } + + remove(layer: Layer): boolean { + const index = this.mLayerArray.indexOf(layer); + if (index >= 1) { + this.mLayerArray.splice(index, 1); + return true; + } + return false; + } + + add(layer: Layer) { + this.mLayerArray.push(layer); + } + + addAll(layers: Layer[]) { + layers.forEach((layer) => this.add(layer)); + } + setAll(layers: Layer[]) { + this.clear(); + this.addAll(layers); + } + //@ts-ignore abstract get(index: number): Layer; - abstract addAll(layers: Layer[]); - abstract setAll(layers: Layer[]); abstract getAll(): Layer[]; - abstract clear(); + + clear() { + this.mLayerArray.splice(0); + } // public getNative() { // return this.native; @@ -123,6 +165,12 @@ export abstract class CartoViewBase extends ContentView { @mapProperty maxZoom: number; @mapProperty restrictedPanning: boolean; + private mLayers: Layers; + + get mapView() { + return this.nativeViewProtected; + } + public sendEvent(eventName: string, data?: T) { if (this.hasListeners(eventName)) { this.notify({ @@ -140,8 +188,48 @@ export abstract class CartoViewBase extends ContentView { } } + abstract createLayersInstance(); + + getLayers(): Layers { + if (!this.mLayers && this.mapView) { + this.mLayers = this.createLayersInstance(); + } + return this.mLayers; + } + + addLayer(layer: Layer, index?: number) { + const layersInstance = this.getLayers(); + if (layersInstance) { + if (index !== undefined && index <= layersInstance.count()) { + layersInstance.insert(index, layer); + } else { + layersInstance.add(layer); + } + } + } + + removeLayer(layer: Layer) { + const layersInstance = this.getLayers(); + if (layersInstance) { + layersInstance.remove(layer); + } + } + + removeAllLayers(layers: Layer[]) { + const layersInstance = this.getLayers(); + if (layersInstance) { + layersInstance.removeAll(layers); + } + } + disposeNativeView() { this.mapReady = false; + + if (this.mLayers) { + this.mLayers.clear(); + this.mLayers = null; + } + super.disposeNativeView(); } diff --git a/src/ui-carto/ui/index.d.ts b/src/ui-carto/ui/index.d.ts index da642d31..1fab7651 100644 --- a/src/ui-carto/ui/index.d.ts +++ b/src/ui-carto/ui/index.d.ts @@ -2,8 +2,6 @@ import { EventData, ImageSource, Style, View } from '@nativescript/core'; import { ClickType, DefaultLatLonKeys, GenericMapPos, MapBounds, ScreenBounds, ScreenPos } from '../core'; import { Layer } from '../layers'; import { Projection } from '../projections'; -import { Layers } from './index.common'; -export { Layers }; export enum RenderProjectionMode { RENDER_PROJECTION_MODE_PLANAR, @@ -207,6 +205,20 @@ export class MapOptions { isLayersLabelsProcessedInReverseOrder(): boolean; } +export class Layers { + abstract count(): number; + abstract insert(index: number, layer: Layer): void; + abstract removeAll(layers: Layer[]): boolean; + abstract remove(layer: Layer): boolean; + abstract add(layer: Layer): void; + abstract set(index: number, layer: Layer): void; + abstract get(index: number): Layer; + abstract addAll(layers: Layer[]): void; + abstract setAll(layers: Layer[]): void; + abstract getAll(): Layer[]; + abstract clear(): void; +} + interface CartoMapStyle extends Style { zoom: number; focusPos: GenericMapPos; @@ -232,10 +244,12 @@ export class CartoMap extends View { bearing: number; tilt: number; restrictedPanning: boolean; + readonly mapView: any; readonly metersPerPixel: number; addLayer(layer: Layer, index?: number); removeLayer(layer: Layer); + removeAllLayers(layers: Layer[]); getLayers(): Layers; screenToMap(pos: ScreenPos | any): GenericMapPos; mapToScreen(pos: GenericMapPos | any): ScreenPos; diff --git a/src/ui-carto/ui/index.ios.ts b/src/ui-carto/ui/index.ios.ts index d37e69ce..f6691eb8 100644 --- a/src/ui-carto/ui/index.ios.ts +++ b/src/ui-carto/ui/index.ios.ts @@ -146,18 +146,22 @@ class NTRendererCaptureListenerImpl extends AKRendererCaptureListener { } export class CartoMap extends CartoViewBase { static projection = new EPSG4326(); + nativeProjection: NTProjection; mProjection: IProjection; public static setRunOnMainThread(value: boolean) { runOnMainThread = value; } - get mapView() { - return this.nativeViewProtected as AKMapView; + + override get mapView(): AKMapView { + return super.mapView; } + get projection() { return this.mProjection; } + set projection(proj: IProjection) { this.mProjection = proj; this.nativeProjection = this.mProjection.getNative(); @@ -186,7 +190,6 @@ export class CartoMap extends CartoViewBase { disposeNativeView(): void { this.mapView.setMapEventListener(null); - this.mapView.getLayers().clear(); this.nativeProjection = null; this.mProjection = null; super.disposeNativeView(); @@ -259,38 +262,10 @@ export class CartoMap extends CartoViewBase { this.mapView.getOptions().setRestrictedPanning(value); } - getLayers() { - if (this.mapView) { - return new Layers(this.mapView.getLayers()); - } - return null; - } - addLayer(layer: TileLayer, index?: number) { - if (this.mapView) { - const native: NTTileLayer = layer.getNative(); - if (!!native) { - const layers = this.mapView.getLayers(); - if (index !== undefined && index <= layers.count()) { - layers.insertLayer(index, native); - } else { - layers.add(native); - } - } - } + createLayersInstance(): Layers { + return new Layers(this.mapView.getLayers()); } - removeLayer(layer: TileLayer) { - if (this.mapView) { - this.mapView.getLayers().remove(layer.getNative()); - } - } - removeAllLayers(layers: TileLayer[]) { - if (this.mapView) { - const vector = NTLayerVector.alloc().init(); - layers.forEach((l) => vector.add(l.getNative())); - this.mapView.getLayers().removeAll(vector); - } - } clearAllCaches() { this.mapView && this.mapView.clearAllCaches(); } @@ -341,36 +316,39 @@ export class Layers extends BaseLayers { return this.native.count(); } insert(index: number, layer: Layer) { - return this.native.insertLayer(index, layer.getNative()); + super.insert(index, layer); + this.native.insertLayer(index, layer.getNative()); } //@ts-ignore set(index: number, layer: Layer) { - return this.native.setLayer(index, layer.getNative()); - } - removeAll(layers: Layer[]) { - layers.forEach(this.remove); + super.set(index, layer); + this.native.setLayer(index, layer.getNative()); } + remove(layer: Layer) { - return this.native.remove(layer.getNative()); + const removed = this.native.remove(layer.getNative()); + if (removed) { + super.remove(layer); + } + return removed; } add(layer: Layer) { - return this.native.add(layer.getNative()); + super.add(layer); + this.native.add(layer.getNative()); } //@ts-ignore get(index: number) { return this.native.get(index); } - addAll(layers: Layer[]) { - layers.forEach(this.add); - } - setAll(layers: Layer[]) { - this.clear(); - this.addAll(layers); - } getAll() { return nativeVectorToArray(this.native.getAll()); } clear() { - return this.native.clear(); + super.clear(); + this.native.clear(); } + + // public getNative() { + // return this.native; + // } }