fix: element trimming, allow infinite trimStart for text/image elements

This commit is contained in:
Maze Winther 2025-07-18 12:52:11 +02:00
parent d98638bfe6
commit 6ce8434615
1 changed files with 29 additions and 9 deletions

View File

@ -102,20 +102,40 @@ export function useTimelineElementResize({
const deltaTime = deltaX / (50 * zoomLevel);
if (resizing.side === "left") {
// Left resize - trim content AND move element position to the right
// Left resize - different behavior for media vs text/image elements
const maxAllowed = element.duration - resizing.initialTrimEnd - 0.1;
const calculated = resizing.initialTrimStart + deltaTime;
const newTrimStart = Math.max(0, Math.min(maxAllowed, calculated));
// Calculate how much the trim changed and update startTime accordingly
const trimDelta = newTrimStart - resizing.initialTrimStart;
const newStartTime = element.startTime + trimDelta;
if (calculated >= 0) {
// Normal trimming within available content
const newTrimStart = Math.min(maxAllowed, calculated);
const trimDelta = newTrimStart - resizing.initialTrimStart;
const newStartTime = element.startTime + trimDelta;
// Update both trim and start time for proper left resize behavior
onUpdateTrim(track.id, element.id, newTrimStart, resizing.initialTrimEnd);
onUpdateTrim(track.id, element.id, newTrimStart, resizing.initialTrimEnd);
updateElementStartTime(track.id, element.id, newStartTime);
} else {
// Trying to extend beyond trimStart = 0
if (canExtendElementDuration()) {
// Text/Image: extend element to the left by moving startTime and increasing duration
const extensionAmount = Math.abs(calculated);
const newStartTime = element.startTime - extensionAmount;
const newDuration = element.duration + extensionAmount;
// Update startTime so element moves to the right when trimming from left
updateElementStartTime(track.id, element.id, newStartTime);
// Keep trimStart at 0 and extend the element
onUpdateTrim(track.id, element.id, 0, resizing.initialTrimEnd);
onUpdateDuration(track.id, element.id, newDuration);
updateElementStartTime(track.id, element.id, newStartTime);
} else {
// Video/Audio: can't extend beyond original content - limit to trimStart = 0
const newTrimStart = 0;
const trimDelta = newTrimStart - resizing.initialTrimStart;
const newStartTime = element.startTime + trimDelta;
onUpdateTrim(track.id, element.id, newTrimStart, resizing.initialTrimEnd);
updateElementStartTime(track.id, element.id, newStartTime);
}
}
} else {
// Right resize - can extend duration for supported element types
const calculated = resizing.initialTrimEnd - deltaTime;