using Common.StartupHelpers; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using MultiTerm.Core.Common; using MultiTerm.Core.Factories; using System.Collections.ObjectModel; namespace MultiTerm.Core.ViewModel; public partial class ShellViewModel : ObservableObject { [ObservableProperty] private string title = "ShellView Test"; [ObservableProperty] private ObservableCollection terminalViewModels = new(); [ObservableProperty] private ITerminalViewModel? selectedTerminalViewModel; #region Settings Menu Bar // TODO Initialize from File [ObservableProperty] private NewlineSeparatorType defaultReceiveNewlineSeparator = NewlineSeparatorType.None; // TODO Initialize from File [ObservableProperty] private NewlineSeparatorType defaultSendNewlineSeparator = NewlineSeparatorType.None; #endregion #region New Terminal Context Menu [ObservableProperty] private TerminalViewType selectedTerminalViewType = TerminalViewType.SendReceive; #endregion private readonly ITerminalViewModelFactory terminalViewModelFactory; public ShellViewModel(ITerminalViewModelFactory terminalViewModelFactory) { this.terminalViewModelFactory = terminalViewModelFactory; } [RelayCommand] private void AppendTerminalWithSelectedViewType(ProtocolType protocolType) { this.AppendConfiguredTerminal(this.terminalViewModelFactory.Create(this.SelectedTerminalViewType, protocolType)); } private void AppendConfiguredTerminal(ITerminalViewModel? newTerminal) { // guard null value if(newTerminal == null) { return; } // add to collection and register closing event handler this.TerminalViewModels.Add(newTerminal); newTerminal.ClosingEvent += Terminal_ClosingEvent; // set as selected this.SelectedTerminalViewModel = newTerminal; } private void Terminal_ClosingEvent(object? sender, EventArgs e) { if(sender is not ITerminalViewModel tvm) { throw new ArgumentException($"{nameof(Terminal_ClosingEvent)} failed to convert sender to {nameof(ITerminalViewModel)}"); } this.RemoveTerminal(tvm); } private void RemoveTerminal(ITerminalViewModel terminalToRemove) { // guard null value if(terminalToRemove == null) { return; } this.TerminalViewModels.Remove(terminalToRemove); } partial void OnDefaultReceiveNewlineSeparatorChanged(NewlineSeparatorType value) { Console.WriteLine($"Changed to {value}"); } partial void OnDefaultSendNewlineSeparatorChanged(NewlineSeparatorType value) { Console.WriteLine($"Changed Send to {value}"); } [RelayCommand] private void TestButtonClicked() { this.DefaultReceiveNewlineSeparator = NewlineSeparatorType.CR_LF; } }