@@ -313,32 +313,80 @@ export default defineComponent({
313313 let events: TimelineEvent [] = []
314314
315315 const updateEventPositionQueue = new Queue <TimelineEvent >()
316+ const updateEventVerticalPositionQueue = new Queue <TimelineEvent >()
316317 let eventPositionUpdateInProgress = false
318+ let eventVerticalPositionUpdateInProgress = false
317319
318320 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 )
329327 }
328+
329+ // If not running an update, start one
330330 if (! eventPositionUpdateInProgress ) {
331331 eventPositionUpdateInProgress = true
332332 Vue .nextTick (() => {
333- nextEventPositionUpdate ()
333+ runEventPositionUpdate ()
334334 eventPositionUpdateInProgress = false
335335 })
336336 }
337337 }
338338
339- function nextEventPositionUpdate () {
339+ function runEventPositionUpdate () {
340340 let event: TimelineEvent
341341 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 ())) {
342390 computeEventVerticalPosition (event )
343391 }
344392 }
@@ -412,7 +460,7 @@ export default defineComponent({
412460 // Collision!
413461 if (event .group && event .group .duration > otherGroup .duration && firstEvent .time <= otherGroup .firstEvent .time ) {
414462 // Invert positions because current group has higher priority
415- if (! updateEventPositionQueue .has (otherGroup .firstEvent )) {
463+ if (! updateEventVerticalPositionQueue .has (otherGroup .firstEvent )) {
416464 queueEventPositionUpdate ([otherGroup .firstEvent ], event .layer .groupsOnly )
417465 }
418466 } else {
0 commit comments