From 4129f9a4a350f236bd4ad6e4f3c5534667b7942e Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Thu, 8 May 2025 14:35:32 +0300 Subject: [PATCH 1/3] fix: added missing js reference for map layers --- src/ui-carto/ui/index.android.ts | 56 ++++--------------- src/ui-carto/ui/index.common.ts | 95 +++++++++++++++++++++++++++++--- src/ui-carto/ui/index.d.ts | 1 + src/ui-carto/ui/index.ios.ts | 61 ++++++-------------- 4 files changed, 115 insertions(+), 98 deletions(-) diff --git a/src/ui-carto/ui/index.android.ts b/src/ui-carto/ui/index.android.ts index 00cba247..3c1241ed 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,36 +293,31 @@ export class Layers extends BaseLayers { return this.native.count(); } insert(index: number, layer: Layer) { + super.insert(index, layer); return this.native.insert(index, layer.getNative()); } //@ts-ignore set(index: number, layer: Layer) { + super.set(index, layer); return this.native.set(index, layer.getNative()); } - removeAll(layers: Layer[]) { - layers.forEach(this.remove); - } remove(layer: Layer) { + super.remove(layer); return this.native.remove(layer.getNative()); } add(layer: Layer) { + super.add(layer); return 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() { + super.clear(); return this.native.clear(); } diff --git a/src/ui-carto/ui/index.common.ts b/src/ui-carto/ui/index.common.ts index c7d443da..34420e73 100644 --- a/src/ui-carto/ui/index.common.ts +++ b/src/ui-carto/ui/index.common.ts @@ -2,7 +2,7 @@ import { CSSType, ContentView } from '@nativescript/core'; import { BaseNative } from '../BaseNative'; import { LatitudeKey, MapPos, fromNativeMapPos } from '../core'; -import { Layer } from '../layers'; +import { Layer, TileLayer } from '../layers'; import { bearingProperty, focusPosProperty, tiltProperty, zoomProperty } from './cssproperties'; import { MapInfo } from '.'; @@ -71,22 +71,53 @@ 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[]) { + layers.forEach((layer) => this.remove(layer)); + } + + remove(layer: Layer) { + const index = this.mLayerArray.indexOf(layer); + if (index >= 1) { + this.mLayerArray.splice(index, 1); + } + } + + 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 +154,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 +177,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: TileLayer, index?: number) { + const layersInstance = this.getLayers(); + if (layersInstance) { + if (index !== undefined && index <= layersInstance.count()) { + layersInstance.insert(index, layer); + } else { + layersInstance.add(layer); + } + } + } + + removeLayer(layer: TileLayer) { + const layersInstance = this.getLayers(); + if (layersInstance) { + layersInstance.remove(layer); + } + } + + removeAllLayers(layers: TileLayer[]) { + 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..68334422 100644 --- a/src/ui-carto/ui/index.d.ts +++ b/src/ui-carto/ui/index.d.ts @@ -232,6 +232,7 @@ export class CartoMap extends View { bearing: number; tilt: number; restrictedPanning: boolean; + readonly mapView: any; readonly metersPerPixel: number; addLayer(layer: Layer, index?: number); diff --git a/src/ui-carto/ui/index.ios.ts b/src/ui-carto/ui/index.ios.ts index d37e69ce..71c3f477 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,36 @@ export class Layers extends BaseLayers { return this.native.count(); } insert(index: number, layer: Layer) { + super.insert(index, layer); return this.native.insertLayer(index, layer.getNative()); } //@ts-ignore set(index: number, layer: Layer) { + super.set(index, layer); return this.native.setLayer(index, layer.getNative()); } - removeAll(layers: Layer[]) { - layers.forEach(this.remove); - } + remove(layer: Layer) { + super.remove(layer); return this.native.remove(layer.getNative()); } add(layer: Layer) { + super.add(layer); return 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() { + super.clear(); return this.native.clear(); } + + // public getNative() { + // return this.native; + // } } From 3b1fee708f6499fda7c86a0353904e0524042099 Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Thu, 8 May 2025 15:42:51 +0300 Subject: [PATCH 2/3] chore: corrected types --- src/ui-carto/ui/index.android.ts | 8 ++++---- src/ui-carto/ui/index.common.ts | 24 +++++++++++++++++------- src/ui-carto/ui/index.d.ts | 17 +++++++++++++++-- src/ui-carto/ui/index.ios.ts | 8 ++++---- 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/ui-carto/ui/index.android.ts b/src/ui-carto/ui/index.android.ts index 3c1241ed..2e002276 100644 --- a/src/ui-carto/ui/index.android.ts +++ b/src/ui-carto/ui/index.android.ts @@ -294,12 +294,12 @@ export class Layers extends BaseLayers { } insert(index: number, layer: Layer) { super.insert(index, layer); - return this.native.insert(index, layer.getNative()); + this.native.insert(index, layer.getNative()); } //@ts-ignore set(index: number, layer: Layer) { super.set(index, layer); - return this.native.set(index, layer.getNative()); + this.native.set(index, layer.getNative()); } remove(layer: Layer) { super.remove(layer); @@ -307,7 +307,7 @@ export class Layers extends BaseLayers { } add(layer: Layer) { super.add(layer); - return this.native.add(layer.getNative()); + this.native.add(layer.getNative()); } //@ts-ignore get(index: number) { @@ -318,7 +318,7 @@ export class Layers extends BaseLayers { } clear() { super.clear(); - return this.native.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 34420e73..cb33d33b 100644 --- a/src/ui-carto/ui/index.common.ts +++ b/src/ui-carto/ui/index.common.ts @@ -2,7 +2,7 @@ import { CSSType, ContentView } from '@nativescript/core'; import { BaseNative } from '../BaseNative'; import { LatitudeKey, MapPos, fromNativeMapPos } from '../core'; -import { Layer, TileLayer } from '../layers'; +import { Layer } from '../layers'; import { bearingProperty, focusPosProperty, tiltProperty, zoomProperty } from './cssproperties'; import { MapInfo } from '.'; @@ -88,15 +88,25 @@ export abstract class Layers extends BaseNative { this.mLayerArray[index] = layer; } - removeAll(layers: Layer[]) { - layers.forEach((layer) => this.remove(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) { + remove(layer: Layer): boolean { const index = this.mLayerArray.indexOf(layer); if (index >= 1) { this.mLayerArray.splice(index, 1); } + return true; } add(layer: Layer) { @@ -186,7 +196,7 @@ export abstract class CartoViewBase extends ContentView { return this.mLayers; } - addLayer(layer: TileLayer, index?: number) { + addLayer(layer: Layer, index?: number) { const layersInstance = this.getLayers(); if (layersInstance) { if (index !== undefined && index <= layersInstance.count()) { @@ -197,14 +207,14 @@ export abstract class CartoViewBase extends ContentView { } } - removeLayer(layer: TileLayer) { + removeLayer(layer: Layer) { const layersInstance = this.getLayers(); if (layersInstance) { layersInstance.remove(layer); } } - removeAllLayers(layers: TileLayer[]) { + removeAllLayers(layers: Layer[]) { const layersInstance = this.getLayers(); if (layersInstance) { layersInstance.removeAll(layers); diff --git a/src/ui-carto/ui/index.d.ts b/src/ui-carto/ui/index.d.ts index 68334422..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; @@ -237,6 +249,7 @@ export class CartoMap extends View { 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 71c3f477..3fda36b2 100644 --- a/src/ui-carto/ui/index.ios.ts +++ b/src/ui-carto/ui/index.ios.ts @@ -317,12 +317,12 @@ export class Layers extends BaseLayers { } insert(index: number, layer: Layer) { super.insert(index, layer); - return this.native.insertLayer(index, layer.getNative()); + this.native.insertLayer(index, layer.getNative()); } //@ts-ignore set(index: number, layer: Layer) { super.set(index, layer); - return this.native.setLayer(index, layer.getNative()); + this.native.setLayer(index, layer.getNative()); } remove(layer: Layer) { @@ -331,7 +331,7 @@ export class Layers extends BaseLayers { } add(layer: Layer) { super.add(layer); - return this.native.add(layer.getNative()); + this.native.add(layer.getNative()); } //@ts-ignore get(index: number) { @@ -342,7 +342,7 @@ export class Layers extends BaseLayers { } clear() { super.clear(); - return this.native.clear(); + this.native.clear(); } // public getNative() { From 92bd14a2fccfba72bcf8b06bf1b4c6a2f9d9cf3f Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Thu, 8 May 2025 16:01:14 +0300 Subject: [PATCH 3/3] chore: avoid unnecessary layers array modifications --- src/ui-carto/ui/index.android.ts | 7 +++++-- src/ui-carto/ui/index.common.ts | 3 ++- src/ui-carto/ui/index.ios.ts | 7 +++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/ui-carto/ui/index.android.ts b/src/ui-carto/ui/index.android.ts index 2e002276..f8bdcb51 100644 --- a/src/ui-carto/ui/index.android.ts +++ b/src/ui-carto/ui/index.android.ts @@ -302,8 +302,11 @@ export class Layers extends BaseLayers { this.native.set(index, layer.getNative()); } remove(layer: Layer) { - super.remove(layer); - return this.native.remove(layer.getNative()); + const removed = this.native.remove(layer.getNative()); + if (removed) { + super.remove(layer); + } + return removed; } add(layer: Layer) { super.add(layer); diff --git a/src/ui-carto/ui/index.common.ts b/src/ui-carto/ui/index.common.ts index cb33d33b..72483e79 100644 --- a/src/ui-carto/ui/index.common.ts +++ b/src/ui-carto/ui/index.common.ts @@ -105,8 +105,9 @@ export abstract class Layers extends BaseNative { const index = this.mLayerArray.indexOf(layer); if (index >= 1) { this.mLayerArray.splice(index, 1); + return true; } - return true; + return false; } add(layer: Layer) { diff --git a/src/ui-carto/ui/index.ios.ts b/src/ui-carto/ui/index.ios.ts index 3fda36b2..f6691eb8 100644 --- a/src/ui-carto/ui/index.ios.ts +++ b/src/ui-carto/ui/index.ios.ts @@ -326,8 +326,11 @@ export class Layers extends BaseLayers { } remove(layer: Layer) { - super.remove(layer); - return this.native.remove(layer.getNative()); + const removed = this.native.remove(layer.getNative()); + if (removed) { + super.remove(layer); + } + return removed; } add(layer: Layer) { super.add(layer);