mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
feat: add snap point notification to TimelineTrackContent for improved snapping feedback
This commit is contained in:
@@ -22,14 +22,16 @@ import {
|
|||||||
TIMELINE_CONSTANTS,
|
TIMELINE_CONSTANTS,
|
||||||
} from "@/constants/timeline-constants";
|
} from "@/constants/timeline-constants";
|
||||||
import { useProjectStore } from "@/stores/project-store";
|
import { useProjectStore } from "@/stores/project-store";
|
||||||
import { useTimelineSnapping } from "@/hooks/use-timeline-snapping";
|
import { useTimelineSnapping, SnapPoint } from "@/hooks/use-timeline-snapping";
|
||||||
|
|
||||||
export function TimelineTrackContent({
|
export function TimelineTrackContent({
|
||||||
track,
|
track,
|
||||||
zoomLevel,
|
zoomLevel,
|
||||||
|
onSnapPointChange,
|
||||||
}: {
|
}: {
|
||||||
track: TimelineTrack;
|
track: TimelineTrack;
|
||||||
zoomLevel: number;
|
zoomLevel: number;
|
||||||
|
onSnapPointChange?: (snapPoint: SnapPoint | null) => void;
|
||||||
}) {
|
}) {
|
||||||
const { mediaItems } = useMediaStore();
|
const { mediaItems } = useMediaStore();
|
||||||
const {
|
const {
|
||||||
@@ -106,6 +108,7 @@ export function TimelineTrackContent({
|
|||||||
|
|
||||||
// Apply snapping if enabled
|
// Apply snapping if enabled
|
||||||
let finalTime = adjustedTime;
|
let finalTime = adjustedTime;
|
||||||
|
let snapPoint = null;
|
||||||
if (snappingEnabled) {
|
if (snappingEnabled) {
|
||||||
const snapResult = snapElementPosition(
|
const snapResult = snapElementPosition(
|
||||||
adjustedTime,
|
adjustedTime,
|
||||||
@@ -115,11 +118,18 @@ export function TimelineTrackContent({
|
|||||||
dragState.elementId || undefined
|
dragState.elementId || undefined
|
||||||
);
|
);
|
||||||
finalTime = snapResult.snappedTime;
|
finalTime = snapResult.snappedTime;
|
||||||
|
snapPoint = snapResult.snapPoint;
|
||||||
|
|
||||||
|
// Notify parent component about snap point change
|
||||||
|
onSnapPointChange?.(snapPoint);
|
||||||
} else {
|
} else {
|
||||||
// Use frame snapping if project has FPS, otherwise use decimal snapping
|
// Use frame snapping if project has FPS, otherwise use decimal snapping
|
||||||
const projectStore = useProjectStore.getState();
|
const projectStore = useProjectStore.getState();
|
||||||
const projectFps = projectStore.activeProject?.fps || 30;
|
const projectFps = projectStore.activeProject?.fps || 30;
|
||||||
finalTime = snapTimeToFrame(adjustedTime, projectFps);
|
finalTime = snapTimeToFrame(adjustedTime, projectFps);
|
||||||
|
|
||||||
|
// Clear snap point when not snapping
|
||||||
|
onSnapPointChange?.(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateDragTime(finalTime);
|
updateDragTime(finalTime);
|
||||||
@@ -140,6 +150,8 @@ export function TimelineTrackContent({
|
|||||||
dragState.currentTime
|
dragState.currentTime
|
||||||
);
|
);
|
||||||
endDragAction();
|
endDragAction();
|
||||||
|
// Clear snap point when drag ends
|
||||||
|
onSnapPointChange?.(null);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -236,6 +248,8 @@ export function TimelineTrackContent({
|
|||||||
|
|
||||||
if (isTrackThatStartedDrag) {
|
if (isTrackThatStartedDrag) {
|
||||||
endDragAction();
|
endDragAction();
|
||||||
|
// Clear snap point when drag ends
|
||||||
|
onSnapPointChange?.(null);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -261,6 +275,7 @@ export function TimelineTrackContent({
|
|||||||
endDragAction,
|
endDragAction,
|
||||||
selectedElements,
|
selectedElements,
|
||||||
selectElement,
|
selectElement,
|
||||||
|
onSnapPointChange,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const handleElementMouseDown = (
|
const handleElementMouseDown = (
|
||||||
|
|||||||
Reference in New Issue
Block a user