Cocoa: Unify the Hidden concept of different ScrollBar Styles into the Available concept

This commit is contained in:
rich2014 2024-06-29 13:49:47 +08:00
parent 10363b7140
commit fc40f7730d
2 changed files with 76 additions and 47 deletions

View File

@ -92,7 +92,9 @@ type
function createScrollBarEffect( scroller:NSScroller ): function createScrollBarEffect( scroller:NSScroller ):
TCocoaScrollBarEffect; virtual; abstract; TCocoaScrollBarEffect; virtual; abstract;
procedure activeScrollBar( scroller:NSScroller; active:Boolean ); virtual; abstract; procedure availScrollBar( scroller:NSScroller; available:Boolean ); virtual; abstract;
function isAvailableScrollBar( scroller:NSScroller ): Boolean; virtual; abstract;
procedure showScrollBar( scroller:NSScroller ); virtual; abstract;
end; end;
TCocoaManualScrollView = objcclass; TCocoaManualScrollView = objcclass;
@ -281,7 +283,9 @@ type
procedure onMouseEntered( scroller:NSScroller ); override; procedure onMouseEntered( scroller:NSScroller ); override;
procedure onMouseExited( scroller:NSScroller ); override; procedure onMouseExited( scroller:NSScroller ); override;
function createScrollBarEffect( scroller:NSScroller ): TCocoaScrollBarEffect; override; function createScrollBarEffect( scroller:NSScroller ): TCocoaScrollBarEffect; override;
procedure activeScrollBar( scroller:NSScroller; active:Boolean ); override; procedure availScrollBar( scroller:NSScroller; available:Boolean ); override;
function isAvailableScrollBar( scroller:NSScroller ): Boolean; override;
procedure showScrollBar( scroller:NSScroller ); override;
procedure updateLayOut; override; procedure updateLayOut; override;
end; end;
@ -297,7 +301,9 @@ type
procedure onMouseEntered( scroller:NSScroller ); override; procedure onMouseEntered( scroller:NSScroller ); override;
procedure onMouseExited( scroller:NSScroller ); override; procedure onMouseExited( scroller:NSScroller ); override;
function createScrollBarEffect( scroller:NSScroller ): TCocoaScrollBarEffect; override; function createScrollBarEffect( scroller:NSScroller ): TCocoaScrollBarEffect; override;
procedure activeScrollBar( scroller:NSScroller; active:Boolean ); override; procedure availScrollBar( scroller:NSScroller; available:Boolean ); override;
function isAvailableScrollBar( scroller:NSScroller ): Boolean; override;
procedure showScrollBar( scroller:NSScroller ); override;
procedure updateLayOut; override; procedure updateLayOut; override;
end; end;
@ -632,26 +638,26 @@ procedure TCocoaManualScrollView.setHasVerticalScroller(doshow: Boolean);
begin begin
if NOT Assigned(fvscroll) and doshow then if NOT Assigned(fvscroll) and doshow then
fvscroll:= self.allocVerticalScroller( True ); fvscroll:= self.allocVerticalScroller( True );
manager.activeScrollBar( fvscroll, doshow ); self.manager.availScrollBar( fvscroll, doshow );
manager.updateLayout; self.manager.updateLayout;
end; end;
procedure TCocoaManualScrollView.setHasHorizontalScroller(doshow: Boolean); procedure TCocoaManualScrollView.setHasHorizontalScroller(doshow: Boolean);
begin begin
if NOT Assigned(fhscroll) and doshow then if NOT Assigned(fhscroll) and doshow then
fhscroll:= self.allocHorizontalScroller( True ); fhscroll:= self.allocHorizontalScroller( True );
manager.activeScrollBar( fhscroll, doshow ); self.manager.availScrollBar( fhscroll, doshow );
manager.updateLayout; self.manager.updateLayout;
end; end;
function TCocoaManualScrollView.hasVerticalScroller: Boolean; function TCocoaManualScrollView.hasVerticalScroller: Boolean;
begin begin
Result:=Assigned(fvscroll) and (not fvscroll.isHidden); Result:= self.manager.isAvailableScrollBar(fvscroll);
end; end;
function TCocoaManualScrollView.hasHorizontalScroller: Boolean; function TCocoaManualScrollView.hasHorizontalScroller: Boolean;
begin begin
Result:=Assigned(fhscroll) and (not fhscroll.isHidden); Result:= self.manager.isAvailableScrollBar(fhscroll);
end; end;
function TCocoaManualScrollView.horizontalScroller: NSScroller; function TCocoaManualScrollView.horizontalScroller: NSScroller;
@ -1345,7 +1351,7 @@ begin
hScroller:= _scrollView.fhscroll; hScroller:= _scrollView.fhscroll;
vScroller:= _scrollView.fvscroll; vScroller:= _scrollView.fvscroll;
if Assigned(hScroller) and (not hScroller.isHidden) then if self.isAvailableScrollBar(hScroller) then
begin begin
hScrollerHeight := NSScroller.scrollerWidthForControlSize_scrollerStyle( hScrollerHeight := NSScroller.scrollerWidthForControlSize_scrollerStyle(
hScroller.controlSize, hScroller.preferredScrollerStyle); hScroller.controlSize, hScroller.preferredScrollerStyle);
@ -1357,7 +1363,7 @@ begin
docFrame.origin.y := hScrollerHeight; docFrame.origin.y := hScrollerHeight;
end; end;
if Assigned(vScroller) and (not vScroller.isHidden) then if self.isAvailableScrollBar(vScroller) then
begin begin
vScrollerWidth := NSScroller.scrollerWidthForControlSize_scrollerStyle( vScrollerWidth := NSScroller.scrollerWidthForControlSize_scrollerStyle(
vScroller.controlSize, vScroller.preferredScrollerStyle); vScroller.controlSize, vScroller.preferredScrollerStyle);
@ -1402,25 +1408,37 @@ begin
Result:= effect; Result:= effect;
end; end;
procedure TCocoaScrollStyleManagerLegacy.activeScrollBar( procedure TCocoaScrollStyleManagerLegacy.availScrollBar(
scroller: NSScroller; active: Boolean); scroller: NSScroller; available: Boolean);
begin begin
if NOT active then begin if NOT Assigned(scroller) then
if Assigned(scroller) and NOT scroller.isHidden then Exit;
scroller.setHidden( True );
if NOT available then begin
scroller.setHidden( True );
Exit; Exit;
end; end;
if NOT Assigned(scroller) then
scroller := _scrollView.allocVerticalScroller(true);
if scroller.isHidden then if scroller.isHidden then
begin begin
scroller.setHidden(false); scroller.setHidden( false );
scroller.setAlphaValue(1); scroller.setAlphaValue( 1 );
end; end;
end; end;
function TCocoaScrollStyleManagerLegacy.isAvailableScrollBar(scroller: NSScroller
): Boolean;
begin
Result:= Assigned(scroller) and NOT scroller.isHidden;
end;
procedure TCocoaScrollStyleManagerLegacy.showScrollBar(scroller: NSScroller);
begin
scroller.setHidden( False );
scroller.setAlphaValue( 1 );
scroller.setNeedsDisplay_( True );
end;
procedure TCocoaScrollStyleManagerLegacy.onDrawKnob(scroller: NSScroller); procedure TCocoaScrollStyleManagerLegacy.onDrawKnob(scroller: NSScroller);
var var
scrollBar: TCocoaScrollBar Absolute scroller; scrollBar: TCocoaScrollBar Absolute scroller;
@ -1553,26 +1571,7 @@ begin
knobProportion:= 25/slotSize; knobProportion:= 25/slotSize;
end; end;
effect.currentKnobPosition:= knobPosition; self.showScrollBar( scroller );
effect.currentKnobProportion:= knobProportion;
if knobProportion=1 then begin
scroller.setAlphaValue(0);
scroller.setHidden(True);
Exit;
end;
if NOT effect.entered then begin
effect.setDelayHidingTimer;
effect.currentAlpha:= 0.5;
end;
// 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.
scroller.setAlphaValue( effect.currentAlpha );
scroller.setHidden( False );
scroller.setNeedsDisplay_( true );
end; end;
procedure TCocoaScrollStyleManagerOverlay.onMouseEntered(scroller: NSScroller); procedure TCocoaScrollStyleManagerOverlay.onMouseEntered(scroller: NSScroller);
@ -1610,8 +1609,8 @@ begin
Result:= effect; Result:= effect;
end; end;
procedure TCocoaScrollStyleManagerOverlay.activeScrollBar( procedure TCocoaScrollStyleManagerOverlay.availScrollBar(
scroller: NSScroller; active: Boolean); scroller: NSScroller; available: Boolean);
begin begin
if NOT Assigned(scroller) then if NOT Assigned(scroller) then
Exit; Exit;
@ -1619,8 +1618,39 @@ begin
if scroller.knobProportion=1 then begin if scroller.knobProportion=1 then begin
scroller.setAlphaValue( 0 ); scroller.setAlphaValue( 0 );
scroller.setHidden( True ); scroller.setHidden( True );
end;
end;
function TCocoaScrollStyleManagerOverlay.isAvailableScrollBar(scroller: NSScroller
): Boolean;
begin
Result:= Assigned(scroller) and (scroller.knobProportion<1);
end;
procedure TCocoaScrollStyleManagerOverlay.showScrollBar(scroller: NSScroller);
var
scrollBar: TCocoaScrollBar Absolute scroller;
effect: TCocoaScrollBarEffectOverlay;
begin
effect:= TCocoaScrollBarEffectOverlay(scrollBar.effect);
if scroller.knobProportion=1 then begin
scroller.setAlphaValue(0);
scroller.setHidden(True);
Exit; Exit;
end; end;
if NOT effect.entered then begin
effect.setDelayHidingTimer;
effect.currentAlpha:= 0.5;
end;
// 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.
scroller.setAlphaValue( effect.currentAlpha );
scroller.setHidden( False );
scroller.setNeedsDisplay_( true );
end; end;
procedure TCocoaScrollStyleManagerOverlay.updateLayOut; procedure TCocoaScrollStyleManagerOverlay.updateLayOut;

View File

@ -1678,11 +1678,10 @@ begin
begin begin
mn := TCocoaManualScrollView(obj); mn := TCocoaManualScrollView(obj);
case SBStyle of case SBStyle of
SB_Vert: Result := mn.hasVerticalScroller and not mn.verticalScroller.isHidden; SB_Vert: Result := mn.hasVerticalScroller;
SB_Horz: Result := mn.hasHorizontalScroller and not mn.horizontalScroller.isHidden; SB_Horz: Result := mn.hasHorizontalScroller;
else else
Result := mn.hasHorizontalScroller and not mn.horizontalScroller.isHidden Result := mn.hasHorizontalScroller and mn.hasVerticalScroller;
and mn.hasVerticalScroller and not mn.verticalScroller.isHidden;
end; end;
end end
else else