{"version":3,"file":"hslayers-ng-services-layer-shifting.mjs","sources":["../../../projects/hslayers/services/layer-shifting/layer-shifting.service.ts","../../../projects/hslayers/services/layer-shifting/hslayers-ng-services-layer-shifting.ts"],"sourcesContent":["import {Injectable, inject} from '@angular/core';\n\nimport {Layer} from 'ol/layer';\nimport {Source} from 'ol/source';\n\nimport {HsEventBusService} from 'hslayers-ng/services/event-bus';\nimport {\n  HsLayerManagerFolderService,\n  HsLayerManagerService,\n} from 'hslayers-ng/services/layer-manager';\nimport {HsMapService} from 'hslayers-ng/services/map';\nimport {\n  getMaxLayerZIndex,\n  getMinLayerZIndex,\n  instOf,\n} from 'hslayers-ng/services/utils';\nimport {getBase} from 'hslayers-ng/common/extensions';\n\nexport class LayerListItem {\n  title: string;\n  layer: Layer<Source>;\n  active?: boolean;\n  visible?: boolean;\n}\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HsLayerShiftingService {\n  private hsMapService = inject(HsMapService);\n  private hsLayerManagerService = inject(HsLayerManagerService);\n  private hsEventBusService = inject(HsEventBusService);\n  private hsFolderService = inject(HsLayerManagerFolderService);\n\n  layersCopy: LayerListItem[] = [];\n\n  /**\n   * Function by which to filter the displayed layers.\n   * Usually just by showInLayermanager property.\n   */\n  private layerFilter() {\n    return this.hsLayerManagerService.data.layers.filter(\n      (l) => l.showInLayerManager ?? true,\n    );\n  }\n\n  /**\n   * Get map layers\n   */\n  private getMapLayers(): Layer<Source>[] {\n    return this.hsMapService\n      .getLayersArray()\n      .filter((layer: Layer<Source>) => getBase(layer) !== true);\n  }\n\n  /**\n   * Copies layers from Layermanager layer list for the physical layer list\n   */\n  fillLayers(): void {\n    if (!this.layerFilter()) {\n      return;\n    }\n    this.layersCopy = this.hsFolderService.sortLayersByZ(\n      this.layerFilter().map((l) => {\n        return {title: l.title, layer: l.layer};\n      }),\n    );\n  }\n\n  /**\n   * Move the provided layer in the middle between all other rendered layers on the map\n   * @param layer - provided layer\n   * @param target - Target layer number, item or source\n   */\n\n  moveTo(\n    layer: LayerListItem | Layer<Source>,\n    target: number | LayerListItem | Layer<Source>,\n  ): void {\n    if (instOf(target, LayerListItem)) {\n      //Wrapped layer provided\n      target = (target as LayerListItem).layer.getZIndex();\n    } else if (instOf(target, Layer)) {\n      //OL layer provided\n      target = (target as Layer<Source>).getZIndex();\n    }\n    this.moveAndShift(this.getOlLayer(layer), target as number);\n  }\n  /**\n   * Move and shift layer order to make changes on the map\n   * @param providedLayer - provided layer\n   * @param preferredZIndex - ZIndex value to switch to\n   */\n  private moveAndShift(\n    providedLayer: Layer<Source>,\n    preferredZIndex: number,\n  ): void {\n    if (providedLayer === undefined) {\n      return;\n    }\n    if (providedLayer.getZIndex() != preferredZIndex) {\n      const indexFrom = providedLayer.getZIndex();\n      const indexTo = preferredZIndex;\n      const incrementValue = indexTo > indexFrom ? -1 : 1;\n      for (const lyr of this.getMapLayers().filter(\n        (lyr) => lyr != providedLayer,\n      )) {\n        const currentZIndex = lyr.getZIndex();\n        if (\n          (currentZIndex >= indexFrom && currentZIndex <= indexTo) ||\n          (currentZIndex <= indexFrom && currentZIndex >= indexTo)\n        ) {\n          lyr.setZIndex(lyr.getZIndex() + incrementValue);\n        }\n      }\n      providedLayer.setZIndex(preferredZIndex);\n      this.hsEventBusService.layerManagerUpdates.next(providedLayer);\n      this.hsFolderService.folderAction$.next(\n        this.hsFolderService.updateFoldersZIndex(),\n      );\n    }\n  }\n\n  /**\n   * Gets layer property of container object or the actual provided ol layer\n   * @param layer - Provided layer\n   * @returns Returns ol layer\n   */\n  private getOlLayer(\n    providedLayer: LayerListItem | Layer<Source>,\n  ): Layer<Source> {\n    if (instOf(providedLayer, Layer)) {\n      return providedLayer as Layer<Source>;\n    }\n    return (providedLayer as LayerListItem).layer;\n  }\n\n  /**\n   * Gets maximum z-index among overlay layers.\n   */\n  getMaxZ(): number {\n    const layers = this.getMapLayers();\n    return getMaxLayerZIndex(layers, 0);\n  }\n  /**\n   * Gets minimum z-index among overlay layers.\n   */\n  getMinZ(): number {\n    const layers = this.getMapLayers();\n    return getMinLayerZIndex(layers) ?? 0;\n  }\n\n  /**\n   * Applies a new ZIndex value to the selected layer that is responsible for layer rendering on the map\n   * @param indexTo - new ZIndex value for the selected layer\n   * @param layer - Selected layer from physical layer list\n   */\n  private setLayerZIndex(indexTo: number, layer: Layer<Source>): void {\n    const layerSwitchedWith = this.layersCopy[indexTo].layer;\n    const interactedLayerZIndex = layer.getZIndex();\n    layer.setZIndex(layerSwitchedWith.getZIndex());\n    layerSwitchedWith.setZIndex(interactedLayerZIndex);\n    this.hsEventBusService.layerManagerUpdates.next(layer);\n  }\n  /**\n   * Move the provided layer under all other rendered layers on the map\n   * @param layer - provided layer\n   */\n  moveToBottom(layer: LayerListItem | Layer<Source>): void {\n    this.moveAndShift(this.getOlLayer(layer), this.getMinZ());\n  }\n  /**\n   * Move the provided layer over all other rendered layers on the map\n   * @param layer - provided layer\n   */\n  moveToTop(layer: LayerListItem | Layer<Source>): void {\n    this.moveAndShift(this.getOlLayer(layer), this.getMaxZ());\n  }\n\n  /**\n   * Changes selected layers ZIndex value - layer with the largest ZIndex will be rendered on top of all other layers\n   * @param baseLayer - Selected layer from physical layer list\n   * @param direction - Direction in which to move the selected layer - up/down\n   */\n  swapSibling(baseLayer: LayerListItem, direction: string): void {\n    const currentLayerIndex = this.layersCopy.indexOf(baseLayer);\n    switch (direction.toLocaleLowerCase()) {\n      case 'up':\n        if (currentLayerIndex != 0) {\n          this.setLayerZIndex(currentLayerIndex - 1, baseLayer.layer);\n        }\n        break;\n      case 'down':\n        if (currentLayerIndex < this.layersCopy.length - 1) {\n          this.setLayerZIndex(currentLayerIndex + 1, baseLayer.layer);\n        }\n        break;\n      default:\n    }\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}