using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using MultiTerm.Protocols.Types; namespace MultiTerm.Protocols; /// /// Class that represents all connection and usage settings for a specific . /// Can be bound to UI using MVVM pattern. /// public abstract partial class ProtocolSettingsViewModel : ObservableObject, IProtocolSettingsViewModel { private const string connectedStateButtonText = "Disconnect"; private const string disconnectedStateButtonText = "Connect"; public event EventHandler? ConnectRequested; public event EventHandler? DisconnectRequested; public abstract ProtocolType ProtocolType { get; } /// /// Indicates wether the settings can currently be edited. /// public bool AreEditable; [ObservableProperty] private string connectDisconnectButtonText = disconnectedStateButtonText; /// /// Binding to Connect/Disconnect button. /// Button text is provided in /// [RelayCommand(AllowConcurrentExecutions = false)] private async Task ConnectDisconnectAsync() { await Task.Factory.StartNew(() => { // if currently disconnected if (this.ConnectDisconnectButtonText == disconnectedStateButtonText) { // CONNECT this.AreEditable = false; this.ConnectRequested?.Invoke(this, EventArgs.Empty); this.ConnectDisconnectButtonText = connectedStateButtonText; } // if currently connected else if (this.ConnectDisconnectButtonText == connectedStateButtonText) { // DISCONNECT this.DisconnectRequested?.Invoke(this, EventArgs.Empty); this.ConnectDisconnectButtonText = disconnectedStateButtonText; this.AreEditable = true; } else { throw new Exception($"'{nameof(ConnectDisconnectAsync)}()' has not recognized button text, cannot identify state of connection."); } }); } }