diff --git a/src/uTimelineCtrl.pas b/src/uTimelineCtrl.pas index bf9b813..df16caa 100644 --- a/src/uTimelineCtrl.pas +++ b/src/uTimelineCtrl.pas @@ -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;