using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using System.Collections.ObjectModel; namespace InABox.Avalonia.Dialogs; public partial class MessageDialogViewModel : BasePopupViewModel { [ObservableProperty] private string _message; public ObservableCollection Buttons { get; private set; } = new(); public IEnumerable LeftButtons => Buttons.Where(x => x.Position == MessageDialogButtonPosition.Left); public IEnumerable RightButtons => Buttons.Where(x => x.Position == MessageDialogButtonPosition.Right); public MessageDialogViewModel() { Message = ""; } [RelayCommand] private void ButtonClick(MessageDialogButton button) { button.Action(this, button); } public MessageDialogViewModel AddButton(MessageDialogButton button) { Buttons.Add(button); return this; } public MessageDialogViewModel AddOkButton(string content = "OK") { Buttons.Add(new MessageDialogButton(content, OKButton_Click, MessageDialogButtonPosition.Right)); return this; } public MessageDialogViewModel AddCancelButton(string content = "Cancel") { Buttons.Add(new MessageDialogButton(content, CancelButton_Click, MessageDialogButtonPosition.Right)); return this; } public MessageDialogViewModel AddYesButton(string content = "Yes") { Buttons.Add(new MessageDialogButton(content, YesButton_Click, MessageDialogButtonPosition.Right)); return this; } public MessageDialogViewModel AddNoButton(string content = "No") { Buttons.Add(new MessageDialogButton(content, NoButton_Click, MessageDialogButtonPosition.Right)); return this; } private void YesButton_Click(MessageDialogViewModel window, MessageDialogButton button) { window.Close(MessageDialogResult.Yes); } private void NoButton_Click(MessageDialogViewModel window, MessageDialogButton button) { window.Close(MessageDialogResult.No); } private void CancelButton_Click(MessageDialogViewModel window, MessageDialogButton button) { window.Close(MessageDialogResult.Cancel); } private void OKButton_Click(MessageDialogViewModel window, MessageDialogButton button) { window.Close(MessageDialogResult.OK); } #region Static Constructors public static MessageDialogViewModel New() { return new MessageDialogViewModel(); } public static MessageDialogViewModel NewMessage(string message) { return new MessageDialogViewModel() .Message(message) .AddOkButton(); } public static async Task ShowMessage(string message) { await NewMessage(message).Display(); } public static MessageDialogViewModel NewOkCancel(string message) { return new MessageDialogViewModel() .Message(message) .AddOkButton() .AddCancelButton(); } public static async Task ShowOkCancel(string message) { return await NewOkCancel(message).Display() == MessageDialogResult.OK; } public static MessageDialogViewModel NewYesNo(string message) { return new MessageDialogViewModel() .Message(message) .AddYesButton() .AddNoButton(); } public static async Task ShowYesNo(string message) { return await NewYesNo(message) .Display() == MessageDialogResult.Yes; } public static MessageDialogViewModel NewYesNoCancel(string message) { return new MessageDialogViewModel() .Message(message) .AddYesButton() .AddNoButton() .AddCancelButton(); } public static async Task ShowYesNoCancel(string message) { return await NewYesNoCancel(message).Display(); } #endregion } public partial class MessageDialogButton : ObservableObject { public delegate void MessageDialogButtonDelegate(MessageDialogViewModel window, MessageDialogButton button); public MessageDialogButtonPosition Position { get; set; } [ObservableProperty] private string _content; public MessageDialogButtonDelegate Action { get; set; } public MessageDialogButton(string content, MessageDialogButtonDelegate action, MessageDialogButtonPosition position) { Content = content; Action = action; Position = position; } } public static class MessageDialogBuilder { public static MessageDialogViewModel Message(this MessageDialogViewModel window, string message) { window.Message = message; return window; } public static async Task Display(this MessageDialogViewModel window) { return await Navigation.Popup(window, false); } }