feat: apply defaultTrackHeight and defaultZoom settings
- Modified createTrack and createTrackFromBuffer to accept height parameter - Updated useMultiTrack to pass height when creating tracks - Applied settings.ui.defaultTrackHeight when adding new tracks - Applied settings.editor.defaultZoom for initial zoom state - Removed duplicate useSettings hook declaration in AudioEditor - New tracks now use configured default height from settings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -50,9 +50,19 @@ import {
|
|||||||
import { getAudioContext } from '@/lib/audio/context';
|
import { getAudioContext } from '@/lib/audio/context';
|
||||||
|
|
||||||
export function AudioEditor() {
|
export function AudioEditor() {
|
||||||
|
// Settings hook
|
||||||
|
const {
|
||||||
|
settings,
|
||||||
|
updateAudioSettings,
|
||||||
|
updateUISettings,
|
||||||
|
updateEditorSettings,
|
||||||
|
updatePerformanceSettings,
|
||||||
|
resetCategory,
|
||||||
|
} = useSettings();
|
||||||
|
|
||||||
const [importDialogOpen, setImportDialogOpen] = React.useState(false);
|
const [importDialogOpen, setImportDialogOpen] = React.useState(false);
|
||||||
const [selectedTrackId, setSelectedTrackId] = React.useState<string | null>(null);
|
const [selectedTrackId, setSelectedTrackId] = React.useState<string | null>(null);
|
||||||
const [zoom, setZoom] = React.useState(1);
|
const [zoom, setZoom] = React.useState(settings.editor.defaultZoom);
|
||||||
const [masterVolume, setMasterVolume] = React.useState(0.8);
|
const [masterVolume, setMasterVolume] = React.useState(0.8);
|
||||||
const [masterPan, setMasterPan] = React.useState(0);
|
const [masterPan, setMasterPan] = React.useState(0);
|
||||||
const [isMasterMuted, setIsMasterMuted] = React.useState(false);
|
const [isMasterMuted, setIsMasterMuted] = React.useState(false);
|
||||||
@@ -90,16 +100,6 @@ export function AudioEditor() {
|
|||||||
setSampleRate,
|
setSampleRate,
|
||||||
} = useRecording();
|
} = useRecording();
|
||||||
|
|
||||||
// Settings hook
|
|
||||||
const {
|
|
||||||
settings,
|
|
||||||
updateAudioSettings,
|
|
||||||
updateUISettings,
|
|
||||||
updateEditorSettings,
|
|
||||||
updatePerformanceSettings,
|
|
||||||
resetCategory,
|
|
||||||
} = useSettings();
|
|
||||||
|
|
||||||
// Multi-track hooks
|
// Multi-track hooks
|
||||||
const {
|
const {
|
||||||
tracks,
|
tracks,
|
||||||
@@ -122,19 +122,19 @@ export function AudioEditor() {
|
|||||||
// Wrap addTrack to auto-select first track when adding to empty project
|
// Wrap addTrack to auto-select first track when adding to empty project
|
||||||
const addTrack = React.useCallback((name?: string) => {
|
const addTrack = React.useCallback((name?: string) => {
|
||||||
const shouldAutoSelect = shouldAutoSelectRef.current;
|
const shouldAutoSelect = shouldAutoSelectRef.current;
|
||||||
const track = addTrackOriginal(name);
|
const track = addTrackOriginal(name, settings.ui.defaultTrackHeight);
|
||||||
if (shouldAutoSelect) {
|
if (shouldAutoSelect) {
|
||||||
setSelectedTrackId(track.id);
|
setSelectedTrackId(track.id);
|
||||||
shouldAutoSelectRef.current = false; // Only auto-select once
|
shouldAutoSelectRef.current = false; // Only auto-select once
|
||||||
}
|
}
|
||||||
return track;
|
return track;
|
||||||
}, [addTrackOriginal]);
|
}, [addTrackOriginal, settings.ui.defaultTrackHeight]);
|
||||||
|
|
||||||
// Wrap addTrackFromBuffer to auto-select first track when adding to empty project
|
// Wrap addTrackFromBuffer to auto-select first track when adding to empty project
|
||||||
const addTrackFromBuffer = React.useCallback((buffer: AudioBuffer, name?: string) => {
|
const addTrackFromBuffer = React.useCallback((buffer: AudioBuffer, name?: string) => {
|
||||||
console.log(`[AudioEditor] addTrackFromBuffer wrapper called: ${name}, shouldAutoSelect: ${shouldAutoSelectRef.current}`);
|
console.log(`[AudioEditor] addTrackFromBuffer wrapper called: ${name}, shouldAutoSelect: ${shouldAutoSelectRef.current}`);
|
||||||
const shouldAutoSelect = shouldAutoSelectRef.current;
|
const shouldAutoSelect = shouldAutoSelectRef.current;
|
||||||
const track = addTrackFromBufferOriginal(buffer, name);
|
const track = addTrackFromBufferOriginal(buffer, name, settings.ui.defaultTrackHeight);
|
||||||
console.log(`[AudioEditor] Track created: ${track.name} (${track.id})`);
|
console.log(`[AudioEditor] Track created: ${track.name} (${track.id})`);
|
||||||
if (shouldAutoSelect) {
|
if (shouldAutoSelect) {
|
||||||
console.log(`[AudioEditor] Auto-selecting track: ${track.id}`);
|
console.log(`[AudioEditor] Auto-selecting track: ${track.id}`);
|
||||||
@@ -142,7 +142,7 @@ export function AudioEditor() {
|
|||||||
shouldAutoSelectRef.current = false; // Only auto-select once
|
shouldAutoSelectRef.current = false; // Only auto-select once
|
||||||
}
|
}
|
||||||
return track;
|
return track;
|
||||||
}, [addTrackFromBufferOriginal]);
|
}, [addTrackFromBufferOriginal, settings.ui.defaultTrackHeight]);
|
||||||
|
|
||||||
// Track which parameters are being touched (for touch/latch modes)
|
// Track which parameters are being touched (for touch/latch modes)
|
||||||
const [touchedParameters, setTouchedParameters] = React.useState<Set<string>>(new Set());
|
const [touchedParameters, setTouchedParameters] = React.useState<Set<string>>(new Set());
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export function generateTrackId(): string {
|
|||||||
/**
|
/**
|
||||||
* Create a new empty track
|
* Create a new empty track
|
||||||
*/
|
*/
|
||||||
export function createTrack(name?: string, color?: TrackColor): Track {
|
export function createTrack(name?: string, color?: TrackColor, height?: number): Track {
|
||||||
const colors: TrackColor[] = ['blue', 'green', 'purple', 'orange', 'pink', 'indigo', 'yellow', 'red'];
|
const colors: TrackColor[] = ['blue', 'green', 'purple', 'orange', 'pink', 'indigo', 'yellow', 'red'];
|
||||||
const randomColor = colors[Math.floor(Math.random() * colors.length)];
|
const randomColor = colors[Math.floor(Math.random() * colors.length)];
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ export function createTrack(name?: string, color?: TrackColor): Track {
|
|||||||
id: trackId,
|
id: trackId,
|
||||||
name: trackName,
|
name: trackName,
|
||||||
color: TRACK_COLORS[color || randomColor],
|
color: TRACK_COLORS[color || randomColor],
|
||||||
height: DEFAULT_TRACK_HEIGHT,
|
height: height ?? DEFAULT_TRACK_HEIGHT,
|
||||||
audioBuffer: null,
|
audioBuffer: null,
|
||||||
volume: 0.8,
|
volume: 0.8,
|
||||||
pan: 0,
|
pan: 0,
|
||||||
@@ -70,11 +70,12 @@ export function createTrack(name?: string, color?: TrackColor): Track {
|
|||||||
export function createTrackFromBuffer(
|
export function createTrackFromBuffer(
|
||||||
buffer: AudioBuffer,
|
buffer: AudioBuffer,
|
||||||
name?: string,
|
name?: string,
|
||||||
color?: TrackColor
|
color?: TrackColor,
|
||||||
|
height?: number
|
||||||
): Track {
|
): Track {
|
||||||
// Ensure name is a string before passing to createTrack
|
// Ensure name is a string before passing to createTrack
|
||||||
const trackName = typeof name === 'string' && name.trim() ? name.trim() : undefined;
|
const trackName = typeof name === 'string' && name.trim() ? name.trim() : undefined;
|
||||||
const track = createTrack(trackName, color);
|
const track = createTrack(trackName, color, height);
|
||||||
track.audioBuffer = buffer;
|
track.audioBuffer = buffer;
|
||||||
return track;
|
return track;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,14 +6,14 @@ export function useMultiTrack() {
|
|||||||
// Note: localStorage persistence disabled in favor of IndexedDB project management
|
// Note: localStorage persistence disabled in favor of IndexedDB project management
|
||||||
const [tracks, setTracks] = useState<Track[]>([]);
|
const [tracks, setTracks] = useState<Track[]>([]);
|
||||||
|
|
||||||
const addTrack = useCallback((name?: string) => {
|
const addTrack = useCallback((name?: string, height?: number) => {
|
||||||
const track = createTrack(name);
|
const track = createTrack(name, undefined, height);
|
||||||
setTracks((prev) => [...prev, track]);
|
setTracks((prev) => [...prev, track]);
|
||||||
return track;
|
return track;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const addTrackFromBuffer = useCallback((buffer: AudioBuffer, name?: string) => {
|
const addTrackFromBuffer = useCallback((buffer: AudioBuffer, name?: string, height?: number) => {
|
||||||
const track = createTrackFromBuffer(buffer, name);
|
const track = createTrackFromBuffer(buffer, name, undefined, height);
|
||||||
setTracks((prev) => [...prev, track]);
|
setTracks((prev) => [...prev, track]);
|
||||||
return track;
|
return track;
|
||||||
}, []);
|
}, []);
|
||||||
|
|||||||
Reference in New Issue
Block a user