import { PlaybackManager } from "./managers/playback-manager"; import { TimelineManager } from "./managers/timeline-manager"; import { ScenesManager } from "./managers/scenes-manager"; import { ProjectManager } from "./managers/project-manager"; import { MediaManager } from "./managers/media-manager"; import { RendererManager } from "./managers/renderer-manager"; import { CommandManager } from "./managers/commands"; import { SaveManager } from "./managers/save-manager"; import { AudioManager } from "./managers/audio-manager"; import { SelectionManager } from "./managers/selection-manager"; import { registerDefaultEffects } from "@/lib/effects"; import { registerDefaultMasks } from "@/lib/masks"; import { isMainTrack } from "@/lib/timeline/placement"; export class EditorCore { private static instance: EditorCore | null = null; public readonly timeline: TimelineManager; public readonly command: CommandManager; public readonly playback: PlaybackManager; public readonly scenes: ScenesManager; public readonly project: ProjectManager; public readonly media: MediaManager; public readonly renderer: RendererManager; public readonly save: SaveManager; public readonly audio: AudioManager; public readonly selection: SelectionManager; private constructor() { registerDefaultEffects(); registerDefaultMasks(); this.command = new CommandManager(this); this.timeline = new TimelineManager(this); this.playback = new PlaybackManager(this); this.scenes = new ScenesManager(this); this.project = new ProjectManager(this); this.media = new MediaManager(this); this.renderer = new RendererManager(this); this.save = new SaveManager(this); this.audio = new AudioManager(this); this.selection = new SelectionManager(this); this.command.registerReactor(() => { const tracks = this.timeline.getTracks(); const prunedTracks = tracks.filter( (track) => track.elements.length > 0 || isMainTrack(track), ); if (prunedTracks.length !== tracks.length) { this.timeline.updateTracks(prunedTracks); } }); this.save.start(); } static getInstance(): EditorCore { if (!EditorCore.instance) { EditorCore.instance = new EditorCore(); } return EditorCore.instance; } static reset(): void { EditorCore.instance = null; } }