From 36ccbd30154713fc55ac445f282271715145a01d Mon Sep 17 00:00:00 2001 From: 4aiman Date: Sun, 30 Aug 2026 18:43:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B7=20=D0=B4=D0=B0=D1=91=D1=82?= =?UTF-8?q?=20=D1=85=D0=B2=D0=BE=D1=81=D1=82=D1=83=20=D1=81=D0=B2=D0=BE?= =?UTF-8?q?=D1=8E=20=D1=81=D0=B2=D1=8F=D0=B7=D0=BA=D1=83:=20=D1=83=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D1=83=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B1=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=83=D0=BD=D0=BE=D1=81=D0=B8=D1=82=20=D0=B2=D0=B5=D1=81=D1=8C?= =?UTF-8?q?=20=D0=BA=D0=BB=D0=B8=D0=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Del удалял весь исходный клип вместо выделенного куска, и звук вместе с ним. Причина: при резе хвост наследовал номер связки головы, а удаление расширяет выделение на всю связку — обе половины оказывались одной связкой и умирали вместе. Дальнейшие резы наследовали тот же номер, так что от удаления одного куска исчезали все. Теперь хвост получает новый номер связки. Один на весь рез: все хвосты, отрезанные от одной связки, остаются связанными между собой — картинка со своим звуком, как и было задумано. Проверено на монтаже: клип 0..4 с парным звуком разрезан на 2 с, удалён первый кусок. Было — исчезал весь клип и весь его звук. Стало — остались хвост 2..4 со своим звуком в новой связке и нетронутый соседний клип 4..8. Проекты, разрезанные прежней сборкой, останутся со сцепленными половинами: у них один номер связки на всё. Развязать их можно Ctrl+G. --- src/uTimelineCtrl.pas | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) 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