ScaleRangeSliderViewModel.js 5.5 KB

12345
  1. /*
  2. All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. See https://js.arcgis.com/4.24/esri/copyright.txt for details.
  4. */
  5. import{_ as e}from"../../chunks/tslib.es6.js";import a from"../../core/Accessor.js";import{HandleOwnerMixin as i}from"../../core/HandleOwner.js";import{watch as t,initial as l}from"../../core/reactiveUtils.js";import{property as s}from"../../core/accessorSupport/decorators/property.js";import"../../core/arrayUtils.js";import"../../core/has.js";import"../../core/accessorSupport/ensureType.js";import{subclass as r}from"../../core/accessorSupport/decorators/subclass.js";import n from"./ScaleRanges.js";import c from"../Slider/SliderViewModel.js";let o=class extends(i(a)){constructor(e){super(e),this.layer=null,this.scaleRanges=n.fromScaleRange({minScale:0,maxScale:0}),this.sliderViewModel=(()=>{const{max:e}=this._getSliderIndexRange(this.scaleRanges.length-1);return new c({precision:10,min:0,max:e,values:[0,e]})})()}initialize(){this.handles.add([t((()=>this.layer?.loaded),(async()=>{const{layer:e,view:a}=this;if(e){if(a&&await a.when(),await e.when(),this._hasTiledLayer()){const e=this.mapScaleToSlider(this._getTiledLayerMaxScale()),a=this.mapScaleToSlider(this._getTiledLayerMinScale());this.sliderViewModel.effectiveMax=e,this.sliderViewModel.effectiveMin=a}if("minScale"in e&&"maxScale"in e){const{minScale:a,maxScale:i}=e;this.set({minScale:a,maxScale:i})}else this.set({minScale:void 0,maxScale:void 0})}}),l)])}get effectiveMaxScale(){return 0===this.maxScale?this.maxScaleLimit:this.maxScale}get effectiveMinScale(){return 0===this.minScale?this.minScaleLimit:this.minScale}get maxScale(){const e=this.mapSliderToScale(this.sliderViewModel.values[1]);return this._normalizeScale("max",e)}set maxScale(e){this._setMaxScaleOnSlider(e)}get maxScaleLimit(){return this.mapSliderToScale(this.sliderViewModel.max)}set maxScaleLimit(e){this._setSliderRange({maxScale:e,minScale:this.minScaleLimit})}get minScale(){const e=this.mapSliderToScale(this.sliderViewModel.values[0]);return this._normalizeScale("min",e)}set minScale(e){this._setMinScaleOnSlider(e)}get minScaleLimit(){return this.mapSliderToScale(this.sliderViewModel.min)}set minScaleLimit(e){this._setSliderRange({maxScale:this.maxScaleLimit,minScale:e})}get state(){const{view:e,layer:a}=this;return!e&&!a||!e&&a&&a.loaded||!a&&e&&e.ready||e&&e.ready&&a&&a.loaded?"ready":"disabled"}set view(e){this._set("view",e)}mapScaleToSlider(e){const a=this.scaleRanges.scaleToRangeIndex(e),i=this.scaleRanges.findScaleRangeByIndex(a),{maxScale:t,minScale:l}=i,{max:s,min:r}=this._getSliderIndexRange(a);return this._mapToRange(e,l,t,r,s)}mapSliderToScale(e){const a=this.scaleRanges.findScaleRangeByIndex(e),{maxScale:i,minScale:t}=a,{max:l,min:s}=this._getSliderIndexRange(e);return this._mapToRange(e,s,l,t,i)}_setSliderRange(e){this.scaleRanges=n.fromScaleRange(e);const{max:a}=this._getSliderIndexRange(this.scaleRanges.length-1);this.sliderViewModel.max=a,this.sliderViewModel.min=0,this.notifyChange("maxScaleLimit"),this.notifyChange("minScaleLimit")}_getSliderIndexRange(e){const a=Math.floor(e);return{min:a,max:a+.99999}}_mapToRange(e,a,i,t,l){return t+(e-a)*(l-t)/(i-a)}_setMaxScaleOnSlider(e){const{scaleRanges:a,sliderViewModel:i}=this;if(void 0!==e){const t=this.mapScaleToSlider(this._constrainMaxScaleToLayer(a.clampMaxScale(e)));i.values=[i.values[0],t]}}_setMinScaleOnSlider(e){const{scaleRanges:a,sliderViewModel:i}=this;if(void 0!==e){const t=this.mapScaleToSlider(this._constrainMinScaleToLayer(a.clampMinScale(e)));i.values=[t,i.values[1]]}}_constrainMinScaleToLayer(e){const{scaleRanges:a}=this;if(this._hasTiledLayer()){const{firstRange:i}=a,t=this._getTiledLayerMinScale(),l=.85;e=this._mapToRange(e,i.maxScale,i.minScale,0,1)>l||e>t?t:e}return e}_constrainMaxScaleToLayer(e){if(this._hasTiledLayer()){const a=this._getTiledLayerMaxScale();e=e<a?a:e}return e}_normalizeScale(e,a){const i="max"===e?"maxScale":"minScale",t=this._hasTiledLayer()?"min"===e?this._getTiledLayerMinScale():this._getTiledLayerMaxScale():this.scaleRanges[i],l=this._hasTiledLayer()?"min"===e?this._getTiledLayerRealMinScale():this._getTiledLayerRealMaxScale():t,s=1e-6,r=0===a||l===a||Math.abs(l-a)<=s;return Number((r?0:a).toFixed(6))}_getLayerLODS(){if(!this.layer||!("tileInfo"in this.layer))return null;return"imagery-tile"===this.layer?.type&&"Raster"===this.layer.raster?.tileType?null:this.layer.tileInfo.lods}_getTiledLayerMinScale(){const e=this._getLayerLODS();return this.scaleRanges.clampMinScale(e[0].scale)}_getTiledLayerMaxScale(){const e=this._getLayerLODS();return e[e.length-1].scale}_getTiledLayerRealMinScale(){const e=this._getLayerLODS(),a="sourceJSON"in this.layer?this.layer.sourceJSON?.tileInfo?.lods??e:e;return this.scaleRanges.clampMinScale(a[0].scale)}_getTiledLayerRealMaxScale(){const e=this._getLayerLODS(),a="sourceJSON"in this.layer?this.layer.sourceJSON?.tileInfo?.lods??e:e;return a[a.length-1].scale}_hasTiledLayer(){return!!this._getLayerLODS()}};e([s({readOnly:!0})],o.prototype,"effectiveMaxScale",null),e([s({readOnly:!0})],o.prototype,"effectiveMinScale",null),e([s()],o.prototype,"layer",void 0),e([s()],o.prototype,"maxScale",null),e([s()],o.prototype,"maxScaleLimit",null),e([s()],o.prototype,"minScale",null),e([s()],o.prototype,"minScaleLimit",null),e([s()],o.prototype,"scaleRanges",void 0),e([s()],o.prototype,"sliderViewModel",void 0),e([s({readOnly:!0})],o.prototype,"state",null),e([s()],o.prototype,"view",null),o=e([r("esri.widgets.ScaleRangeSlider.ScaleRangeSliderViewModel")],o);const S=o;export{S as default};