//
// DockFactory.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.Collections.Generic;
using System.Reactive;
using Dock.Avalonia.Controls;
using Dock.Model.Controls;
using Dock.Model.Core;
using Dock.Model.Mvvm;
using Dock.Model.Mvvm.Controls;
using NosSmooth.Comms.Local;
using NosSmooth.Core.Stateful;
using PacketLogger.Models;
using ReactiveUI;
namespace PacketLogger.ViewModels;
///
/// A factory for root dock.
///
public class DockFactory : Factory, IDisposable
{
private readonly StatefulRepository _repository;
private readonly NostaleProcesses _processes;
private readonly CommsInjector _injector;
private IRootDock? _rootDock;
private IDocumentDock? _documentDock;
///
/// Initializes a new instance of the class.
///
/// The nostale processes.
/// The communications injector.
/// The repository.
public DockFactory(NostaleProcesses processes, CommsInjector injector, StatefulRepository repository)
{
_processes = processes;
_repository = repository;
_injector = injector;
}
///
/// Gets the document dock.
///
public IDocumentDock DocumentDock
=> _documentDock ?? throw new InvalidOperationException("Dock factory is not initialized");
///
/// Creaate and load a document.
///
/// The function to use to load the document.
public void CreateLoadedDocument(Func> load)
{
if (_documentDock is null)
{
return;
}
var document = new PacketLogDocumentViewModel(_injector, _repository, _processes)
{ Id = $"New tab", Title = $"New tab" };
var observable = load(document);
observable.Subscribe
(
x =>
{
if (!document.Loaded)
{
return;
}
AddDockable(_documentDock, document);
SetActiveDockable(document);
SetFocusedDockable(_documentDock, document);
}
);
}
///
public override IDocumentDock CreateDocumentDock()
{
var documentDock = new DocumentDock();
documentDock.CreateDocument = ReactiveCommand.Create
(
() =>
{
if (!documentDock.CanCreateDocument)
{
return;
}
var index = documentDock.VisibleDockables?.Count + 1;
var document = new PacketLogDocumentViewModel(_injector, _repository, _processes)
{ Id = $"New tab {index}", Title = $"New tab {index}" };
AddDockable(documentDock, document);
SetActiveDockable(document);
SetFocusedDockable(documentDock, document);
}
);
return documentDock;
}
///
public override IRootDock CreateLayout()
{
var initialTab = new PacketLogDocumentViewModel(_injector, _repository, _processes)
{ Id = $"New tab", Title = $"New tab" };
var documentDock = CreateDocumentDock();
documentDock.IsCollapsable = false;
documentDock.ActiveDockable = initialTab;
documentDock.VisibleDockables = CreateList(initialTab);
documentDock.CanCreateDocument = true;
var rootDock = CreateRootDock();
rootDock.IsCollapsable = false;
rootDock.ActiveDockable = documentDock;
rootDock.DefaultDockable = documentDock;
rootDock.VisibleDockables = CreateList(documentDock);
_documentDock = documentDock;
_rootDock = rootDock;
return rootDock;
}
///
public override void InitLayout(IDockable layout)
{
ContextLocator = new Dictionary>
{
["Home"] = () => layout
};
DockableLocator = new Dictionary>
{
["Root"] = () => _rootDock,
["Documents"] = () => _documentDock
};
HostWindowLocator = new Dictionary>
{
[nameof(IDockWindow)] = () => new HostWindow()
};
base.InitLayout(layout);
}
///
public void Dispose()
{
_processes.Dispose();
}
}