using System.Linq; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using HanumanInstitute.MvvmDialogs; using Nitrox.Launcher.Models; namespace Nitrox.Launcher.ViewModels.Abstract; /// /// Base class for (popup) dialog ViewModels. /// public abstract partial class ModalViewModelBase : ObservableValidator, IModalDialogViewModel, IMessageReceiver { [ObservableProperty] private ButtonOptions? selectedOption; bool? IModalDialogViewModel.DialogResult => (bool)this; protected ModalViewModelBase() { // Always run validation first so HasErrors is set (i.e. trigger CanExecute logic). ValidateAllProperties(); } public static implicit operator bool(ModalViewModelBase self) { return self is { HasErrors: false } and not { SelectedOption: null or ButtonOptions.No }; } /// /// Closes the dialog window. By default, sets the dialog result as cancelled. /// /// The dialog result to set before closing. [RelayCommand] public void Close(ButtonOptions? buttonOptions = null) { if (buttonOptions != null) { SelectedOption = buttonOptions; } ((IClassicDesktopStyleApplicationLifetime)Application.Current?.ApplicationLifetime)?.Windows.FirstOrDefault(w => w.DataContext == this)?.CloseByUser(); } public virtual void Dispose() { WeakReferenceMessenger.Default.UnregisterAll(this); } }