forked from MapComplete/MapComplete
		
	More refactoring: using a decent, configurable datapipeline now
This commit is contained in:
		
							parent
							
								
									6ac8ec84e4
								
							
						
					
					
						commit
						e42a668c4a
					
				
					 17 changed files with 434 additions and 265 deletions
				
			
		|  | @ -12,7 +12,7 @@ import State from "./State"; | |||
| import {WelcomeMessage} from "./UI/WelcomeMessage"; | ||||
| import {LayerSelection} from "./UI/LayerSelection"; | ||||
| import {VariableUiElement} from "./UI/Base/VariableUIElement"; | ||||
| import UpdateFromOverpass from "./Logic/UpdateFromOverpass"; | ||||
| import LoadFromOverpass from "./Logic/Actors/UpdateFromOverpass"; | ||||
| import {UIEventSource} from "./Logic/UIEventSource"; | ||||
| import {QueryParameters} from "./Logic/Web/QueryParameters"; | ||||
| import {PersonalLayersPanel} from "./UI/PersonalLayersPanel"; | ||||
|  | @ -40,6 +40,12 @@ import {UserDetails} from "./Logic/Osm/OsmConnection"; | |||
| import Attribution from "./UI/Misc/Attribution"; | ||||
| import Constants from "./Models/Constants"; | ||||
| import MetaTagging from "./Logic/MetaTagging"; | ||||
| import FeatureSourceMerger from "./Logic/FeatureSource/FeatureSourceMerger"; | ||||
| import RememberingSource from "./Logic/FeatureSource/RememberingSource"; | ||||
| import FilteringFeatureSource from "./Logic/FeatureSource/FilteringFeatureSource"; | ||||
| import WayHandlingApplyingFeatureSource from "./Logic/FeatureSource/WayHandlingApplyingFeatureSource"; | ||||
| import FeatureSource from "./Logic/FeatureSource/FeatureSource"; | ||||
| import NoOverlapSource from "./Logic/FeatureSource/NoOverlapSource"; | ||||
| 
 | ||||
| export class InitUiElements { | ||||
| 
 | ||||
|  | @ -374,7 +380,7 @@ export class InitUiElements { | |||
|             const flayer: FilteredLayer = new FilteredLayer(layer, generateContents); | ||||
|             flayers.push(flayer); | ||||
| 
 | ||||
|             QueryParameters.GetQueryParameter("layer-" + layer.id, "true", "Wehter or not layer " + layer.id + " is shown") | ||||
|             QueryParameters.GetQueryParameter("layer-" + layer.id, "true", "Wether or not layer " + layer.id + " is shown") | ||||
|                 .map<boolean>((str) => str !== "false", [], (b) => b.toString()) | ||||
|                 .syncWith( | ||||
|                     flayer.isDisplayed | ||||
|  | @ -383,11 +389,45 @@ export class InitUiElements { | |||
| 
 | ||||
|         State.state.filteredLayers.setData(flayers); | ||||
| 
 | ||||
|         const updater = new UpdateFromOverpass(state.locationControl, state.layoutToUse, state.leafletMap); | ||||
|         function addMatchingIds(src: FeatureSource) { | ||||
| 
 | ||||
|             src.features.addCallback(features => { | ||||
|                 features.forEach(f => { | ||||
|                     const properties = f.feature.properties; | ||||
|                     if (properties._matching_layer_id) { | ||||
|                         return; | ||||
|                     } | ||||
| 
 | ||||
|                     for (const flayer of flayers) { | ||||
|                         if (flayer.layerDef.overpassTags.matchesProperties(properties)) { | ||||
|                             properties._matching_layer_id = flayer.layerDef.id; | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 }) | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         const updater = new LoadFromOverpass(state.locationControl, state.layoutToUse, state.leafletMap); | ||||
|         State.state.layerUpdater = updater; | ||||
| 
 | ||||
|         updater.features.addCallback(features => { | ||||
|         addMatchingIds(updater); | ||||
|         addMatchingIds(State.state.changes); | ||||
| 
 | ||||
| 
 | ||||
|         const source = | ||||
|             new FilteringFeatureSource( | ||||
|                 flayers, | ||||
|                 State.state.locationControl, | ||||
|                 new FeatureSourceMerger([ | ||||
|                     new RememberingSource(new WayHandlingApplyingFeatureSource(flayers, | ||||
|                         new NoOverlapSource(flayers, updater) | ||||
|                     )), | ||||
|                     State.state.changes])); | ||||
| 
 | ||||
| 
 | ||||
|         source.features.addCallback((featuresFreshness: { feature: any, freshness: Date }[]) => { | ||||
|             let features = featuresFreshness.map(ff => ff.feature); | ||||
|             features.forEach(feature => { | ||||
|                 State.state.allElements.addElement(feature); | ||||
|             }) | ||||
|  | @ -402,13 +442,10 @@ export class InitUiElements { | |||
|                     } | ||||
|                     return; | ||||
|                 } | ||||
|                 // We use window.setTimeout to give JS some time to update everything and make the interface not too laggy
 | ||||
|                 window.setTimeout(() => { | ||||
|                     const layer = layers[0]; | ||||
|                     const rest = layers.slice(1, layers.length); | ||||
|                     features = layer.SetApplicableData(features); | ||||
|                     renderLayers(rest); | ||||
|                 }, 50) | ||||
|                 const layer = layers[0]; | ||||
|                 const rest = layers.slice(1, layers.length); | ||||
|                 features = layer.SetApplicableData(features); | ||||
|                 renderLayers(rest); | ||||
|             } | ||||
| 
 | ||||
|             renderLayers(flayers); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue