summaryrefslogtreecommitdiff
path: root/apps/web/src/timeline/placement/main-track.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/web/src/timeline/placement/main-track.ts')
-rw-r--r--apps/web/src/timeline/placement/main-track.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/apps/web/src/timeline/placement/main-track.ts b/apps/web/src/timeline/placement/main-track.ts
new file mode 100644
index 00000000..ab2ab7bd
--- /dev/null
+++ b/apps/web/src/timeline/placement/main-track.ts
@@ -0,0 +1,54 @@
+import type { SceneTracks, TimelineElement, VideoTrack } from "@/timeline";
+
+export const MAIN_TRACK_NAME = "Main Track";
+
+export function getEarliestMainTrackElement({
+ mainTrack,
+ excludeElementId,
+}: {
+ mainTrack: VideoTrack;
+ excludeElementId?: string;
+}): TimelineElement | null {
+ const elements = mainTrack.elements.filter((element) => {
+ return !excludeElementId || element.id !== excludeElementId;
+ });
+ if (elements.length === 0) {
+ return null;
+ }
+
+ return elements.reduce((earliestElement, element) => {
+ return element.startTime < earliestElement.startTime
+ ? element
+ : earliestElement;
+ });
+}
+
+export function enforceMainTrackStart({
+ tracks,
+ targetTrackId,
+ requestedStartTime,
+ excludeElementId,
+}: {
+ tracks: SceneTracks;
+ targetTrackId: string;
+ requestedStartTime: number;
+ excludeElementId?: string;
+}): number {
+ if (tracks.main.id !== targetTrackId) {
+ return requestedStartTime;
+ }
+
+ const earliestElement = getEarliestMainTrackElement({
+ mainTrack: tracks.main,
+ excludeElementId,
+ });
+ if (!earliestElement) {
+ return 0;
+ }
+
+ if (requestedStartTime <= earliestElement.startTime) {
+ return 0;
+ }
+
+ return requestedStartTime;
+}