summaryrefslogtreecommitdiff
path: root/apps/web
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2025-08-06 12:52:11 +0200
committerMaze Winther <mazewinther@gmail.com>2025-08-06 12:52:11 +0200
commitce58b5199adae444c6ade029c14c496379932d83 (patch)
tree8379e0ad5406a038a67a26ea16c53f914552f720 /apps/web
parent2c90ddd5d5f16c868f5e04943b64e0a3a78147f1 (diff)
downloadopencut-ce58b5199adae444c6ade029c14c496379932d83.tar.gz
feat: external files always create new tracks at playhead position
Diffstat (limited to 'apps/web')
-rw-r--r--apps/web/src/components/editor/timeline/index.tsx18
-rw-r--r--apps/web/src/components/editor/timeline/timeline-track.tsx12
2 files changed, 24 insertions, 6 deletions
diff --git a/apps/web/src/components/editor/timeline/index.tsx b/apps/web/src/components/editor/timeline/index.tsx
index bb8dfbc0..8bb20d72 100644
--- a/apps/web/src/components/editor/timeline/index.tsx
+++ b/apps/web/src/components/editor/timeline/index.tsx
@@ -53,7 +53,7 @@ import { SelectionBox } from "../selection-box";
import { useSelectionBox } from "@/hooks/use-selection-box";
import { SnapIndicator } from "../snap-indicator";
import { SnapPoint } from "@/hooks/use-timeline-snapping";
-import type { DragData, TimelineTrack } from "@/types/timeline";
+import type { DragData, TimelineTrack, TrackType } from "@/types/timeline";
import {
getTrackHeight,
getCumulativeHeightBefore,
@@ -490,7 +490,21 @@ export function Timeline() {
item.name === processedItem.name && item.url === processedItem.url
);
if (addedItem) {
- useTimelineStore.getState().addMediaToNewTrack(addedItem);
+ const trackType: TrackType =
+ addedItem.type === "audio" ? "audio" : "media";
+ const targetTrackId = useTimelineStore
+ .getState()
+ .insertTrackAt(trackType, 0);
+
+ useTimelineStore.getState().addElementToTrack(targetTrackId, {
+ type: "media",
+ mediaId: addedItem.id,
+ name: addedItem.name,
+ duration: addedItem.duration || 5,
+ startTime: currentTime,
+ trimStart: 0,
+ trimEnd: 0,
+ });
}
}
} catch (error) {
diff --git a/apps/web/src/components/editor/timeline/timeline-track.tsx b/apps/web/src/components/editor/timeline/timeline-track.tsx
index 75910c46..ff4797fb 100644
--- a/apps/web/src/components/editor/timeline/timeline-track.tsx
+++ b/apps/web/src/components/editor/timeline/timeline-track.tsx
@@ -15,6 +15,7 @@ import { usePlaybackStore } from "@/stores/playback-store";
import type {
TimelineElement as TimelineElementType,
DragData,
+ TrackType,
} from "@/types/timeline";
import {
snapTimeToFrame,
@@ -1061,7 +1062,7 @@ export function TimelineTrackContent({
return;
}
- // Process and add files to timeline at the drop position
+ // Process and add files to new timeline tracks at playhead position
processMediaFiles(e.dataTransfer.files)
.then(async (processedItems) => {
for (const processedItem of processedItems) {
@@ -1074,13 +1075,16 @@ export function TimelineTrackContent({
);
if (addedItem) {
- // Add to current track at the drop position
- addElementToTrack(track.id, {
+ const trackType: TrackType =
+ addedItem.type === "audio" ? "audio" : "media";
+ const targetTrackId = insertTrackAt(trackType, 0);
+
+ addElementToTrack(targetTrackId, {
type: "media",
mediaId: addedItem.id,
name: addedItem.name,
duration: addedItem.duration || 5,
- startTime: snappedTime,
+ startTime: currentTime,
trimStart: 0,
trimEnd: 0,
});