mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-03 11:00:33 +02:00
AnchorDocking: Make HighDPI aware. Fixes issue #36718
git-svn-id: trunk@65067 -
This commit is contained in:
parent
1b1306385e
commit
32591d0aff
@ -685,6 +685,7 @@ type
|
||||
procedure PopupMenuPopup(Sender: TObject);
|
||||
procedure ChangeLockButtonClick(Sender: TObject);
|
||||
procedure RefreshFloatingWindowsOnTop;
|
||||
function ScaleBoundsRect(ARect: TRect; FromDPI, ToDPI: integer): TRect;
|
||||
function ScaleChildX(p: integer): integer;
|
||||
function ScaleChildY(p: integer): integer;
|
||||
function ScaleTopLvlX(p: integer): integer;
|
||||
@ -2143,18 +2144,22 @@ var
|
||||
NewBounds: TRect;
|
||||
aMonitor: TMonitor;
|
||||
aHostSite: TAnchorDockHostSite;
|
||||
ParentForm: TCustomForm;
|
||||
begin
|
||||
if Site is TCustomForm then begin
|
||||
Site.Align:=alNone;
|
||||
TCustomForm(Site).DesignTimePPI:=ANode.PixelsPerInch;
|
||||
TCustomForm(Site).PixelsPerInch:=Screen.PixelsPerInch;
|
||||
if AParent=nil then
|
||||
TCustomForm(Site).WindowState:=ANode.WindowState
|
||||
else
|
||||
TCustomForm(Site).WindowState:=wsNormal;
|
||||
end else
|
||||
GetParentForm(Site).WindowState:=ANode.WindowState;
|
||||
end else begin
|
||||
ParentForm:=GetParentForm(Site);
|
||||
ParentForm.WindowState:=ANode.WindowState;
|
||||
ParentForm.PixelsPerInch:=Screen.PixelsPerInch;
|
||||
end;
|
||||
if Site is TAnchorDockPanel then
|
||||
GetParentForm(Site).BoundsRect:=ANode.BoundsRect
|
||||
ParentForm.BoundsRect:=ScaleBoundsRect(ANode.BoundsRect,ANode.PixelsPerInch,Screen.PixelsPerInch)
|
||||
else begin
|
||||
if AParent=nil then begin
|
||||
if (ANode.Monitor>=0) and (ANode.Monitor<Screen.MonitorCount) then
|
||||
@ -2163,7 +2168,7 @@ begin
|
||||
if Site is TCustomForm then
|
||||
aMonitor:=TCustomForm(Site).Monitor
|
||||
else
|
||||
aMonitor:=GetParentForm(Site).Monitor;
|
||||
aMonitor:=ParentForm.Monitor;
|
||||
end;
|
||||
WorkArea:=aMonitor.WorkareaRect;
|
||||
{$IFDEF VerboseAnchorDockRestore}
|
||||
@ -2180,7 +2185,7 @@ begin
|
||||
end;
|
||||
Site.Constraints.MaxWidth:=0;
|
||||
Site.Constraints.MaxHeight:=0;
|
||||
NewBounds:=ANode.BoundsRect;
|
||||
NewBounds:=ScaleBoundsRect(ANode.BoundsRect,ANode.PixelsPerInch,Screen.PixelsPerInch);
|
||||
if AParent=nil then begin
|
||||
NewBounds:=Rect(ScaleTopLvlX(NewBounds.Left),ScaleTopLvlY(NewBounds.Top),
|
||||
ScaleTopLvlX(NewBounds.Right),ScaleTopLvlY(NewBounds.Bottom));
|
||||
@ -2210,7 +2215,10 @@ begin
|
||||
{$IFDEF VerboseAnchorDockRestore}
|
||||
debugln(['TAnchorDockMaster.RestoreLayout.SetupSite custom Site=',DbgSName(Site),' Site.Bounds=',dbgs(Site.BoundsRect),' BoundSplitterPos=',aNode.BoundSplitterPos]);
|
||||
{$ENDIF}
|
||||
aManager.RestoreSite(ANode.BoundSplitterPos);
|
||||
if Application.Scaled then
|
||||
aManager.RestoreSite(MulDiv(ANode.BoundSplitterPos,Screen.PixelsPerInch,ANode.PixelsPerInch))
|
||||
else
|
||||
aManager.RestoreSite(ANode.BoundSplitterPos);
|
||||
Site.HostDockSite:=AParent;
|
||||
end;
|
||||
if Site is TAnchorDockHostSite then begin
|
||||
@ -2330,7 +2338,7 @@ function TAnchorDockMaster.RestoreLayout(Tree: TAnchorDockLayoutTree;
|
||||
debugln(['TAnchorDockMaster.RestoreLayout.Restore Splitter Node.Name=',aNode.Name,' ',dbgs(aNode.NodeType),' Splitter=',DbgSName(Splitter)]);
|
||||
{$ENDIF}
|
||||
Splitter.Parent:=AParent;
|
||||
NewBounds:=ANode.BoundsRect;
|
||||
NewBounds:=ScaleBoundsRect(ANode.BoundsRect,ANode.PixelsPerInch,Screen.PixelsPerInch);
|
||||
if SrcRectValid(SrcWorkArea) then
|
||||
NewBounds:=Rect(ScaleChildX(NewBounds.Left),ScaleChildY(NewBounds.Top),
|
||||
ScaleChildX(NewBounds.Right),ScaleChildY(NewBounds.Bottom));
|
||||
@ -2756,6 +2764,21 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TAnchorDockMaster.ScaleBoundsRect(ARect: TRect; FromDPI, ToDPI: integer): TRect;
|
||||
begin
|
||||
if not Application.Scaled or (FromDPI <= 0) or (ToDPI <= 0) then
|
||||
Result := ARect
|
||||
else begin
|
||||
Result.Left :=MulDiv(ARect.Left ,ToDPI,FromDPI);
|
||||
Result.Top :=MulDiv(ARect.Top ,ToDPI,FromDPI);
|
||||
Result.Width :=MulDiv(ARect.Width ,ToDPI,FromDPI);
|
||||
Result.Height:=MulDiv(ARect.Height,ToDPI,FromDPI);
|
||||
end;
|
||||
{$IFDEF VerboseAnchorDockRestore}
|
||||
debugln(['TAnchorDockMaster.ScaleBoundsRect FromDPI=',FromDPI,' ToDPI=',ToDPI,' FromRect[',dbgs(ARect),'] ToRect[',dbgs(Result),']']);
|
||||
{$ENDIF}
|
||||
end;
|
||||
|
||||
procedure TAnchorDockMaster.SetAllowDragging(AValue: boolean);
|
||||
begin
|
||||
if FAllowDragging=AValue then Exit;
|
||||
@ -6322,6 +6345,7 @@ begin
|
||||
else
|
||||
LayoutNode.BoundSplitterPos:=BoundSplitter.Top;
|
||||
end;
|
||||
LayoutNode.PixelsPerInch:=Screen.PixelsPerInch;
|
||||
end;
|
||||
|
||||
constructor TAnchorDockHostSite.CreateNew(AOwner: TComponent; Num: Integer);
|
||||
@ -7732,9 +7756,9 @@ begin
|
||||
else
|
||||
LayoutNode.NodeType:=adltnSplitterHorizontal;
|
||||
LayoutNode.Assign(Self,false,false);
|
||||
if not Enabled then begin
|
||||
if not Enabled then
|
||||
LayoutNode.BoundsRect:=GetSpliterBoundsWithUnminimizedDockSites;
|
||||
end
|
||||
LayoutNode.PixelsPerInch:=Screen.PixelsPerInch;
|
||||
end;
|
||||
|
||||
function TAnchorDockSplitter.HasOnlyOneSibling(Side: TAnchorKind; MinPos,
|
||||
|
@ -1070,7 +1070,7 @@ begin
|
||||
TabPosition:=tpTop;
|
||||
PageIndex:=0;
|
||||
BoundSplitterPos:=0;
|
||||
PixelsPerInch:=0;
|
||||
PixelsPerInch:=96;
|
||||
WorkAreaRect:=Rect(0,0,0,0);
|
||||
for a:=low(TAnchorKind) to high(TAnchorKind) do
|
||||
Anchors[a]:='';
|
||||
|
Loading…
Reference in New Issue
Block a user