mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
feat: add snapping settings and actions to timeline store
This commit is contained in:
@@ -42,6 +42,22 @@ interface TimelineStore {
|
|||||||
// Manual method if you need to force recomputation
|
// Manual method if you need to force recomputation
|
||||||
getSortedTracks: () => TimelineTrack[];
|
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
|
// Multi-selection
|
||||||
selectedElements: { trackId: string; elementId: string }[];
|
selectedElements: { trackId: string; elementId: string }[];
|
||||||
selectElement: (trackId: string, elementId: string, multi?: boolean) => void;
|
selectElement: (trackId: string, elementId: string, multi?: boolean) => void;
|
||||||
@@ -203,6 +219,14 @@ export const useTimelineStore = create<TimelineStore>((set, get) => {
|
|||||||
redoStack: [],
|
redoStack: [],
|
||||||
selectedElements: [],
|
selectedElements: [],
|
||||||
|
|
||||||
|
// Snapping settings defaults
|
||||||
|
snappingEnabled: true,
|
||||||
|
gridSnappingEnabled: true,
|
||||||
|
elementSnappingEnabled: true,
|
||||||
|
playheadSnappingEnabled: true,
|
||||||
|
snapThreshold: 10, // pixels
|
||||||
|
gridInterval: 1, // seconds
|
||||||
|
|
||||||
getSortedTracks: () => {
|
getSortedTracks: () => {
|
||||||
const { _tracks } = get();
|
const { _tracks } = get();
|
||||||
const tracksWithMain = ensureMainTrack(_tracks);
|
const tracksWithMain = ensureMainTrack(_tracks);
|
||||||
@@ -949,5 +973,34 @@ export const useTimelineStore = create<TimelineStore>((set, get) => {
|
|||||||
updateTracks(defaultTracks);
|
updateTracks(defaultTracks);
|
||||||
set({ history: [], redoStack: [], selectedElements: [] });
|
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 });
|
||||||
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user