Прокрутка у кромки помнит зажатые клавиши

Тик повторяет движение мыши за человека. Shift при растягивании края
отменяет прилипание, и повторение с пустым набором клавиш заставляло край
прыгать между тиками: тик с прилипанием, рука без него.
This commit is contained in:
4aiman 2026-10-15 23:36:44 +03:00
commit 6cc9f5e8a8

View file

@ -176,6 +176,10 @@ type
FEdgeTimer: TTimer;
FEdgeX: Integer;
FEdgeY: Integer;
{ Клавиши, зажатые при последнем движении мыши. Тик повторяет
движение за человека, и Shift при этом обязан остаться зажатым:
он отменяет прилипание, и без него край прыгал бы между тиками. }
FEdgeShift: TShiftState;
FDragTrackFrom: Integer;
FOnMediaDrop: TMediaDropEvent;
FOnClipTransform: TClipEvent;
@ -276,7 +280,7 @@ type
procedure EdgeTimerTick(Sender: TObject);
{ Включает и выключает слежение за кромкой. }
procedure SetEdgeScroll(AOn: Boolean; const AX: Integer = 0;
const AY: Integer = 0);
const AY: Integer = 0; const AShift: TShiftState = []);
procedure CollectRippleClips(ATrackIndex: Integer; AExclude: TClip;
const AFromTime: Double);
procedure ApplyRipple(const ADelta: Double);
@ -2444,7 +2448,7 @@ begin
{ Пока тащат клип или край, следим за кромкой окна: у края монтаж
едет следом сам, даже если рука остановилась. }
SetEdgeScroll(FAction in [taDragClip, taTrimIn, taTrimOut, taRubberBand],
X, Y);
X, Y, Shift);
case FAction of
taPan:
@ -2841,16 +2845,18 @@ begin
end;
else
{ У краёв клипа своё движение, но пересчитывается оно там же, где и
от мыши: повторяем событие с теми же координатами. }
MouseMove([], FEdgeX, FEdgeY);
от мыши: повторяем событие с теми же координатами и теми же
зажатыми клавишами. }
MouseMove(FEdgeShift, FEdgeX, FEdgeY);
end;
end;
procedure TTimelineControl.SetEdgeScroll(AOn: Boolean; const AX: Integer;
const AY: Integer);
const AY: Integer; const AShift: TShiftState);
begin
FEdgeX := AX;
FEdgeY := AY;
FEdgeShift := AShift;
if FEdgeTimer.Enabled <> AOn then
FEdgeTimer.Enabled := AOn;
end;