//
// PacketLogDocumentViewModel.cs
//
// Copyright (c) František Boháček. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.ComponentModel;
using System.Linq;
using System.Reactive;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Dock.Model.Mvvm.Controls;
using PacketLogger.Models.Packets;
using ReactiveUI;
namespace PacketLogger.ViewModels;
///
public class PacketLogDocumentViewModel : Document, INotifyPropertyChanged
{
///
/// Initializes a new instance of the class.
///
public PacketLogDocumentViewModel()
{
OpenDummy = ReactiveCommand.CreateFromTask
(
() => Task.Run(() =>
{
Loading = true;
Name = "Dummy";
LogViewModel = new LogTabViewModel(new DummyPacketProvider());
Loaded = true;
})
);
OpenFile = ReactiveCommand.CreateFromTask
(
async () =>
{
var mainWindow = (App.Current!.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)
?.MainWindow;
var result = await new OpenFileDialog()
{
AllowMultiple = false,
InitialFileName = Assembly.GetEntryAssembly()?.GetModules().FirstOrDefault()?.FullyQualifiedName
}.ShowAsync(mainWindow!);
if (result is null || result.Length == 0)
{
return;
}
Loading = true;
var path = result[0];
var provider = new FilePacketProvider(path);
var openResult = await provider.Open();
if (!openResult.IsSuccess)
{
Console.WriteLine("Could not open the file.");
return;
}
LogViewModel = new LogTabViewModel(provider);
Loaded = true;
Loading = false;
}
);
}
///
/// Gets or sets the name of the tab.
///
public string Name { get; set; } = "New tab";
///
/// Gets whether the document is currently being loaded.
///
public bool Loading { get; private set; } = false;
///
/// Gets whether a document has been loaded.
///
public bool Loaded { get; private set; }
///
/// Gets the log tab view model.
///
public LogTabViewModel? LogViewModel { get; private set; }
///
/// Gets command for opening a dummy.
///
public ReactiveCommand OpenDummy { get; }
///
/// Gets command for opening a file.
///
public ReactiveCommand OpenFile { get; }
}