Multiprocotol Terminalprogram (BAT)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MultiTerm/MultiTerm.Core/ViewModel/ShellViewModel.cs

94 lines
2.8 KiB

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<ITerminalViewModel> 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;
}
}