Система синхронизации переходов обеспечивает автоматическое обновление переходов при изменении клипов на таймлайне.
Сервис для синхронизации переходов при операциях с клипами.
// Синхронизация при перемещении клипа
syncTransitionsOnClipMove(
project: TimelineProject,
clipId: string,
oldTrackId: string,
newTrackId: string,
oldPosition: number,
newPosition: number,
oldDuration: number,
): TimelineProject
// Синхронизация при обрезке клипа
syncTransitionsOnClipTrim(
project: TimelineProject,
clipId: string,
trackId: string,
oldStartTime: number,
newStartTime: number,
oldDuration: number,
newDuration: number,
): TimelineProject
// Обработка переходов при удалении клипа
syncTransitionsOnClipDelete(
project: TimelineProject,
clipId: string,
): TimelineProject
// Обработка переходов при разрезании клипа
syncTransitionsOnClipSplit(
project: TimelineProject,
originalClipId: string,
leftClipId: string,
rightClipId: string,
splitTime: number,
): TimelineProjectHook для управления синхронизацией переходов.
const {
syncMoveClip,
syncTrimClip,
syncRemoveClip,
syncSplitClip,
findClip,
} = useTransitionSync({ project, updateProject })Обёртка над useClips с автоматической синхронизацией переходов.
const clips = useClipsWithTransitions()
// Все операции с клипами автоматически синхронизируют переходы
await clips.moveClip(clipId, newTrackId, newPosition)
await clips.trimClip(clipId, newStartTime, newDuration)
await clips.removeClip(clipId)- Между треками: Все связанные переходы удаляются
- В пределах трека: Переходы корректируют позиции
- Переход на вход: Позиция = новая начальная позиция клипа
- Переход на выход: Позиция = новая конечная позиция - длительность перехода
- Переход между клипами: Корректируется в зависимости от того, какой клип обрезается
Удаляются все переходы, связанные с клипом:
- Переход на вход (type: "in")
- Переход на выход (type: "out")
- Переходы между клипами (type: "between")
- Переход на вход: Остаётся с левым клипом
- Переход на выход: Переходит к правому клипу
- Переход "до": Остаётся с левым клипом
- Переход "после": Переходит к правому клипу
// Проверка возможности добавления перехода
canAddTransition(
project: TimelineProject,
trackId: string,
position: number,
duration: number,
excludeId?: string,
): boolean
// Устранение коллизий после операции
resolveTransitionCollisions(
project: TimelineProject,
trackId: string,
changedTransitionId?: string,
): TimelineProjectПанель управления переходами автоматически использует useTimelineTransitions для обновления и удаления переходов.
const { updateTransition, removeTransition } = useTimelineTransitions()
// Обновление перехода
updateTransition(transitionId, updates)
// Удаление перехода
removeTransition(transitionId)// Было
const handleMoveClip = async (clipId: string, newTrackId: string, newPosition: number) => {
await moveClip(clipId, newTrackId, newPosition)
}
// Стало
const handleMoveClip = async (clipId: string, newTrackId: string, newPosition: number) => {
const clip = findClip(clipId)
if (clip) {
const oldTrackId = clip.trackId
const oldPosition = clip.startTime
const duration = clip.duration
await moveClip(clipId, newTrackId, newPosition)
syncMoveClip(clipId, oldTrackId, newTrackId, oldPosition, newPosition, duration)
}
}const clips = useClipsWithTransitions()
// Все операции автоматически синхронизируют переходы
const handleOperations = async () => {
// Перемещение
await clips.moveClip("clip1", "track2", 10.0)
// Обрезка
await clips.trimClip("clip2", 5.0, 3.0)
// Удаление
await clips.removeClip("clip3")
}- Backend интеграция: В текущей реализации синхронизация работает только на клиентской стороне
- Split операция: Требует возврата IDs новых клипов для полной синхронизации
- Undo/Redo: Синхронизация переходов не интегрирована с системой отмены/повтора
- Интеграция с backend для персистентности изменений
- Поддержка групповых операций с клипами
- Автоматическое разрешение коллизий при вставке
- Визуальная индикация конфликтов переходов