From 37ee982ef3e0838c492f15265554ce63fa080638 Mon Sep 17 00:00:00 2001 From: rich2014 Date: Wed, 3 Jul 2024 22:38:51 +0800 Subject: [PATCH] Cocoa: prepare to improve ManualScrollView related --- lcl/interfaces/cocoa/cocoaconfig.pas | 6 ++ lcl/interfaces/cocoa/cocoascrollers.pas | 118 ++++++++++++++++++------ 2 files changed, 96 insertions(+), 28 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoaconfig.pas b/lcl/interfaces/cocoa/cocoaconfig.pas index 37a140f552..34ca3da5c9 100644 --- a/lcl/interfaces/cocoa/cocoaconfig.pas +++ b/lcl/interfaces/cocoa/cocoaconfig.pas @@ -49,6 +49,12 @@ var // Overly Style Scroller Knob Color CocoaScrollerLegacyStyleKnobColor : NSColorFunction = @getCocoaScrollerDefaultKnobColor; + // Overly Style Scroller Auto Show Delay Time, in Seconds + // the scrollbar is not shown because the value is updated, + // but because it is triggered by other factors, such as + // double-finger tapping the touchpad + CocoaScrollerOverlayStyleAutoShowDelayTime : Double = 0.2; + // Overly Style Scroller Auto Hide Delay Time, in Seconds CocoaScrollerOverlayStyleAutoHideDelayTime : Double = 0.9; diff --git a/lcl/interfaces/cocoa/cocoascrollers.pas b/lcl/interfaces/cocoa/cocoascrollers.pas index cb3c8f0c42..e825a43239 100644 --- a/lcl/interfaces/cocoa/cocoascrollers.pas +++ b/lcl/interfaces/cocoa/cocoascrollers.pas @@ -133,7 +133,9 @@ type // with Overlay Style, Availability means 'KnobProportion<1' function isAvailableScrollBar( scroller:NSScroller ): Boolean; virtual; abstract; // Show the Scroller if it can be made Available - procedure showScrollBar( scroller:NSScroller ); virtual; abstract; + procedure showScrollBar( scroller:NSScroller; now:Boolean=True ); virtual; abstract; + // Hide the Scroller but keep the Availability, only for Overlay Style + procedure tempHideScrollBar( scroller:NSScroller ); virtual; abstract; end; TCocoaManualScrollView = objcclass; @@ -317,21 +319,28 @@ type TCocoaScrollBarEffectOverlay = objcclass(TCocoaScrollBarEffectAlpha) private + procedure onDelayShowingTimer( timer:NSTimer ); message 'onDelayShowingTimer:'; procedure onDelayHidingTimer( timer:NSTimer ); message 'onDelayHidingTimer:'; procedure onExpandTimer( timer:NSTimer ); message 'onExpandTimer:'; + + procedure setDelayTimer( timeInterval:Double; onTimer:SEL ); + message 'setDelayTimer:timeInterval:'; protected currentKnobPosition: Double; currentKnobProportion: Double; entered: Boolean; expandedSize: Integer; - delayHidingTimer: NSTimer; + delayTimer: NSTimer; expandTimer: NSTimer; protected + procedure setDelayShowingTimer; message 'setDelayShowingTimer'; procedure setDelayHidingTimer; message 'setDelayHidingTimer'; procedure setExpandTimer; message 'setExpandTimer'; procedure onDestroy; override; + public + procedure cancelDelay; message 'cancelDelay'; end; { TCocoaScrollStyleManagerLegacy } @@ -348,7 +357,8 @@ type function createScrollBarEffect( scroller:NSScroller ): TCocoaScrollBarEffect; override; procedure availScrollBar( scroller:NSScroller; available:Boolean ); override; function isAvailableScrollBar( scroller:NSScroller ): Boolean; override; - procedure showScrollBar( scroller:NSScroller ); override; + procedure showScrollBar( scroller:NSScroller; now:Boolean=True ); override; + procedure tempHideScrollBar( scroller:NSScroller ); override; procedure updateLayOut; override; end; @@ -366,7 +376,8 @@ type function createScrollBarEffect( scroller:NSScroller ): TCocoaScrollBarEffect; override; procedure availScrollBar( scroller:NSScroller; available:Boolean ); override; function isAvailableScrollBar( scroller:NSScroller ): Boolean; override; - procedure showScrollBar( scroller:NSScroller ); override; + procedure showScrollBar( scroller:NSScroller; now:Boolean=True ); override; + procedure tempHideScrollBar( scroller:NSScroller ); override; procedure updateLayOut; override; end; @@ -670,10 +681,8 @@ begin _manager.updateLayout; - if self.hasHorizontalScroller then - _manager.showScrollBar(self.fhscroll); - if self.hasVerticalScroller then - _manager.showScrollBar(self.fvscroll); + _manager.showScrollBar(self.fhscroll); + _manager.showScrollBar(self.fvscroll); end; function TCocoaManualScrollView.lclGetCallback: ICommonCallback; @@ -1401,9 +1410,15 @@ end; { TCocoaScrollBarEffectOverlay } +procedure TCocoaScrollBarEffectOverlay.onDelayShowingTimer( timer: NSTimer ); +begin + self.delayTimer:= nil; + self.manager.showScrollBar( self.scroller ); +end; + procedure TCocoaScrollBarEffectOverlay.onDelayHidingTimer( timer:NSTimer ); begin - self.delayHidingTimer:= nil; + self.delayTimer:= nil; self.fade( CocoaConfig.CocoaScrollerOverlayStyleFadeStep, CocoaConfig.CocoaScrollerOverlayStyleFadeTo ); end; @@ -1431,30 +1446,41 @@ begin self.scroller.setNeedsDisplay_(True); end; -procedure TCocoaScrollBarEffectOverlay.setDelayHidingTimer; +procedure TCocoaScrollBarEffectOverlay.setDelayTimer( + timeInterval:Double; onTimer:SEL ); begin if Assigned(self.expandTimer) then begin self.expandTimer.invalidate; self.expandTimer:= nil; end; - if Assigned(self.delayHidingTimer) then - self.delayHidingTimer.invalidate; + self.cancelDelay; - self.delayHidingTimer:= NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats( - CocoaConfig.CocoaScrollerOverlayStyleAutoHideDelayTime, + self.delayTimer:= NSTimer.scheduledTimerWithTimeInterval_target_selector_userInfo_repeats( + timeInterval, self, - ObjCSelector('onDelayHidingTimer:'), + onTimer, nil, false ); end; +procedure TCocoaScrollBarEffectOverlay.setDelayShowingTimer; +begin + self.setDelayTimer( + CocoaScrollerOverlayStyleAutoShowDelayTime, + ObjCSelector('onDelayShowingTimer:') ); +end; + +procedure TCocoaScrollBarEffectOverlay.setDelayHidingTimer; +begin + self.setDelayTimer( + CocoaConfig.CocoaScrollerOverlayStyleAutoHideDelayTime, + ObjCSelector('onDelayHidingTimer:') ); +end; + procedure TCocoaScrollBarEffectOverlay.setExpandTimer; begin - if Assigned(self.delayHidingTimer) then begin - self.delayHidingTimer.invalidate; - self.delayHidingTimer:= nil; - end; + self.cancelDelay; if Assigned(self.expandTimer) then self.expandTimer.invalidate; @@ -1469,10 +1495,7 @@ end; procedure TCocoaScrollBarEffectOverlay.onDestroy; begin - if Assigned(self.delayHidingTimer) then begin - self.delayHidingTimer.invalidate; - self.delayHidingTimer:= nil; - end; + self.cancelDelay; if Assigned(self.expandTimer) then begin self.expandTimer.invalidate; self.expandTimer:= nil; @@ -1480,6 +1503,14 @@ begin inherited onDestroy; end; +procedure TCocoaScrollBarEffectOverlay.cancelDelay; +begin + if Assigned(self.delayTimer) then begin + self.delayTimer.invalidate; + self.delayTimer:= nil; + end; +end; + { TCocoaScrollStyleManager } constructor TCocoaScrollStyleManager.createForScrollBar; @@ -1598,13 +1629,22 @@ begin Result:= Assigned(scroller) and NOT scroller.isHidden; end; -procedure TCocoaScrollStyleManagerLegacy.showScrollBar(scroller: NSScroller); +procedure TCocoaScrollStyleManagerLegacy.showScrollBar( + scroller: NSScroller; now:Boolean ); begin + if NOT Assigned(scroller) then + Exit; + scroller.setHidden( False ); scroller.setAlphaValue( 1 ); scroller.setNeedsDisplay_( True ); end; +procedure TCocoaScrollStyleManagerLegacy.tempHideScrollBar(scroller: NSScroller + ); +begin +end; + procedure TCocoaScrollStyleManagerLegacy.onDrawKnob(scroller: NSScroller); var scrollBar: TCocoaScrollBar Absolute scroller; @@ -1809,11 +1849,15 @@ begin Result:= Assigned(scroller) and (0