in web/src/app/timeline/canvas/timeline_renderer.service.ts [180:260]
private initSubscribers() {
// Mouse pointer handler for mouse move related events
this.mousePointerTimeline
.pipe(
withLatestFrom(
this.viewState.pixelPerTime,
this.viewState.devicePixelRatio,
),
)
.subscribe(([t, pixelPerTime, pixelRatio]) => {
let nextHighlightLogs: number[] = [];
const queryRange =
(TimelineRendererService.HOVER_CURSOR_DISTANCE_PX * pixelRatio) /
pixelPerTime;
if (t?.timeline) {
// Try finding event nearby if the mouse pointer was around center of the timeline
// Fallback to find covering revision when it couldn't find anything.
if (
t.y >= TimelineRendererService.EVENT_HIT_CHECK_Y_PADDING &&
t.y <= 1.0 - TimelineRendererService.EVENT_HIT_CHECK_Y_PADDING
) {
const events = t.timeline.queryEventsInRange(
t.time - queryRange,
t.time + queryRange,
);
nextHighlightLogs = events.map((e) => e.logIndex);
}
if (!nextHighlightLogs.length) {
const revisions = t.timeline.queryRevisionsInRange(
t.time - queryRange,
t.time + queryRange,
);
nextHighlightLogs = revisions.map((r) => r.logIndex);
}
}
this.selectionManager.onHighlightLog(nextHighlightLogs);
this.selectionManager.onHighlightTimeline(t?.timeline ?? null);
});
// Mouse click event handler
this.mousePointerClickTimeline
.pipe(
withLatestFrom(
this.viewState.pixelPerTime,
this.viewState.devicePixelRatio,
),
)
.subscribe(([t, pixelPerTime, pixelRatio]) => {
let eventSelected = false;
const queryRange =
(TimelineRendererService.HOVER_CURSOR_DISTANCE_PX * pixelRatio) /
pixelPerTime;
if (t?.timeline) {
if (
t.y >= TimelineRendererService.EVENT_HIT_CHECK_Y_PADDING &&
t.y <= 1.0 - TimelineRendererService.EVENT_HIT_CHECK_Y_PADDING
) {
const event = t.timeline.pickEventNearCenterOfRange(
t.time - queryRange,
t.time + queryRange,
);
if (event) {
eventSelected = true;
this.selectionManager.changeSelectionByEvent(t.timeline, event);
return;
}
}
if (!eventSelected) {
const revision = t.timeline.getLatestRevisionOfTime(t.time);
if (revision) {
this.selectionManager.changeSelectionByRevision(
t.timeline,
revision,
);
return;
}
}
}
this.selectionManager.onSelectTimeline(t?.timeline ?? null);
});
}