@@ -313,32 +313,80 @@ export default defineComponent({
313
313
let events: TimelineEvent [] = []
314
314
315
315
const updateEventPositionQueue = new Queue <TimelineEvent >()
316
+ const updateEventVerticalPositionQueue = new Queue <TimelineEvent >()
316
317
let eventPositionUpdateInProgress = false
318
+ let eventVerticalPositionUpdateInProgress = false
317
319
318
320
function queueEventPositionUpdate (events : TimelineEvent [], force = false ) {
319
- for (const e of events ) {
320
- if (! e .container ) continue
321
- const ignored = isEventIgnored (e )
322
- e .container .visible = ! ignored
323
- if (ignored ) continue
324
- // Update horizontal position immediately
325
- e .container .x = Math .round (getTimePosition (e .time ))
326
- if (! force && e .layer .groupsOnly ) continue
327
- // Queue vertical position compute
328
- updateEventPositionQueue .add (e )
321
+ for (const event of events ) {
322
+ if (! event .container ) continue
323
+
324
+ event .forcePositionUpdate = force
325
+
326
+ updateEventPositionQueue .add (event )
329
327
}
328
+
329
+ // If not running an update, start one
330
330
if (! eventPositionUpdateInProgress ) {
331
331
eventPositionUpdateInProgress = true
332
332
Vue .nextTick (() => {
333
- nextEventPositionUpdate ()
333
+ runEventPositionUpdate ()
334
334
eventPositionUpdateInProgress = false
335
335
})
336
336
}
337
337
}
338
338
339
- function nextEventPositionUpdate () {
339
+ function runEventPositionUpdate () {
340
340
let event: TimelineEvent
341
341
while ((event = updateEventPositionQueue .shift ())) {
342
+ // Ignored
343
+ const ignored = isEventIgnored (event )
344
+ event .container .visible = ! ignored
345
+ if (ignored ) continue
346
+
347
+ /*
348
+ // Ignore events that are theorically not visible
349
+ const eventInViewport = e.time >= nonReactiveTime.startTime.value && e.time <= nonReactiveTime.endTime.value
350
+ const eventGroupInViewport = !e.group || e.group.firstEvent !== e || (
351
+ (getTimePosition(e.group.lastEvent.time) - getTimePosition(e.time)) > 1 && (
352
+ // First event in viewport
353
+ eventInViewport ||
354
+ // Last event in viewport
355
+ (e.group.lastEvent.time >= nonReactiveTime.startTime.value && e.group.lastEvent.time <= nonReactiveTime.endTime.value) ||
356
+ // Group in viewport (bigger than viewport)
357
+ (e.time < nonReactiveTime.startTime.value && e.group.lastEvent.time > nonReactiveTime.endTime.value)
358
+ )
359
+ )
360
+ const notVisible = !eventInViewport && !eventGroupInViewport
361
+ e.container.visible = !notVisible
362
+ if (!force && notVisible) continue
363
+ // eslint-disable-next-line no-console
364
+ console.log('update')
365
+ */
366
+
367
+ // Update horizontal position immediately
368
+ event .container .x = getTimePosition (event .time )
369
+
370
+ // Ignore additional updates to flamechart
371
+ if (! event .forcePositionUpdate && event .layer .groupsOnly ) continue
372
+
373
+ // Queue vertical position compute
374
+ updateEventVerticalPositionQueue .add (event )
375
+ }
376
+
377
+ // If not running an update, start one
378
+ if (! eventVerticalPositionUpdateInProgress ) {
379
+ eventVerticalPositionUpdateInProgress = true
380
+ Vue .nextTick (() => {
381
+ runEventVerticalPositionUpdate ()
382
+ eventVerticalPositionUpdateInProgress = false
383
+ })
384
+ }
385
+ }
386
+
387
+ function runEventVerticalPositionUpdate () {
388
+ let event: TimelineEvent
389
+ while ((event = updateEventVerticalPositionQueue .shift ())) {
342
390
computeEventVerticalPosition (event )
343
391
}
344
392
}
@@ -412,7 +460,7 @@ export default defineComponent({
412
460
// Collision!
413
461
if (event .group && event .group .duration > otherGroup .duration && firstEvent .time <= otherGroup .firstEvent .time ) {
414
462
// Invert positions because current group has higher priority
415
- if (! updateEventPositionQueue .has (otherGroup .firstEvent )) {
463
+ if (! updateEventVerticalPositionQueue .has (otherGroup .firstEvent )) {
416
464
queueEventPositionUpdate ([otherGroup .firstEvent ], event .layer .groupsOnly )
417
465
}
418
466
} else {
0 commit comments