feat: add snapping settings and actions to timeline store

This commit is contained in:
Anwarul Islam 2025-07-15 04:25:16 +06:00
parent 4de81796a3
commit 2b57f3026c
1 changed files with 53 additions and 0 deletions

View File

@ -42,6 +42,22 @@ interface TimelineStore {
// Manual method if you need to force recomputation
getSortedTracks: () => TimelineTrack[];
// Snapping settings
snappingEnabled: boolean;
gridSnappingEnabled: boolean;
elementSnappingEnabled: boolean;
playheadSnappingEnabled: boolean;
snapThreshold: number;
gridInterval: number;
// Snapping actions
toggleSnapping: () => void;
toggleGridSnapping: () => void;
toggleElementSnapping: () => void;
togglePlayheadSnapping: () => void;
setSnapThreshold: (threshold: number) => void;
setGridInterval: (interval: number) => void;
// Multi-selection
selectedElements: { trackId: string; elementId: string }[];
selectElement: (trackId: string, elementId: string, multi?: boolean) => void;
@ -203,6 +219,14 @@ export const useTimelineStore = create<TimelineStore>((set, get) => {
redoStack: [],
selectedElements: [],
// Snapping settings defaults
snappingEnabled: true,
gridSnappingEnabled: true,
elementSnappingEnabled: true,
playheadSnappingEnabled: true,
snapThreshold: 10, // pixels
gridInterval: 1, // seconds
getSortedTracks: () => {
const { _tracks } = get();
const tracksWithMain = ensureMainTrack(_tracks);
@ -949,5 +973,34 @@ export const useTimelineStore = create<TimelineStore>((set, get) => {
updateTracks(defaultTracks);
set({ history: [], redoStack: [], selectedElements: [] });
},
// Snapping actions
toggleSnapping: () => {
set((state) => ({ snappingEnabled: !state.snappingEnabled }));
},
toggleGridSnapping: () => {
set((state) => ({ gridSnappingEnabled: !state.gridSnappingEnabled }));
},
toggleElementSnapping: () => {
set((state) => ({
elementSnappingEnabled: !state.elementSnappingEnabled,
}));
},
togglePlayheadSnapping: () => {
set((state) => ({
playheadSnappingEnabled: !state.playheadSnappingEnabled,
}));
},
setSnapThreshold: (threshold) => {
set({ snapThreshold: threshold });
},
setGridInterval: (interval) => {
set({ gridInterval: interval });
},
};
});