Browse Source
Add more platform specific screen from Window/Rect/Point methods. # Conflicts: # src/Avalonia.Controls/ApiCompatBaseline.txt # src/Avalonia.Controls/Screens.cspull/7930/head
17 changed files with 239 additions and 29 deletions
@ -0,0 +1,54 @@ |
|||
using System.Collections.Generic; |
|||
using Avalonia.Utilities; |
|||
|
|||
#nullable enable |
|||
|
|||
namespace Avalonia.Platform |
|||
{ |
|||
public static class ScreenHelper |
|||
{ |
|||
public static Screen? ScreenFromPoint(PixelPoint point, IReadOnlyList<Screen> screens) |
|||
{ |
|||
foreach (Screen screen in screens) |
|||
{ |
|||
if (screen.Bounds.ContainsExclusive(point)) |
|||
{ |
|||
return screen; |
|||
} |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
public static Screen? ScreenFromRect(PixelRect bounds, IReadOnlyList<Screen> screens) |
|||
{ |
|||
Screen? currMaxScreen = null; |
|||
double maxAreaSize = 0; |
|||
|
|||
foreach (Screen screen in screens) |
|||
{ |
|||
double left = MathUtilities.Clamp(bounds.X, screen.Bounds.X, screen.Bounds.X + screen.Bounds.Width); |
|||
double top = MathUtilities.Clamp(bounds.Y, screen.Bounds.Y, screen.Bounds.Y + screen.Bounds.Height); |
|||
double right = MathUtilities.Clamp(bounds.X + bounds.Width, screen.Bounds.X, screen.Bounds.X + screen.Bounds.Width); |
|||
double bottom = MathUtilities.Clamp(bounds.Y + bounds.Height, screen.Bounds.Y, screen.Bounds.Y + screen.Bounds.Height); |
|||
double area = (right - left) * (bottom - top); |
|||
if (area > maxAreaSize) |
|||
{ |
|||
maxAreaSize = area; |
|||
currMaxScreen = screen; |
|||
} |
|||
} |
|||
|
|||
return currMaxScreen; |
|||
} |
|||
|
|||
public static Screen? ScreenFromWindow(IWindowBaseImpl window, IReadOnlyList<Screen> screens) |
|||
{ |
|||
var rect = new PixelRect( |
|||
window.Position, |
|||
PixelSize.FromSize(window.FrameSize ?? window.ClientSize, window.DesktopScaling)); |
|||
|
|||
return ScreenFromRect(rect, screens); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue