// // 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(); } }