feat: WIP dialog window.

This commit is contained in:
rabbitism
2024-01-21 23:40:06 +08:00
parent a0598b6a47
commit 2c361f9f3c
9 changed files with 193 additions and 19 deletions

View File

@@ -1,14 +1,26 @@
using System.Collections.Specialized;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Controls.Shapes;
using Avalonia.Input;
using Avalonia.Media;
using Avalonia.Utilities;
using Avalonia.VisualTree;
namespace Ursa.Controls;
namespace Ursa.Controls;
public class OverlayDialogHost: Canvas
{
private readonly List<DialogControl> _dialogs = new();
private readonly List<DialogControl> _modalDialogs = new();
private Rectangle _overlayMask = new()
{
Fill = new SolidColorBrush(new Color(1, 0, 0, 0)),
[Rectangle.ZIndexProperty] = 0,
};
public static readonly StyledProperty<string> HostIdProperty = AvaloniaProperty.Register<OverlayDialogHost, string>(
nameof(HostId));
@@ -39,13 +51,18 @@ public class OverlayDialogHost: Canvas
{
if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
{
var parent = item.FindAncestorOfType<DialogControl>();
if (parent is null)
{
return;
}
var p = e.GetPosition(this);
var left= p.X - _lastPoint.X;
var top = p.Y - _lastPoint.Y;
left = MathUtilities.Clamp(left, 0, Bounds.Width - item.Bounds.Width);
top = MathUtilities.Clamp(top, 0, Bounds.Height - item.Bounds.Height);
Canvas.SetLeft(item, left);
Canvas.SetTop(item, top);
left = MathUtilities.Clamp(left, 0, Bounds.Width - parent.Bounds.Width);
top = MathUtilities.Clamp(top, 0, Bounds.Height - parent.Bounds.Height);
Canvas.SetLeft(parent, left);
Canvas.SetTop(parent, top);
}
}
}
@@ -55,7 +72,22 @@ public class OverlayDialogHost: Canvas
base.OnPointerPressed(e);
if (e.Source is Control item)
{
_lastPoint = e.GetPosition(item);
var parent = item.FindAncestorOfType<DialogControl>();
if (parent is null)
{
return;
}
_lastPoint = e.GetPosition(parent);
}
}
public void AddDialog(DialogControl control)
{
this.Children.Add(control);
}
public void AddModalDialog(DialogControl control)
{
this.Children.Add(control);
}
}