1+ // FIXME: move pois outside of track data
2+
13import Feature from 'ol/Feature.js' ;
24import Point from 'ol/geom/Point.js' ;
35
@@ -73,7 +75,7 @@ export default class TrackManager<POIMeta> {
7375 private trackChangeEventListeners_ : Function [ ] = [ ] ;
7476 // eslint-disable-next-line @typescript-eslint/ban-types
7577 private trackHoverEventListeners_ : Function [ ] = [ ] ;
76- private trackData_ = new TrackData ( ) ;
78+ private trackData_ : TrackData ;
7779 private router_ : Router ;
7880 get router ( ) : Router {
7981 return this . router_ ;
@@ -85,6 +87,7 @@ export default class TrackManager<POIMeta> {
8587 private updater_ : TrackUpdater ;
8688 private interaction_ : TrackInteraction ;
8789 private historyManager_ = new HistoryManager < Feature < Point | LineString > [ ] > ( ) ;
90+ private parts : TrackData [ ] = [ ] ;
8891
8992 constructor ( options : Options ) {
9093 this . map_ = options . map ;
@@ -96,15 +99,14 @@ export default class TrackManager<POIMeta> {
9699
97100 this . router_ = options . router ;
98101 this . profiler_ = options . profiler ;
102+
99103 this . updater_ = new TrackUpdater ( {
100104 profiler : this . profiler_ ,
101105 router : this . router_ ,
102- trackData : this . trackData_
103106 } ) ;
104107
105108 this . interaction_ = new TrackInteraction ( {
106109 style : options . style ,
107- trackData : this . trackData_ ,
108110 trackLayer : this . trackLayer_ ,
109111 map : this . map_ ,
110112 deleteCondition : options . deleteCondition ,
@@ -113,6 +115,8 @@ export default class TrackManager<POIMeta> {
113115 hitTolerance : this . hitTolerance_ ,
114116 } ) ;
115117
118+ this . createNewPart ( ) ;
119+
116120 // Hack to test profile synchro
117121 // this.closestPointGeom_ = new Point([0, 0]);
118122 // this.interaction_.modifyTrack_.overlay_.getSource().addFeature(new Feature({
@@ -131,9 +135,12 @@ export default class TrackManager<POIMeta> {
131135 if ( ! this . snapping ) {
132136 feature . set ( 'snapped' , false ) ;
133137 }
138+ feature . set ( 'part' , this . trackData_ . part ) ;
139+ // this is what we want: the new point is added to the current part
134140 const { pointFrom, pointTo, segment} = this . trackData_ . pushControlPoint ( feature ) ;
135141 if ( segment ) {
136142 this . source_ . addFeature ( segment ) ;
143+ segment . set ( 'part' , this . trackData_ . part ) ;
137144 await this . router_ . snapSegment ( segment , pointFrom , pointTo ) ;
138145 this . updater_ . equalizeCoordinates ( pointFrom ) ;
139146 await this . profiler_ . computeProfile ( segment ) ;
@@ -145,6 +152,7 @@ export default class TrackManager<POIMeta> {
145152
146153 const debouncedMapToProfileUpdater = debounce (
147154 ( coordinate : Coordinate , hover : boolean ) => {
155+ // FIXME multi lines: check this
148156 if ( hover && this . trackData_ . getSegments ( ) . length > 0 ) {
149157 const segments = this . trackData_ . getSegments ( ) . map ( feature => feature . get ( 'profile' ) ) ;
150158 const best = findClosestPointInLines ( segments , coordinate , { tolerance : 1 , interpolate : true } ) ;
@@ -176,22 +184,26 @@ export default class TrackManager<POIMeta> {
176184 const type = event . feature . get ( 'type' ) as FeatureType ;
177185
178186 if ( type === 'POI' ) {
179- this . trackData_ . updatePOIIndexes ( ) ;
187+ // FIXME multi lines: check this
188+ this . trackData_ . updatePOIIndexes ( ) ;
180189 this . onTrackChanged_ ( ) ;
181190 } else if ( type === 'controlPoint' ) {
182191 const feature = event . feature as Feature < Point > ;
183192 await this . updater_ . updateAdjacentSegmentsGeometries ( feature , this . snapping ) ;
184193 this . updater_ . changeAdjacentSegmentsStyling ( feature , '' ) ;
185194 await this . updater_ . computeAdjacentSegmentsProfile ( feature ) ;
195+ // FIXME multi lines: check this
186196 this . trackData_ . updatePOIIndexes ( ) ;
187197 this . onTrackChanged_ ( ) ;
188198 } else if ( type === 'segment' ) {
189199 const feature = event . feature as Feature < LineString > ;
200+ // FIXME multi lines: check this
190201 const indexOfSegment = this . trackData_ . getSegments ( ) . indexOf ( feature ) ;
191202
192203 console . assert ( indexOfSegment >= 0 ) ;
193204 const controlPoint = new Feature ( {
194- geometry : new Point ( event . coordinate )
205+ geometry : new Point ( event . coordinate ) ,
206+ part : this . trackData_ . part ,
195207 } ) ;
196208 this . source_ . addFeature ( controlPoint ) ;
197209 const removed = this . trackData_ . insertControlPointAt ( controlPoint , indexOfSegment + 1 ) ;
@@ -200,11 +212,14 @@ export default class TrackManager<POIMeta> {
200212
201213 const { before, after} = this . trackData_ . getAdjacentSegments ( controlPoint ) ;
202214 console . assert ( ! ! before && ! ! after ) ;
215+ before . set ( 'part' , this . trackData_ . part ) ;
216+ after . set ( 'part' , this . trackData_ . part ) ;
203217 this . source_ . addFeatures ( [ before , after ] ) ;
204218
205219 await this . updater_ . updateAdjacentSegmentsGeometries ( controlPoint , this . snapping ) ;
206220 this . updater_ . changeAdjacentSegmentsStyling ( controlPoint , '' ) ;
207221 await this . updater_ . computeAdjacentSegmentsProfile ( controlPoint ) ;
222+ // FIXME multi lines: check this
208223 this . trackData_ . updatePOIIndexes ( ) ;
209224 this . onTrackChanged_ ( ) ;
210225 }
@@ -220,11 +235,13 @@ export default class TrackManager<POIMeta> {
220235 console . assert ( selected . getGeometry ( ) . getType ( ) === 'Point' ) ;
221236 const type = selected . get ( 'type' ) as FeatureType ;
222237 if ( type === 'POI' ) {
238+ // FIXME multi lines: check this
223239 this . trackData_ . deletePOI ( selected ) ;
224240 this . source_ . removeFeature ( selected ) ;
225241 this . onTrackChanged_ ( ) ;
226242 } else {
227243 // control point
244+ // FIXME multi lines: check this
228245 const { deleted, pointBefore, pointAfter, newSegment} = this . trackData_ . deleteControlPoint ( selected ) ;
229246
230247 // remove deleted features from source
@@ -329,7 +346,8 @@ export default class TrackManager<POIMeta> {
329346
330347 deleteLastPoint ( ) {
331348 if ( this . mode_ ) {
332- if ( this . trackData_ . getControlPoints ( ) . length > 0 ) {
349+ // FIXME multi lines: check this
350+ if ( this . trackData_ . getControlPoints ( ) . length > 0 ) {
333351 const deletedFeatures = this . trackData_ . deleteLastControlPoint ( ) ;
334352 deletedFeatures . forEach ( feature => this . source_ . removeFeature ( feature ) ) ;
335353 this . onTrackChanged_ ( ) ;
@@ -364,6 +382,7 @@ export default class TrackManager<POIMeta> {
364382 private clearInternal_ ( ) {
365383 this . source_ . clear ( ) ;
366384 this . trackData_ . clear ( ) ;
385+ // FIXME multi lines: remove all parts ?
367386 }
368387
369388 /**
@@ -388,7 +407,6 @@ export default class TrackManager<POIMeta> {
388407 }
389408
390409 async restoreFeatures ( features : Feature < Point | LineString > [ ] ) : Promise < void > {
391- this . clearInternal_ ( ) ;
392410 await this . restoreFeaturesInternal_ ( features ) ;
393411 this . onTrackChanged_ ( ) ;
394412 }
@@ -570,4 +588,32 @@ export default class TrackManager<POIMeta> {
570588 this . source_ . changed ( ) ;
571589 this . shadowTrackLayer_ . getSource ( ) . changed ( ) ;
572590 }
573- }
591+
592+ createNewPart ( ) : number {
593+ this . trackData_ = new TrackData ( this . parts . length ) ;
594+ this . parts . push ( this . trackData_ ) ;
595+ this . updater_ . setTrackData ( this . trackData_ ) ;
596+ this . interaction_ . setTrackData ( this . trackData_ ) ;
597+
598+ return this . trackData_ . part ;
599+ }
600+
601+ activePart ( ) : number {
602+ return this . trackData_ . part ;
603+ }
604+
605+ partsCount ( ) : number {
606+ return this . parts . length ;
607+ }
608+
609+ workOnPart ( index : number ) {
610+ this . trackData_ = this . parts [ index ] ;
611+ this . updater_ . setTrackData ( this . trackData_ ) ;
612+ this . interaction_ . setTrackData ( this . trackData_ ) ;
613+ }
614+
615+ getParts ( ) : TrackData [ ] {
616+ return this . parts ;
617+ }
618+
619+ }
0 commit comments