feat: add snap point notification to TimelineTrackContent for improved snapping feedback

This commit is contained in:
Anwarul Islam
2025-07-15 07:06:29 +06:00
parent 2cc25b70d5
commit e3cb491a29
@@ -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 = (