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