2024-05-02 21:44:13 +02:00
|
|
|
using Avalonia;
|
|
|
|
|
|
2024-03-17 22:27:01 +01:00
|
|
|
using Dock.Model.Controls;
|
|
|
|
|
using Dock.Model.Core;
|
2024-05-02 21:44:13 +02:00
|
|
|
using Dock.Model.Mvvm;
|
|
|
|
|
using Dock.Model.Mvvm.Controls;
|
|
|
|
|
|
|
|
|
|
using DynamicData.Binding;
|
|
|
|
|
|
|
|
|
|
using InkForge.Desktop.Managers;
|
|
|
|
|
using InkForge.Desktop.Models;
|
|
|
|
|
using InkForge.Desktop.ViewModels.Documents;
|
|
|
|
|
using InkForge.Desktop.ViewModels.Tools;
|
|
|
|
|
|
2024-03-17 22:27:01 +01:00
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
|
|
|
|
|
namespace InkForge.Desktop;
|
|
|
|
|
|
|
|
|
|
public class InkForgeFactory : Factory
|
|
|
|
|
{
|
2024-05-02 21:44:13 +02:00
|
|
|
private readonly IDock _mainDock;
|
2024-03-17 22:27:01 +01:00
|
|
|
private readonly IRootDock _rootDock;
|
2024-05-02 21:44:13 +02:00
|
|
|
private readonly WelcomePageDocumentViewModel _welcomePage;
|
|
|
|
|
private readonly WorkspaceTool _workspaceTool;
|
2024-03-17 22:27:01 +01:00
|
|
|
|
2024-05-02 21:44:13 +02:00
|
|
|
public InkForgeFactory(WorkspaceManager workspace)
|
2024-03-17 22:27:01 +01:00
|
|
|
{
|
2024-05-02 21:44:13 +02:00
|
|
|
_rootDock = CreateRootDock();
|
|
|
|
|
_mainDock = CreateDockDock();
|
|
|
|
|
_mainDock.IsCollapsable = false;
|
|
|
|
|
_mainDock.CanClose = false;
|
2024-03-17 22:27:01 +01:00
|
|
|
|
2024-05-02 21:44:13 +02:00
|
|
|
_welcomePage = CreateWelcomePageDocumentViewModel();
|
2024-03-17 22:27:01 +01:00
|
|
|
_workspaceTool = CreateWorkspaceTool();
|
2024-05-02 21:44:13 +02:00
|
|
|
|
|
|
|
|
workspace.WhenValueChanged(m => m.Workspace).Subscribe(OnWorkspaceChanged);
|
2024-03-17 22:27:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override IRootDock CreateLayout()
|
|
|
|
|
{
|
2024-05-02 21:44:13 +02:00
|
|
|
ToolDock toolDock = new()
|
2024-03-17 22:27:01 +01:00
|
|
|
{
|
2024-05-02 21:44:13 +02:00
|
|
|
Alignment = Alignment.Left,
|
|
|
|
|
Proportion = 0.25,
|
2024-03-17 22:27:01 +01:00
|
|
|
VisibleDockables = [_workspaceTool],
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ProportionalDock windowLayoutContent = new()
|
|
|
|
|
{
|
|
|
|
|
Orientation = Orientation.Horizontal,
|
2024-05-02 21:44:13 +02:00
|
|
|
VisibleDockables = [toolDock, new ProportionalDockSplitter(), _mainDock]
|
2024-03-17 22:27:01 +01:00
|
|
|
};
|
|
|
|
|
|
2024-05-02 21:44:13 +02:00
|
|
|
_rootDock.VisibleDockables = [windowLayoutContent];
|
|
|
|
|
_rootDock.DefaultDockable = windowLayoutContent;
|
2024-03-17 22:27:01 +01:00
|
|
|
|
|
|
|
|
return _rootDock;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-02 21:44:13 +02:00
|
|
|
private static WelcomePageDocumentViewModel CreateWelcomePageDocumentViewModel()
|
2024-03-17 22:27:01 +01:00
|
|
|
{
|
2024-05-02 21:44:13 +02:00
|
|
|
return ActivatorUtilities.CreateInstance<WelcomePageDocumentViewModel>(
|
|
|
|
|
Application.Current!.GetValue(App.ServiceProviderProperty)
|
|
|
|
|
);
|
2024-03-17 22:27:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static ViewModels.Tools.WorkspaceTool CreateWorkspaceTool()
|
|
|
|
|
{
|
|
|
|
|
return ActivatorUtilities.CreateInstance<ViewModels.Tools.WorkspaceTool>(
|
|
|
|
|
Application.Current!.GetValue(App.ServiceProviderProperty)
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-05-02 21:44:13 +02:00
|
|
|
|
|
|
|
|
private void OnWorkspaceChanged(Workspace? workspace)
|
|
|
|
|
{
|
|
|
|
|
IDockable dock = workspace switch
|
|
|
|
|
{
|
|
|
|
|
null => _welcomePage,
|
|
|
|
|
_ => workspace.Services.GetRequiredService<DocumentManager>().Dock,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
AddDockable(_mainDock, dock);
|
|
|
|
|
CloseOtherDockables(dock);
|
|
|
|
|
}
|
2024-03-17 22:27:01 +01:00
|
|
|
}
|