private initSubscribers()

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);
      });
  }