import { defaultSettings, settingsMap, useSettings } from '../../../settings.mjs'; import { themes } from '@strudel/codemirror'; import { Textbox } from '../textbox/Textbox.jsx'; import { isUdels } from '../../util.mjs'; import { ButtonGroup } from './Forms.jsx'; import { AudioDeviceSelector } from './AudioDeviceSelector.jsx'; import { AudioEngineTargetSelector } from './AudioEngineTargetSelector.jsx'; import { confirmDialog } from '../../util.mjs'; import { DEFAULT_MAX_POLYPHONY, setMaxPolyphony } from '@strudel/webaudio'; function Checkbox({ label, value, onChange, disabled = false }) { return ( ); } function SelectInput({ value, options, onChange }) { return ( ); } function NumberSlider({ value, onChange, step = 1, ...rest }) { return (
onChange(Number(e.target.value))} {...rest} /> onChange(Number(e.target.value))} />
); } function FormItem({ label, children, sublabel }) { return (
{children}
); } const themeOptions = Object.fromEntries(Object.keys(themes).map((k) => [k, k])); const fontFamilyOptions = { monospace: 'monospace', Courier: 'Courier', CutiePi: 'CutiePi', JetBrains: 'JetBrains', Hack: 'Hack', FiraCode: 'FiraCode', 'FiraCode-SemiBold': 'FiraCode SemiBold', teletext: 'teletext', mode7: 'mode7', BigBlueTerminal: 'BigBlueTerminal', x3270: 'x3270', Monocraft: 'Monocraft', PressStart: 'PressStart2P', 'we-come-in-peace': 'we-come-in-peace', galactico: 'galactico', }; const RELOAD_MSG = 'Changing this setting requires the window to reload itself. OK?'; export function SettingsTab({ started }) { const { theme, keybindings, isBracketClosingEnabled, isBracketMatchingEnabled, isLineNumbersDisplayed, isPatternHighlightingEnabled, isActiveLineHighlighted, isAutoCompletionEnabled, isTooltipEnabled, isFlashEnabled, isButtonRowHidden, isCSSAnimationDisabled, isSyncEnabled, isLineWrappingEnabled, fontSize, fontFamily, panelPosition, audioDeviceName, audioEngineTarget, togglePanelTrigger, maxPolyphony, } = useSettings(); const shouldAlwaysSync = isUdels(); const canChangeAudioDevice = AudioContext.prototype.setSinkId != null; return (
{canChangeAudioDevice && ( { confirmDialog(RELOAD_MSG).then((r) => { if (r == true) { settingsMap.setKey('audioDeviceName', audioDeviceName); return window.location.reload(); } }); }} /> )} { confirmDialog(RELOAD_MSG).then((r) => { if (r == true) { settingsMap.setKey('audioEngineTarget', target); return window.location.reload(); } }); }} /> { let v = parseInt(e.target.value); v = isNaN(v) ? DEFAULT_MAX_POLYPHONY : v; setMaxPolyphony(v); settingsMap.setKey('maxPolyphony', v); }} onChange={(v) => { v = Math.max(1, parseInt(v)); settingsMap.setKey('maxPolyphony', isNaN(v) ? undefined : v); }} type="number" placeholder="" value={maxPolyphony ?? ''} /> settingsMap.setKey('theme', theme)} />
settingsMap.setKey('fontFamily', fontFamily)} /> settingsMap.setKey('fontSize', fontSize)} min={10} max={40} step={2} />
settingsMap.setKey('keybindings', keybindings)} items={{ codemirror: 'Codemirror', vim: 'Vim', emacs: 'Emacs', vscode: 'VSCode' }} > settingsMap.setKey('panelPosition', value)} items={{ bottom: 'Bottom', right: 'Right' }} > settingsMap.setKey('togglePanelTrigger', value)} items={{ click: 'Click', hover: 'Hover' }} /> settingsMap.setKey('isBracketMatchingEnabled', cbEvent.target.checked)} value={isBracketMatchingEnabled} /> settingsMap.setKey('isBracketClosingEnabled', cbEvent.target.checked)} value={isBracketClosingEnabled} /> settingsMap.setKey('isLineNumbersDisplayed', cbEvent.target.checked)} value={isLineNumbersDisplayed} /> settingsMap.setKey('isActiveLineHighlighted', cbEvent.target.checked)} value={isActiveLineHighlighted} /> settingsMap.setKey('isPatternHighlightingEnabled', cbEvent.target.checked)} value={isPatternHighlightingEnabled} /> settingsMap.setKey('isAutoCompletionEnabled', cbEvent.target.checked)} value={isAutoCompletionEnabled} /> settingsMap.setKey('isTooltipEnabled', cbEvent.target.checked)} value={isTooltipEnabled} /> settingsMap.setKey('isLineWrappingEnabled', cbEvent.target.checked)} value={isLineWrappingEnabled} /> settingsMap.setKey('isFlashEnabled', cbEvent.target.checked)} value={isFlashEnabled} /> { const newVal = cbEvent.target.checked; confirmDialog(RELOAD_MSG).then((r) => { if (r) { settingsMap.setKey('isSyncEnabled', newVal); window.location.reload(); } }); }} disabled={shouldAlwaysSync} value={isSyncEnabled} /> settingsMap.setKey('isButtonRowHidden', cbEvent.target.checked)} value={isButtonRowHidden} /> settingsMap.setKey('isCSSAnimationDisabled', cbEvent.target.checked)} value={isCSSAnimationDisabled} /> Try clicking the logo in the top left!
); }