1
+ // FIXME: move pois outside of track data
2
+
1
3
import Feature from 'ol/Feature.js' ;
2
4
import Point from 'ol/geom/Point.js' ;
3
5
@@ -73,7 +75,7 @@ export default class TrackManager<POIMeta> {
73
75
private trackChangeEventListeners_ : Function [ ] = [ ] ;
74
76
// eslint-disable-next-line @typescript-eslint/ban-types
75
77
private trackHoverEventListeners_ : Function [ ] = [ ] ;
76
- private trackData_ = new TrackData ( ) ;
78
+ private trackData_ : TrackData ;
77
79
private router_ : Router ;
78
80
get router ( ) : Router {
79
81
return this . router_ ;
@@ -85,6 +87,7 @@ export default class TrackManager<POIMeta> {
85
87
private updater_ : TrackUpdater ;
86
88
private interaction_ : TrackInteraction ;
87
89
private historyManager_ = new HistoryManager < Feature < Point | LineString > [ ] > ( ) ;
90
+ private parts : TrackData [ ] = [ ] ;
88
91
89
92
constructor ( options : Options ) {
90
93
this . map_ = options . map ;
@@ -96,15 +99,14 @@ export default class TrackManager<POIMeta> {
96
99
97
100
this . router_ = options . router ;
98
101
this . profiler_ = options . profiler ;
102
+
99
103
this . updater_ = new TrackUpdater ( {
100
104
profiler : this . profiler_ ,
101
105
router : this . router_ ,
102
- trackData : this . trackData_
103
106
} ) ;
104
107
105
108
this . interaction_ = new TrackInteraction ( {
106
109
style : options . style ,
107
- trackData : this . trackData_ ,
108
110
trackLayer : this . trackLayer_ ,
109
111
map : this . map_ ,
110
112
deleteCondition : options . deleteCondition ,
@@ -113,6 +115,8 @@ export default class TrackManager<POIMeta> {
113
115
hitTolerance : this . hitTolerance_ ,
114
116
} ) ;
115
117
118
+ this . createNewPart ( ) ;
119
+
116
120
// Hack to test profile synchro
117
121
// this.closestPointGeom_ = new Point([0, 0]);
118
122
// this.interaction_.modifyTrack_.overlay_.getSource().addFeature(new Feature({
@@ -131,9 +135,12 @@ export default class TrackManager<POIMeta> {
131
135
if ( ! this . snapping ) {
132
136
feature . set ( 'snapped' , false ) ;
133
137
}
138
+ feature . set ( 'part' , this . trackData_ . part ) ;
139
+ // this is what we want: the new point is added to the current part
134
140
const { pointFrom, pointTo, segment} = this . trackData_ . pushControlPoint ( feature ) ;
135
141
if ( segment ) {
136
142
this . source_ . addFeature ( segment ) ;
143
+ segment . set ( 'part' , this . trackData_ . part ) ;
137
144
await this . router_ . snapSegment ( segment , pointFrom , pointTo ) ;
138
145
this . updater_ . equalizeCoordinates ( pointFrom ) ;
139
146
await this . profiler_ . computeProfile ( segment ) ;
@@ -145,6 +152,7 @@ export default class TrackManager<POIMeta> {
145
152
146
153
const debouncedMapToProfileUpdater = debounce (
147
154
( coordinate : Coordinate , hover : boolean ) => {
155
+ // FIXME multi lines: check this
148
156
if ( hover && this . trackData_ . getSegments ( ) . length > 0 ) {
149
157
const segments = this . trackData_ . getSegments ( ) . map ( feature => feature . get ( 'profile' ) ) ;
150
158
const best = findClosestPointInLines ( segments , coordinate , { tolerance : 1 , interpolate : true } ) ;
@@ -175,22 +183,26 @@ export default class TrackManager<POIMeta> {
175
183
const type = event . feature . get ( 'type' ) as FeatureType ;
176
184
177
185
if ( type === 'POI' ) {
178
- this . trackData_ . updatePOIIndexes ( ) ;
186
+ // FIXME multi lines: check this
187
+ this . trackData_ . updatePOIIndexes ( ) ;
179
188
this . onTrackChanged_ ( ) ;
180
189
} else if ( type === 'controlPoint' ) {
181
190
const feature = event . feature as Feature < Point > ;
182
191
await this . updater_ . updateAdjacentSegmentsGeometries ( feature , this . snapping ) ;
183
192
this . updater_ . changeAdjacentSegmentsStyling ( feature , '' ) ;
184
193
await this . updater_ . computeAdjacentSegmentsProfile ( feature ) ;
194
+ // FIXME multi lines: check this
185
195
this . trackData_ . updatePOIIndexes ( ) ;
186
196
this . onTrackChanged_ ( ) ;
187
197
} else if ( type === 'segment' ) {
188
198
const feature = event . feature as Feature < LineString > ;
199
+ // FIXME multi lines: check this
189
200
const indexOfSegment = this . trackData_ . getSegments ( ) . indexOf ( feature ) ;
190
201
191
202
console . assert ( indexOfSegment >= 0 ) ;
192
203
const controlPoint = new Feature ( {
193
- geometry : new Point ( event . coordinate )
204
+ geometry : new Point ( event . coordinate ) ,
205
+ part : this . trackData_ . part ,
194
206
} ) ;
195
207
this . source_ . addFeature ( controlPoint ) ;
196
208
const removed = this . trackData_ . insertControlPointAt ( controlPoint , indexOfSegment + 1 ) ;
@@ -199,11 +211,14 @@ export default class TrackManager<POIMeta> {
199
211
200
212
const { before, after} = this . trackData_ . getAdjacentSegments ( controlPoint ) ;
201
213
console . assert ( ! ! before && ! ! after ) ;
214
+ before . set ( 'part' , this . trackData_ . part ) ;
215
+ after . set ( 'part' , this . trackData_ . part ) ;
202
216
this . source_ . addFeatures ( [ before , after ] ) ;
203
217
204
218
await this . updater_ . updateAdjacentSegmentsGeometries ( controlPoint , this . snapping ) ;
205
219
this . updater_ . changeAdjacentSegmentsStyling ( controlPoint , '' ) ;
206
220
await this . updater_ . computeAdjacentSegmentsProfile ( controlPoint ) ;
221
+ // FIXME multi lines: check this
207
222
this . trackData_ . updatePOIIndexes ( ) ;
208
223
this . onTrackChanged_ ( ) ;
209
224
}
@@ -218,11 +233,13 @@ export default class TrackManager<POIMeta> {
218
233
console . assert ( selected . getGeometry ( ) . getType ( ) === 'Point' ) ;
219
234
const type = selected . get ( 'type' ) as FeatureType ;
220
235
if ( type === 'POI' ) {
236
+ // FIXME multi lines: check this
221
237
this . trackData_ . deletePOI ( selected ) ;
222
238
this . source_ . removeFeature ( selected ) ;
223
239
this . onTrackChanged_ ( ) ;
224
240
} else {
225
241
// control point
242
+ // FIXME multi lines: check this
226
243
const { deleted, pointBefore, pointAfter, newSegment} = this . trackData_ . deleteControlPoint ( selected ) ;
227
244
228
245
// remove deleted features from source
@@ -327,7 +344,8 @@ export default class TrackManager<POIMeta> {
327
344
328
345
deleteLastPoint ( ) {
329
346
if ( this . mode_ ) {
330
- if ( this . trackData_ . getControlPoints ( ) . length > 0 ) {
347
+ // FIXME multi lines: check this
348
+ if ( this . trackData_ . getControlPoints ( ) . length > 0 ) {
331
349
const deletedFeatures = this . trackData_ . deleteLastControlPoint ( ) ;
332
350
deletedFeatures . forEach ( feature => this . source_ . removeFeature ( feature ) ) ;
333
351
this . onTrackChanged_ ( ) ;
@@ -362,6 +380,7 @@ export default class TrackManager<POIMeta> {
362
380
private clearInternal_ ( ) {
363
381
this . source_ . clear ( ) ;
364
382
this . trackData_ . clear ( ) ;
383
+ // FIXME multi lines: remove all parts ?
365
384
}
366
385
367
386
/**
@@ -568,4 +587,32 @@ export default class TrackManager<POIMeta> {
568
587
this . source_ . changed ( ) ;
569
588
this . shadowTrackLayer_ . getSource ( ) . changed ( ) ;
570
589
}
571
- }
590
+
591
+ createNewPart ( ) : number {
592
+ this . trackData_ = new TrackData ( this . parts . length ) ;
593
+ this . parts . push ( this . trackData_ ) ;
594
+ this . updater_ . setTrackData ( this . trackData_ ) ;
595
+ this . interaction_ . setTrackData ( this . trackData_ ) ;
596
+
597
+ return this . trackData_ . part ;
598
+ }
599
+
600
+ activePart ( ) : number {
601
+ return this . trackData_ . part ;
602
+ }
603
+
604
+ partsCount ( ) : number {
605
+ return this . parts . length ;
606
+ }
607
+
608
+ workOnPart ( index : number ) {
609
+ this . trackData_ = this . parts [ index ] ;
610
+ this . updater_ . setTrackData ( this . trackData_ ) ;
611
+ this . interaction_ . setTrackData ( this . trackData_ ) ;
612
+ }
613
+
614
+ getParts ( ) : TrackData [ ] {
615
+ return this . parts ;
616
+ }
617
+
618
+ }
0 commit comments