mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-10 12:15:57 +02:00
Cocoa: Unify the Hidden concept of different ScrollBar Styles into the Available concept
This commit is contained in:
parent
10363b7140
commit
fc40f7730d
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user