forked from MapComplete/MapComplete
		
	More work on A11y
This commit is contained in:
		
							parent
							
								
									87aee9e2b7
								
							
						
					
					
						commit
						6da72b80ef
					
				
					 28 changed files with 398 additions and 209 deletions
				
			
		|  | @ -4,28 +4,32 @@ import { Feature } from "geojson" | |||
| import { GeoOperations } from "../../GeoOperations" | ||||
| import FilteringFeatureSource from "./FilteringFeatureSource" | ||||
| import LayerState from "../../State/LayerState" | ||||
| import { BBox } from "../../BBox" | ||||
| 
 | ||||
| export default class NearbyFeatureSource implements FeatureSource { | ||||
|     private readonly _result = new UIEventSource<Feature[]>(undefined) | ||||
| 
 | ||||
|     public readonly features: Store<Feature[]> | ||||
|     private readonly _result = new UIEventSource<Feature[]>(undefined) | ||||
|     private readonly _targetPoint: Store<{ lon: number; lat: number }> | ||||
|     private readonly _numberOfNeededFeatures: number | ||||
|     private readonly _layerState?: LayerState | ||||
|     private readonly _currentZoom: Store<number> | ||||
|     private readonly _allSources: Store<{ feat: Feature; d: number }[]>[] = [] | ||||
| 
 | ||||
|     private readonly _bounds: Store<BBox> | undefined | ||||
|     constructor( | ||||
|         targetPoint: Store<{ lon: number; lat: number }>, | ||||
|         sources: ReadonlyMap<string, FilteringFeatureSource>, | ||||
|         numberOfNeededFeatures?: number, | ||||
|         layerState?: LayerState, | ||||
|         currentZoom?: Store<number> | ||||
|         options?: { | ||||
|             bounds?: Store<BBox> | ||||
|             numberOfNeededFeatures?: number | ||||
|             layerState?: LayerState | ||||
|             currentZoom?: Store<number> | ||||
|         } | ||||
|     ) { | ||||
|         this._layerState = layerState | ||||
|         this._layerState = options?.layerState | ||||
|         this._targetPoint = targetPoint.stabilized(100) | ||||
|         this._numberOfNeededFeatures = numberOfNeededFeatures | ||||
|         this._currentZoom = currentZoom.stabilized(500) | ||||
|         this._numberOfNeededFeatures = options?.numberOfNeededFeatures | ||||
|         this._currentZoom = options?.currentZoom.stabilized(500) | ||||
|         this._bounds = options?.bounds | ||||
| 
 | ||||
|         this.features = Stores.ListStabilized(this._result) | ||||
| 
 | ||||
|  | @ -53,6 +57,10 @@ export default class NearbyFeatureSource implements FeatureSource { | |||
|     private update() { | ||||
|         let features: { feat: Feature; d: number }[] = [] | ||||
|         for (const src of this._allSources) { | ||||
|             if (src.data === undefined) { | ||||
|                 this._result.setData(undefined) | ||||
|                 return // We cannot yet calculate all the features
 | ||||
|             } | ||||
|             features.push(...src.data) | ||||
|         } | ||||
|         features.sort((a, b) => a.d - b.d) | ||||
|  | @ -80,6 +88,15 @@ export default class NearbyFeatureSource implements FeatureSource { | |||
|                 if (this._currentZoom.data < minZoom) { | ||||
|                     return empty | ||||
|                 } | ||||
|                 if (this._bounds) { | ||||
|                     const bbox = this._bounds.data | ||||
|                     if (!bbox) { | ||||
|                         // We have a 'bounds' store, but the bounds store itself is still empty
 | ||||
|                         // As such, we cannot yet calculate which features are within the store
 | ||||
|                         return undefined | ||||
|                     } | ||||
|                     feats = feats.filter((f) => bbox.overlapsWithFeature(f)) | ||||
|                 } | ||||
|                 const point = this._targetPoint.data | ||||
|                 const lonLat = <[number, number]>[point.lon, point.lat] | ||||
|                 const withDistance = feats.map((feat) => ({ | ||||
|  | @ -95,7 +112,7 @@ export default class NearbyFeatureSource implements FeatureSource { | |||
|                 } | ||||
|                 return withDistance | ||||
|             }, | ||||
|             [this._targetPoint, isActive, this._currentZoom] | ||||
|             [this._targetPoint, isActive, this._currentZoom, this._bounds] | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue