1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2025-present FERS Contributors (see AUTHORS.md).
4import DeleteIcon from '@mui/icons-material/Delete';
5import { Box, Button, IconButton } from '@mui/material';
6import { Timing, useScenarioStore } from '@/stores/scenarioStore';
7import { BufferedTextField, NumberField, Section } from './InspectorControls';
9interface TimingInspectorProps {
13export function TimingInspector({ item }: TimingInspectorProps) {
14 const { updateItem, addNoiseEntry, removeNoiseEntry } =
15 useScenarioStore.getState();
16 const handleChange = (path: string, value: unknown) =>
17 updateItem(item.id, path, value);
20 <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
28 onChange={(v) => handleChange('name', v)}
31 label="Frequency (Hz)"
32 value={item.frequency}
33 emptyBehavior="revert"
34 onChange={(v) => handleChange('frequency', v)}
37 label="Frequency Offset (Hz)"
38 value={item.freqOffset}
40 onChange={(v) => handleChange('freqOffset', v)}
43 label="Random Freq. Offset Stdev (Hz)"
44 value={item.randomFreqOffsetStdev}
46 onChange={(v) => handleChange('randomFreqOffsetStdev', v)}
49 label="Phase Offset (rad)"
50 value={item.phaseOffset}
52 onChange={(v) => handleChange('phaseOffset', v)}
55 label="Random Phase Offset Stdev (rad)"
56 value={item.randomPhaseOffsetStdev}
58 onChange={(v) => handleChange('randomPhaseOffsetStdev', v)}
60 <Section title="Noise Entries">
61 {item.noiseEntries.map((entry, index) => (
70 borderColor: 'divider',
74 <Box sx={{ flexGrow: 1, display: 'flex', gap: 1 }}>
78 emptyBehavior="revert"
81 `noiseEntries.${index}.alpha`,
89 emptyBehavior="revert"
92 `noiseEntries.${index}.weight`,
100 onClick={() => removeNoiseEntry(item.id, entry.id)}
102 <DeleteIcon fontSize="small" />
106 <Button onClick={() => addNoiseEntry(item.id)} size="small">