Cocoa: NSScrollViewSetScrollPos refactored

This commit is contained in:
rich2014 2024-02-15 23:25:36 +08:00
parent 48c3b8d61b
commit 5a7b7dbf37
3 changed files with 28 additions and 49 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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