From 06df910f7fe4fe5d1bfaae185c7578db0352ba00 Mon Sep 17 00:00:00 2001 From: rich2014 Date: Sat, 9 Aug 2025 18:49:29 +0800 Subject: [PATCH] Cocoa: improve Direction in TUpDown #41792 --- lcl/interfaces/cocoa/cocoabuttons.pas | 52 ++++++++++++++++++++---- lcl/interfaces/cocoa/cocoawscomctrls.pas | 5 ++- 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoabuttons.pas b/lcl/interfaces/cocoa/cocoabuttons.pas index d990febfcc..63e78ca619 100644 --- a/lcl/interfaces/cocoa/cocoabuttons.pas +++ b/lcl/interfaces/cocoa/cocoabuttons.pas @@ -143,25 +143,59 @@ end; procedure TCocoaStepper.stepperAction(sender: NSObject); var - newval : Double; allowChange : Boolean; updownpress : Boolean; + + function upOrDownWithoutWrap: Boolean; + begin + if self.doubleValue > self.lastValue then begin + Result:= True; + end else if self.doubleValue > self.lastValue then begin + Result:= False; + end else begin + if self.doubleValue = self.maxValue then + Result:= True + else + Result:= False; + end; + end; + + function upOrDownWithWrap: Boolean; + begin + if (self.doubleValue=self.minValue) and (self.lastValue=self.maxValue) then + Result:= True + else if (self.doubleValue=self.maxValue) and (self.lastValue=self.minValue) then + Result:= False + else if self.doubleValue > self.lastValue then + Result:= True + else + Result:= False; + end; + + function upOrDown: Boolean; + begin + if self.valueWraps then + Result:= upOrDownWithWrap + else + Result:= upOrDownWithoutWrap; + end; + begin - newval := doubleValue; - allowChange := true; - updownpress := newval > lastValue; + allowChange:= true; + updownpress:= upOrDown; if Assigned(callback) then begin - callback.BeforeChange(allowChange); - callback.Change(newval, updownpress, allowChange); + callback.BeforeChange( allowChange ); + callback.Change(self.doubleValue, updownpress, allowChange); end; if not allowChange then - setDoubleValue(lastValue) + setDoubleValue( self.lastValue ) else - lastValue := doubleValue; + self.lastValue:= doubleValue; - if Allowchange and Assigned(callback) then callback.UpdownClick(updownpress); + if allowChange and Assigned(callback) then + callback.UpdownClick( updownpress ); end; procedure TCocoaStepper.mouseDown(event: NSEvent); diff --git a/lcl/interfaces/cocoa/cocoawscomctrls.pas b/lcl/interfaces/cocoa/cocoawscomctrls.pas index 8525866920..44cc9ad2e1 100644 --- a/lcl/interfaces/cocoa/cocoawscomctrls.pas +++ b/lcl/interfaces/cocoa/cocoawscomctrls.pas @@ -221,7 +221,10 @@ begin //lResult.setControlSize(NSSmallControlSize); lResult.setTarget(lResult); lResult.setAction(objcselector('stepperAction:')); - + lResult.setMinValue( 0 ); + lResult.setMaxValue( 100 ); + lResult.setValueWraps( False ); + lResult.setAutorepeat( True ); end; Result := TLCLHandle(lResult); end;