using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Metadata; using Avalonia.Controls.Primitives; using Avalonia.Input; using Avalonia.Interactivity; using Ursa.Common; namespace Ursa.Controls; [TemplatePart(PART_CloseButton, typeof(Button))] [TemplatePart(PART_TitleArea, typeof(Panel))] [PseudoClasses(PC_Modal)] public class DialogControl: ContentControl { public const string PART_CloseButton = "PART_CloseButton"; public const string PART_TitleArea = "PART_TitleArea"; public const string PC_Modal = ":modal"; protected internal Button? _closeButton; private Panel? _titleArea; internal HorizontalPosition HorizontalAnchor { get; set; } internal VerticalPosition VerticalAnchor { get; set; } internal double? InitialHorizontalOffset { get; set; } internal double? InitialVerticalOffset { get; set; } internal bool CanClickOnMaskToClose { get; set; } public event EventHandler? LayerChanged; public event EventHandler? DialogControlClosing; static DialogControl() { DataContextProperty.Changed.AddClassHandler((o, e) => o.OnDataContextChange(e)); } private void OnDataContextChange(AvaloniaPropertyChangedEventArgs args) { if (args.OldValue.Value is IDialogContext oldContext) { oldContext.RequestClose-= OnContextRequestClose; } if (args.NewValue.Value is IDialogContext newContext) { newContext.RequestClose += OnContextRequestClose; } } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); EventHelper.UnregisterClickEvent(Close, _closeButton); _titleArea?.RemoveHandler(PointerMovedEvent, OnTitlePointerMove); _titleArea?.RemoveHandler(PointerPressedEvent, OnTitlePointerPressed); _closeButton = e.NameScope.Find