implemented teardown of all tabs when closing Main App

master
Jonas Arnold 3 years ago
parent 21d4dc9b0e
commit 5bc385b061
  1. 6
      MultiTerm.Core/ViewModel/ITerminalViewModel.cs
  2. 15
      MultiTerm.Core/ViewModel/ShellViewModel.cs
  3. 18
      MultiTerm.Core/ViewModel/TerminalViewModel.cs
  4. 4
      MultiTerm.Wpf/App.xaml.cs

@ -36,6 +36,12 @@ public interface ITerminalViewModel
/// </summary>
void CloseRequest();
/// <summary>
/// Force close the Terminal and disconnect communication protocol.
/// Does not raise <see cref="ClosingEvent"/>.
/// </summary>
void ForceClose();
/// <summary>
/// Closing of Terminal was initiated.
/// </summary>

@ -68,6 +68,20 @@ public partial class ShellViewModel : ObservableObject, IRecipient<IUserInterfac
this.AppendTerminalWithSelectedViewType(ProtocolType.Serial);
}
/// <summary>
/// Forcefully close all <see cref="TerminalViewModel"/>s.
/// </summary>
public void Teardown()
{
// iterate through all terminals
foreach (ITerminalViewModel terminal in this.TerminalViewModels)
{
// forcefully close
terminal.ForceClose();
// do not remove from collection, otherwise the collection was changed
}
}
[RelayCommand]
private void AppendTerminalWithSelectedViewType(ProtocolType protocolType)
{
@ -75,7 +89,6 @@ public partial class ShellViewModel : ObservableObject, IRecipient<IUserInterfac
this.AppendConfiguredTerminal(this.terminalViewModelFactory.Create(this.SelectedTerminalViewType, protocolType));
}
private void AppendConfiguredTerminal(ITerminalViewModel? newTerminal)
{
// guard null value

@ -9,7 +9,6 @@ using MultiTerm.Core.Types;
using MultiTerm.Protocols;
using MultiTerm.Protocols.Model;
using MultiTerm.Protocols.Types;
using System.Text;
namespace MultiTerm.Core.ViewModel;
@ -104,8 +103,12 @@ public abstract partial class TerminalViewModel : ObservableObject, ITerminalVie
{
if (this.CommunicationProtocol != null)
{
// disconnect communication protocol
this.OnViewModelRequestedDisconnect(this, EventArgs.Empty);
// unsubscribe events
this.CommunicationProtocol.ReceivedDataEvent -= CommunicationProtocol_ReceivedDataEvent;
this.CommunicationProtocol.SentDataEvent -= CommunicationProtocol_SentDataEvent;
// remove reference to object
this.CommunicationProtocol = null;
}
}
@ -230,11 +233,24 @@ public abstract partial class TerminalViewModel : ObservableObject, ITerminalVie
[RelayCommand]
public void CloseRequest()
{
// run internal closing actions check if closing is allowed
if (this.ClosingActions() == true)
{
// disconnect communication protocol
this.OnViewModelRequestedDisconnect(this, EventArgs.Empty);
// raise event
ClosingEvent?.Invoke(this, EventArgs.Empty);
}
}
public void ForceClose()
{
// internal closing options, ignore cancellation
this.ClosingActions();
// disconnect communication protocol
this.OnViewModelRequestedDisconnect(this, EventArgs.Empty);
// do not raise closing event, since caller knows about closing
}
#endregion
#region Newline Separator handling

@ -78,6 +78,10 @@ public partial class App : Application
var appSettingsProvider = AppHost!.Services.GetRequiredService<IAppSettingsProvider>();
appSettingsProvider.Save();
// teardown of terminal views and communication protocol threads
var shellViewModel = AppHost!.Services.GetRequiredService<ShellViewModel>();
shellViewModel.Teardown();
// log application exit and stop logger (if still available)
logger?.LogInfo("Application exited.", nameof(App));
logger?.StopLogging();

Loading…
Cancel
Save