import React from 'react'; import type { KeySignature } from '../core/KGProject'; import { buildKeySignatureCircleSlots } from './keySignaturePickerLayout'; import './KeySignaturePickerPopup.css'; interface KeySignaturePickerPopupProps { value: KeySignature; // Keep the callback typed to project key signatures without duplicating the union locally. // eslint-disable-next-line no-unused-vars onChange: (keySignature: KeySignature) => void; } const OUTER_RADIUS = 87; const INNER_RADIUS = 55; const COUNT_RADIUS = 69; const CENTER_X = 126; const CENTER_Y = 112; function getPosition(angleDeg: number, radius: number) { const angle = (angleDeg * Math.PI) / 180; return { left: CENTER_X + radius * Math.cos(angle), top: CENTER_Y + radius * Math.sin(angle), }; } function splitAccidental(label: string): { base: string; accidental: string | null } { if (label.includes('#')) { return { base: label.replace('#', ''), accidental: '♯' }; } if (label.includes('b')) { return { base: label.replace('b', ''), accidental: '♭' }; } return { base: label, accidental: null }; } const KeyLabel: React.FC<{ label: string; selected?: boolean }> = ({ label, selected = false }) => { const { base, accidental } = splitAccidental(label); return ( {base} {accidental && {accidental}} ); }; const CombinedKeyLabel: React.FC<{ labels: string[]; selectedIndex?: number }> = ({ labels, selectedIndex = -1 }) => ( {labels.map((label, index) => ( {index < labels.length - 1 && /} ))} ); const KeySignaturePickerPopup: React.FC = ({ value, onChange }) => { const slots = React.useMemo(() => buildKeySignatureCircleSlots(), []); const handlePairedSelection = React.useCallback((keySignatures: KeySignature[]) => { if (keySignatures.length === 0) { return; } const activeIndex = keySignatures.indexOf(value); if (activeIndex >= 0) { onChange(keySignatures[(activeIndex + 1) % keySignatures.length]); return; } onChange(keySignatures[0]); }, [onChange, value]); return (
); }; export default KeySignaturePickerPopup;