Рез даёт хвосту свою связку: удаление куска больше не уносит весь клип

Del удалял весь исходный клип вместо выделенного куска, и звук вместе с
ним. Причина: при резе хвост наследовал номер связки головы, а удаление
расширяет выделение на всю связку — обе половины оказывались одной
связкой и умирали вместе. Дальнейшие резы наследовали тот же номер, так
что от удаления одного куска исчезали все.

Теперь хвост получает новый номер связки. Один на весь рез: все хвосты,
отрезанные от одной связки, остаются связанными между собой — картинка
со своим звуком, как и было задумано.

Проверено на монтаже: клип 0..4 с парным звуком разрезан на 2 с, удалён
первый кусок. Было — исчезал весь клип и весь его звук. Стало — остались
хвост 2..4 со своим звуком в новой связке и нетронутый соседний клип
4..8.

Проекты, разрезанные прежней сборкой, останутся со сцепленными
половинами: у них один номер связки на всё. Развязать их можно Ctrl+G.
This commit is contained in:
4aiman 2026-08-30 18:43:21 +03:00
commit 36ccbd3015

View file

@ -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