All files / src/components/music/sidebar InstrumentEnvelopeEditor.tsx

0% Statements 0/15
0% Branches 0/6
0% Functions 0/2
0% Lines 0/14

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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105                                                                                                                                                                                                                 
import React from "react";
import l10n from "shared/lib/lang/l10n";
import styled from "styled-components";
import { CheckboxField } from "ui/form/CheckboxField";
import { Knob } from "ui/form/Knob";
import { Label } from "ui/form/Label";
 
interface InstrumentEnvelopeEditorProps {
  volume: number;
  sweep: number;
  length: number | null;
  onChangeVolume: (value: number) => void;
  onChangeSweep: (value: number) => void;
  onChangeLength: (value: number | null) => void;
}
 
const StyledEnvelopeForm = styled.div`
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 5px;
  align-items: end;
  padding: 0 10px;
  padding-bottom: 10px;
`;
 
const StyledEnvelopeField = styled.div`
  display: grid;
  grid-template-rows: 1fr auto;
  gap: 6px;
 
  > *:first-child {
    align-self: end;
    align-items: center;
    text-align: center;
    justify-content: center;
    height: auto;
  }
 
  &:first-child > *:first-child {
    position: relative;
    top: -1px;
  }
 
  > *:last-child {
    width: 100%;
  }
`;
 
export const InstrumentEnvelopeEditor = ({
  volume,
  sweep,
  length,
  onChangeVolume,
  onChangeLength,
  onChangeSweep,
}: InstrumentEnvelopeEditorProps) => {
  return (
    <StyledEnvelopeForm>
      <StyledEnvelopeField>
        <CheckboxField
          label={l10n("FIELD_LENGTH")}
          name="length"
          checked={length !== null}
          onChange={(e) => {
            const value = e.target.checked;
            if (!value) {
              onChangeLength(null);
            } else {
              onChangeLength(32);
            }
          }}
        />
        <Knob
          name="length"
          value={length ?? 0}
          min={1}
          max={64}
          onChange={onChangeLength}
        />
      </StyledEnvelopeField>
 
      <StyledEnvelopeField>
        <Label htmlFor="initialVolume">{l10n("FIELD_INITIAL_VOLUME")}</Label>
        <Knob
          name="initialVolume"
          value={volume}
          min={0}
          max={15}
          onChange={onChangeVolume}
        />
      </StyledEnvelopeField>
      <StyledEnvelopeField>
        <Label htmlFor="sweepChange">{l10n("FIELD_VOLUME_SWEEP_CHANGE")}</Label>
        <Knob
          name="sweepChange"
          value={sweep}
          min={-7}
          max={7}
          onChange={onChangeSweep}
        />
      </StyledEnvelopeField>
    </StyledEnvelopeForm>
  );
};