diff --git a/src/uTimelineCtrl.pas b/src/uTimelineCtrl.pas index 16d8a15..1a3c5d8 100644 --- a/src/uTimelineCtrl.pas +++ b/src/uTimelineCtrl.pas @@ -2105,12 +2105,18 @@ var AnyChange: Boolean; Offset: Double; HoverGroup: string; + { Старый номер связки — новый. Одна связка при резе становится двумя: + голова со своей парой и хвост со своей. } + NewGroups: TStringList; + Idx: Integer; begin if FProject = nil then Exit; AnyChange := False; FProject.BeginChange; + NewGroups := TStringList.Create; + try { Связка режется целиком. Резать только картинку, оставив звук цельным, значит развалить пару: дальше они поедут порознь. } @@ -2155,7 +2161,26 @@ begin Tail.FadeIn := 0; Tail.FadeOut := Clip.FadeOut; Tail.Transform := Clip.Transform; - Tail.GroupId := Clip.GroupId; + + { Связка хвоста — новая. + + Оставить прежнюю значило бы связать между собой куски, которые + после реза стали разными клипами: удаление одного уносило бы и + второй, и весь исходный клип целиком. Проверено на монтаже — от + удаления куска 0..2 исчезал весь клип 0..4 вместе со звуком. + + Новый номер один на весь рез: все хвосты, отрезанные от одной + связки, остаются связанными между собой — картинка со своим + звуком. } + if Clip.GroupId = '' then + Tail.GroupId := '' + else + begin + Idx := NewGroups.IndexOfName(Clip.GroupId); + if Idx < 0 then + NewGroups.Add(Clip.GroupId + '=' + FProject.NewGroupId); + Tail.GroupId := NewGroups.Values[Clip.GroupId]; + end; { Новый рез описывается одинаково с обеих сторон: конец первой части и начало второй — это одно и то же место. } @@ -2176,6 +2201,10 @@ begin AnyChange := True; end; + finally + NewGroups.Free; + end; + if AnyChange then StructureChanged else