using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using MultiTerm.Core.Types; using MultiTerm.Protocols; using MultiTerm.Protocols.Types; namespace MultiTerm.Core.ViewModel; public abstract partial class TerminalViewModel : ObservableObject, ITerminalViewModel { public abstract string Title { get; } public abstract TerminalViewType ViewType { get; } public ProtocolType ProtocolType { get; set; } public event EventHandler? ClosingEvent; [ObservableProperty] private CommunicationDataViewModel communicationData = new(null); private ICommunicationProtocol? communicationProtocol; public ICommunicationProtocol? CommunicationProtocol { get { return communicationProtocol; } set { communicationProtocol = value; // register communication protocol in the Communication Data View Model //this.CommunicationData = new CommunicationDataViewModel(communicationProtocol); // TEMP } } private IProtocolSettingsViewModel? protocolSettings; public IProtocolSettingsViewModel? ProtocolSettings { get { return protocolSettings; } set { protocolSettings = value; // register event handler for connection request from viewmodel if(value != null) { protocolSettings!.ConnectRequested += OnViewModelRequestedConnect; ; ; protocolSettings!.DisconnectRequested += OnViewModelRequestedDisconnect; } } } /// /// Method to override if any closing actions are required. /// Closing can be cancelled using the return value. /// /// true if closing is allowed. false if it shall be cancelled. protected virtual bool ClosingActions() { return true; } [RelayCommand] public void CloseRequest() { if (this.ClosingActions() == true) { ClosingEvent?.Invoke(this, EventArgs.Empty); } } private void OnViewModelRequestedConnect(object? sender, ConnectionRequestEventArgs e) { // guard uninitialized CommunicationProtocol if (CommunicationProtocol == null) { throw new Exception($"To call '{nameof(OnViewModelRequestedConnect)}()', CommunicationProtocol must not be null!"); } e.Success = this.CommunicationProtocol.Connect(e.Settings); } private void OnViewModelRequestedDisconnect(object? sender, EventArgs e) { // guard uninitialized CommunicationProtocol if (CommunicationProtocol == null) { throw new Exception($"To call '{nameof(OnViewModelRequestedConnect)}()', CommunicationProtocol must not be null!"); } this.CommunicationProtocol.Disconnect(); } }