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_OKButton, typeof(Button))] [TemplatePart(PART_CancelButton, typeof(Button))] [TemplatePart(PART_YesButton, typeof(Button))] [TemplatePart(PART_NoButton, typeof(Button))] [TemplatePart(PART_TitleArea, typeof(Panel))] [PseudoClasses(PC_ExtendClientArea)] public class DialogControl: ContentControl { public const string PART_CloseButton = "PART_CloseButton"; public const string PART_OKButton = "PART_OKButton"; public const string PART_CancelButton = "PART_CancelButton"; public const string PART_YesButton = "PART_YesButton"; public const string PART_NoButton = "PART_NoButton"; public const string PART_TitleArea = "PART_TitleArea"; public const string PC_ExtendClientArea = ":extend"; public const string PC_Modal = ":modal"; private Button? _closeButton; private Button? _okButton; private Button? _cancelButton; private Button? _yesButton; private Button? _noButton; private Panel? _titleArea; public event EventHandler? OnDialogControlClose; public event EventHandler? OnLayerChange; public static readonly StyledProperty TitleProperty = AvaloniaProperty.Register( nameof(Title)); public string? Title { get => GetValue(TitleProperty); set => SetValue(TitleProperty, value); } public static readonly StyledProperty ExtendToClientAreaProperty = AvaloniaProperty.Register( nameof(ExtendToClientArea)); public bool ExtendToClientArea { get => GetValue(ExtendToClientAreaProperty); set => SetValue(ExtendToClientAreaProperty, value); } internal DialogButton Buttons { get; set; } static DialogControl() { DataContextProperty.Changed.AddClassHandler((o, e) => o.OnDataContextChange(e)); ExtendToClientAreaProperty.Changed.AddClassHandler((o, e) => o.PseudoClasses.Set(PC_ExtendClientArea, e.NewValue.Value)); } private void OnDataContextChange(AvaloniaPropertyChangedEventArgs args) { if (args.OldValue.Value is IDialogContext oldContext) { oldContext.Closed-= CloseFromContext; } if (args.NewValue.Value is IDialogContext newContext) { newContext.Closed += CloseFromContext; } } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); UnRegisterClickEvent(Close, _closeButton); UnRegisterClickEvent(DefaultButtonsClose, _okButton, _cancelButton, _yesButton, _noButton); _titleArea?.RemoveHandler(PointerMovedEvent, OnTitlePointerMove); _titleArea?.RemoveHandler(PointerPressedEvent, OnTitlePointerPressed); _closeButton = e.NameScope.Find