1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (c) 2025-present FERS Contributors (see AUTHORS.md).
4import { Box, TextField, Button, IconButton } from '@mui/material';
5import { useScenarioStore, Timing } from '@/stores/scenarioStore';
6import { NumberField, Section } from './InspectorControls';
7import DeleteIcon from '@mui/icons-material/Delete';
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 }}>
27 onChange={(e) => handleChange('name', e.target.value)}
30 label="Frequency (Hz)"
31 value={item.frequency}
32 onChange={(v) => handleChange('frequency', v)}
35 label="Frequency Offset (Hz)"
36 value={item.freqOffset}
37 onChange={(v) => handleChange('freqOffset', v)}
40 label="Random Freq. Offset Stdev (Hz)"
41 value={item.randomFreqOffsetStdev}
42 onChange={(v) => handleChange('randomFreqOffsetStdev', v)}
45 label="Phase Offset (rad)"
46 value={item.phaseOffset}
47 onChange={(v) => handleChange('phaseOffset', v)}
50 label="Random Phase Offset Stdev (rad)"
51 value={item.randomPhaseOffsetStdev}
52 onChange={(v) => handleChange('randomPhaseOffsetStdev', v)}
54 <Section title="Noise Entries">
55 {item.noiseEntries.map((entry, index) => (
64 borderColor: 'divider',
68 <Box sx={{ flexGrow: 1, display: 'flex', gap: 1 }}>
74 `noiseEntries.${index}.alpha`,
84 `noiseEntries.${index}.weight`,
92 onClick={() => removeNoiseEntry(item.id, entry.id)}
94 <DeleteIcon fontSize="small" />
98 <Button onClick={() => addNoiseEntry(item.id)} size="small">