From 08653013fda18a214c336fc5979a0d1d260ac0b5 Mon Sep 17 00:00:00 2001 From: rich2014 Date: Wed, 3 Jul 2024 22:51:47 +0800 Subject: [PATCH] Cocoa: Trackpad Tapping in ManualScrollView supported --- lcl/interfaces/cocoa/cocoascrollers.pas | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/lcl/interfaces/cocoa/cocoascrollers.pas b/lcl/interfaces/cocoa/cocoascrollers.pas index fc7bd809cc..fdf2e37526 100644 --- a/lcl/interfaces/cocoa/cocoascrollers.pas +++ b/lcl/interfaces/cocoa/cocoascrollers.pas @@ -254,6 +254,8 @@ type procedure delayShowScrollBars; message 'delayShowScrollBars'; procedure showScrollBarsAndAutoHide( tapping:Integer ); message 'showScrollBarsAndAutoHide:'; + function isTapping( scroller:NSScroller ): Boolean; message 'isTapping:'; + procedure onBarScrolled( scroller:NSScroller ); message 'onBarScrolled:'; procedure touchesBeganWithEvent(event: NSEvent); override; procedure touchesEndedWithEvent(event: NSEvent); override; procedure touchesCancelledWithEvent(event: NSEvent); override; @@ -763,6 +765,33 @@ begin Result:=fdocumentView; end; +function TCocoaManualScrollView.isTapping(scroller: NSScroller): Boolean; +begin + if _tapping < 0 then + Exit( False ); + if _tapping = SB_BOTH then + Exit( True ); + if (_tapping = SB_HORZ) and (scroller=self.fhscroll) then + Exit( True ); + if (_tapping = SB_VERT) and (scroller=self.fvscroll) then + Exit( True ); + Result:= False; +end; + +procedure TCocoaManualScrollView.onBarScrolled(scroller: NSScroller); +begin + if _tapping < 0 then + Exit; + + if scroller=self.fvscroll then begin + _tapping:= SB_VERT; + _manager.tempHideScrollBar( fhscroll ); + end else if scroller=self.fhscroll then begin + _tapping:= SB_HORZ; + _manager.tempHideScrollBar( fvscroll ); + end; +end; + procedure TCocoaManualScrollView.delayShowScrollBars(); begin _manager.showScrollBar( self.fhscroll, False ); @@ -1871,6 +1900,9 @@ begin if (effect.currentKnobPosition=knobPosition) and (effect.currentKnobProportion=knobProportion) then Exit; + if effect.currentKnobPosition <> knobPosition then + _scrollView.onBarScrolled( scroller ); + effect.currentKnobPosition:= knobPosition; effect.currentKnobProportion:= knobProportion; @@ -1952,6 +1984,9 @@ begin Exit; end; + if NOT _scrollView.isTapping(scroller) and NOT effect.entered then + effect.setDelayHidingTimer; + // on old versions of macOS, alpha=0 is considered hidden. // that is, to be truly visible, not only Hidden=false, but Alpha must also be set. // otherwise it is considered hidden and setNeedsDisplay() does not take effect.