All files / src/packlets/editor-core/slices timing-columns-slice.ts

86.66% Statements 13/15
50% Branches 2/4
100% Functions 5/5
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55                    1x     51x 107x       107x             1x 1x 1x 1x                       1x 1x 1x 1x                      
import { Slice } from "../slice";
import type { EditorContext } from "../editor-context";
import { ColumnsSlice } from "./columns-slice";
import { ChartSlice } from "./chart-slice";
import { TimingSlice } from "./timing-slice";
import { EVENT, TIME_SIGNATURE, BPM_CHANGE, CHART_REF } from "../components";
import { EntityBuilder } from "../../entity-manager";
import type { ColumnDefinition } from "../types";
 
export class TimingColumnsSlice extends Slice {
  static readonly sliceKey = "timing-columns";
 
  constructor(ctx: EditorContext) {
    super(ctx);
    ctx.get(ColumnsSlice).registerColumnProvider(1, () => this.getColumns());
  }
 
  getColumns(): ColumnDefinition[] {
    return [
      { id: "measure", title: "", width: 40 },
      {
        id: "time-sig",
        title: "Time",
        width: 48,
        placementHandler: (pulse) => {
          const chartId = this.ctx.get(ChartSlice).$selectedChartId.get();
          Iif (!chartId) return null;
          const ts = this.ctx.get(TimingSlice).getTimingEngine().getTimeSignatureAtPulse(pulse);
          return new EntityBuilder()
            .with(EVENT, { y: pulse })
            .with(TIME_SIGNATURE, { numerator: ts.numerator, denominator: ts.denominator })
            .with(CHART_REF, { chartId })
            .build();
        },
      },
      {
        id: "bpm",
        title: "BPM",
        width: 56,
        placementHandler: (pulse) => {
          const chartId = this.ctx.get(ChartSlice).$selectedChartId.get();
          Iif (!chartId) return null;
          const bpm = this.ctx.get(TimingSlice).getTimingEngine().getBpmAtPulse(pulse);
          return new EntityBuilder()
            .with(EVENT, { y: pulse })
            .with(BPM_CHANGE, { bpm })
            .with(CHART_REF, { chartId })
            .build();
        },
      },
      { id: "spacer", title: "", width: 8 },
    ];
  }
}