From 5a7b7dbf37e0cbe271063fd338b7986be2abbb73 Mon Sep 17 00:00:00 2001 From: rich2014 Date: Thu, 15 Feb 2024 23:25:36 +0800 Subject: [PATCH] Cocoa: NSScrollViewSetScrollPos refactored --- lcl/interfaces/cocoa/cocoaint.pas | 46 ------------------------- lcl/interfaces/cocoa/cocoascrollers.pas | 25 ++++++++++++++ lcl/interfaces/cocoa/cocoawinapi.inc | 6 ++-- 3 files changed, 28 insertions(+), 49 deletions(-) diff --git a/lcl/interfaces/cocoa/cocoaint.pas b/lcl/interfaces/cocoa/cocoaint.pas index 08d7300163..e2f4b80102 100644 --- a/lcl/interfaces/cocoa/cocoaint.pas +++ b/lcl/interfaces/cocoa/cocoaint.pas @@ -250,8 +250,6 @@ var function CocoaScrollBarSetScrollInfo(bar: TCocoaScrollBar; const ScrollInfo: TScrollInfo): Integer; function CocoaScrollBarGetScrollInfo(bar: TCocoaScrollBar; var ScrollInfo: TScrollInfo): Boolean; -procedure NSScrollerSetScrollInfo(docSz, pageSz: CGFloat; rl: NSSCroller; const ScrollInfo: TScrollInfo); -procedure NSScrollViewSetScrollPos(sc: NSScrollView; BarFlag: Integer; const ScrollInfo: TScrollInfo); function CocoaPromptUser(const DialogCaption, DialogMessage: String; DialogType: longint; Buttons: PLongint; ButtonCount, DefaultIndex, @@ -412,50 +410,6 @@ begin Result:=true; end; -procedure NSScrollerSetScrollInfo(docSz, pageSz: CGFloat; rl: NSSCroller; const ScrollInfo: TScrollInfo); -var - sz : CGFloat; -begin - if ScrollInfo.fMask and SIF_POS>0 then begin - sz:=docSz-pageSz; - if sz=0 then rl.setFloatValue(0) - else rl.setFloatValue(ScrollInfo.nPos/sz); - end; - if ScrollInfo.fMask and SIF_PAGE>0 then begin - sz:=docSz-pageSz; - if sz=0 then rl.setKnobProportion(1) - else rl.setKnobProportion(1/sz); - end; -end; - -procedure NSScrollViewSetScrollPos(sc: NSScrollView; BarFlag: Integer; const ScrollInfo: TScrollInfo); -var - cocoaSc: TCocoaScrollView Absolute sc; - newOrigin : NSPoint; -begin - if not Assigned(sc.documentView) then Exit; - - newOrigin:=sc.contentView.bounds.origin; - if BarFlag = SB_Vert then - begin - if sc.isKindOfClass(TCocoaScrollView) then - cocoaSc.lclVertScrollInfo:= ScrollInfo; - //NSScrollerSetScrollInfo(ns.frame.size.height, sc.verticalScroller, ScrollInfo) - if not sc.documentView.isFlipped then - newOrigin.y := sc.documentView.frame.size.height - ScrollInfo.nPos - sc.contentSize.height - else - newOrigin.y := ScrollInfo.nPos; - end - else - begin - if sc.isKindOfClass(TCocoaScrollView) then - cocoaSc.lclHoriScrollInfo:= ScrollInfo; - //NSScrollerSetScrollInfo(ns.frame.size.width, sc.horizontalScroller, ScrollInfo); - newOrigin.x:=ScrollInfo.nPos; - end; - sc.contentView.setBoundsOrigin( newOrigin ); -end; - { TModalSession } constructor TModalSession.Create(awin: NSWindow; asess: NSModalSession; diff --git a/lcl/interfaces/cocoa/cocoascrollers.pas b/lcl/interfaces/cocoa/cocoascrollers.pas index 427b01d8d4..d714394e2a 100644 --- a/lcl/interfaces/cocoa/cocoascrollers.pas +++ b/lcl/interfaces/cocoa/cocoascrollers.pas @@ -61,6 +61,7 @@ type procedure lclInvalidate; override; procedure fillScrollInfo(barFlag: Integer; var scrollInfo: TScrollInfo); message 'fillScrollInfo:barFlag:'; + procedure applyScrollInfo(barFlag: Integer; const scrollInfo: TScrollInfo); message 'applyScrollInfo:barFlag:'; end; { TCocoaManualScrollView } @@ -750,6 +751,30 @@ begin fillScrollerScrollInfo(docSize.width, self.contentSize.width, self.horizontalScroller); end; +procedure TCocoaScrollView.applyScrollInfo(barFlag: Integer; + const scrollInfo: TScrollInfo); +var + newOrigin : NSPoint; +begin + if not Assigned(self.documentView) then Exit; + + newOrigin:= self.contentView.bounds.origin; + if BarFlag = SB_Vert then + begin + self.lclVertScrollInfo:= scrollInfo; + if not self.documentView.isFlipped then + newOrigin.y := self.documentView.frame.size.height - scrollInfo.nPos - self.contentSize.height + else + newOrigin.y := scrollInfo.nPos; + end + else + begin + self.lclHoriScrollInfo:= scrollInfo; + newOrigin.x:= scrollInfo.nPos; + end; + self.contentView.setBoundsOrigin( newOrigin ); +end; + function TCocoaScrollView.initWithFrame(ns: NSRect): id; var sc : TCocoaScrollView; diff --git a/lcl/interfaces/cocoa/cocoawinapi.inc b/lcl/interfaces/cocoa/cocoawinapi.inc index 5a268d28f8..8013af2e2f 100644 --- a/lcl/interfaces/cocoa/cocoawinapi.inc +++ b/lcl/interfaces/cocoa/cocoawinapi.inc @@ -1762,16 +1762,16 @@ begin // frame changed, Need to update another ScrollBar too if SbStyle=SB_Horz then begin if sc.lclVertScrollInfo.fMask<>0 then - NSScrollViewSetScrollPos(sc, SB_Vert, sc.lclVertScrollInfo) + sc.applyScrollInfo(SB_Vert, sc.lclVertScrollInfo) end else begin if sc.lclHoriScrollInfo.fMask<>0 then - NSScrollViewSetScrollPos(sc, SB_Horz, sc.lclHoriScrollInfo); + sc.applyScrollInfo(SB_Horz, sc.lclHoriScrollInfo); end; end; // if frame changed, another ScrollBar has been updated if ScrollInfo.fMask and SIF_ALL > 0 then - NSScrollViewSetScrollPos(sc, SBStyle, ScrollInfo); + sc.applyScrollInfo(SBStyle, ScrollInfo); Result:= getNewScrollPos(); end else if obj.isKindOfClass(TCocoaManualScrollView) then begin