// // 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 Dock.Avalonia.Controls; using Dock.Model.Controls; using Dock.Model.Core; using Dock.Model.Mvvm; using Dock.Model.Mvvm.Controls; using PacketLogger.Models; using ReactiveUI; namespace PacketLogger.ViewModels; /// /// A factory for root dock. /// public class DockFactory : Factory, IDisposable { private NostaleProcesses _processes = new(); /// 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(_processes) { Id = $"New tab {index}", Title = $"New tab {index}" }; AddDockable(documentDock, document); SetActiveDockable(document); SetFocusedDockable(documentDock, document); } ); return documentDock; } private readonly object _context; private IRootDock? _rootDock; private IDocumentDock? _documentDock; /// /// Initializes a new instance of the class. /// /// The context. public DockFactory(object context) { _context = context; } /// public override IRootDock CreateLayout() { var initialTab = new PacketLogDocumentViewModel(_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(); } }