diff --git a/Directory.Packages.props b/Directory.Packages.props
index d3971d7..1650f75 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -16,6 +16,7 @@
+
diff --git a/app/InkForge.Desktop/App.axaml b/app/InkForge.Desktop/App.axaml
index e4508df..7042e4e 100644
--- a/app/InkForge.Desktop/App.axaml
+++ b/app/InkForge.Desktop/App.axaml
@@ -6,6 +6,7 @@
+
diff --git a/app/InkForge.Desktop/App.axaml.cs b/app/InkForge.Desktop/App.axaml.cs
index 52fd09d..487453e 100644
--- a/app/InkForge.Desktop/App.axaml.cs
+++ b/app/InkForge.Desktop/App.axaml.cs
@@ -1,25 +1,17 @@
using Avalonia;
-using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Metadata;
-using InkForge.Desktop.ViewModels;
+using InkForge.Desktop.Views;
-using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.FileProviders;
using ReactiveUI;
using Splat;
using Splat.Microsoft.Extensions.DependencyInjection;
-[assembly: XmlnsPrefix("app:InkForge", "inkforge")]
-[assembly: XmlnsDefinition("app:InkForge", "InkForge.Desktop.Controls")]
-[assembly: XmlnsDefinition("app:InkForge", "InkForge.Desktop.MarkupExtensions")]
-[assembly: XmlnsDefinition("app:InkForge", "InkForge.Desktop.Services")]
-
namespace InkForge.Desktop;
public partial class App : Application
@@ -31,21 +23,8 @@ public partial class App : Application
public IServiceProvider ServiceProvider => GetValue(ServiceProviderProperty);
- public static void Configure(IServiceCollection services, IConfigurationManager configuration)
+ public static void Configure(IServiceCollection services)
{
- configuration.SetBasePath(AppContext.BaseDirectory);
- configuration.AddJsonFile(
- new ManifestEmbeddedFileProvider(typeof(App).Assembly),
- "Properties/appsettings.json", false, false);
- configuration.AddJsonFile(
- Path.Combine(
- Environment.GetFolderPath(
- Environment.SpecialFolder.ApplicationData,
- Environment.SpecialFolderOption.DoNotVerify),
- "InkForge",
- "usersettings.json"), true, true);
- configuration.AddJsonFile("appsettings.json", true, true);
-
services.UseMicrosoftDependencyResolver();
Locator.CurrentMutable.InitializeSplat();
Locator.CurrentMutable.InitializeReactiveUI();
@@ -60,18 +39,11 @@ public partial class App : Application
public override void OnFrameworkInitializationCompleted()
{
- // This kills Avalonia VSCode Previewer.
- var viewModel = ActivatorUtilities.GetServiceOrCreateInstance(ServiceProvider);
- var view = ViewLocator.Current.ResolveView(viewModel)!;
- view.ViewModel = viewModel;
_ = ApplicationLifetime switch
{
- IClassicDesktopStyleApplicationLifetime desktop => desktop.MainWindow = view as Window,
- ISingleViewApplicationLifetime singleView => singleView.MainView = view as Control,
+ IClassicDesktopStyleApplicationLifetime desktop => desktop.MainWindow = new MainWindow(),
_ => throw new NotSupportedException(),
};
-
- base.OnFrameworkInitializationCompleted();
}
private static IServiceProvider OnServiceProviderChanged(AvaloniaObject @object, IServiceProvider provider)
diff --git a/app/InkForge.Desktop/Dock/WorkspaceFactory.cs b/app/InkForge.Desktop/Dock/WorkspaceFactory.cs
new file mode 100644
index 0000000..c539f13
--- /dev/null
+++ b/app/InkForge.Desktop/Dock/WorkspaceFactory.cs
@@ -0,0 +1,29 @@
+using Dock.Model.Controls;
+using Dock.Model.Core;
+using Dock.Model.ReactiveUI;
+
+namespace InkForge.Desktop.Dock;
+
+public class WorkspaceFactory : Factory
+{
+ public override IRootDock CreateLayout()
+ {
+ var documents = CreateDocumentDock();
+ documents.Id = "Documents";
+ documents.Title = "Documents";
+
+ var root = CreateRootDock();
+
+ root.VisibleDockables = [documents];
+ root.ActiveDockable = documents;
+ root.DefaultDockable = documents;
+
+ DockableLocator = new Dictionary>
+ {
+ ["Root"] = () => root,
+ ["Documents"] = () => documents,
+ };
+
+ return root;
+ }
+}
diff --git a/app/InkForge.Desktop/InkForge.Desktop.csproj b/app/InkForge.Desktop/InkForge.Desktop.csproj
index f1ac09b..4d0c737 100644
--- a/app/InkForge.Desktop/InkForge.Desktop.csproj
+++ b/app/InkForge.Desktop/InkForge.Desktop.csproj
@@ -17,6 +17,7 @@
+
diff --git a/app/InkForge.Desktop/Managers/DocumentManager.cs b/app/InkForge.Desktop/Managers/DocumentManager.cs
new file mode 100644
index 0000000..9e71ade
--- /dev/null
+++ b/app/InkForge.Desktop/Managers/DocumentManager.cs
@@ -0,0 +1,11 @@
+namespace InkForge.Desktop.Managers;
+
+public class DocumentManager
+{
+ private readonly WorkspaceManager _workspaceManager;
+
+ public DocumentManager(WorkspaceManager workspaceManager)
+ {
+ _workspaceManager = workspaceManager;
+ }
+}
diff --git a/app/InkForge.Desktop/Managers/WorkspaceManager.cs b/app/InkForge.Desktop/Managers/WorkspaceManager.cs
index d696a53..33350e4 100644
--- a/app/InkForge.Desktop/Managers/WorkspaceManager.cs
+++ b/app/InkForge.Desktop/Managers/WorkspaceManager.cs
@@ -46,7 +46,7 @@ public class WorkspaceManager(IServiceProvider serviceProvider) : ReactiveObject
file.Directory!.Create();
IServiceScope? scope = null;
- IWorkspaceAccessor workspaceAccessor;
+ IWorkspaceContext workspaceContext;
try
{
scope = _serviceProvider.CreateScope();
@@ -54,8 +54,8 @@ public class WorkspaceManager(IServiceProvider serviceProvider) : ReactiveObject
var options = serviceProvider.GetRequiredService();
options.DbPath = path;
- workspaceAccessor = serviceProvider.GetRequiredService();
- workspaceAccessor.Workspace = new Workspace(scope)
+ workspaceContext = serviceProvider.GetRequiredService();
+ workspaceContext.Workspace = new Workspace(scope)
{
Name = Path.GetFileNameWithoutExtension(file.Name),
Options = options,
@@ -87,6 +87,6 @@ public class WorkspaceManager(IServiceProvider serviceProvider) : ReactiveObject
scope?.Dispose();
}
- return workspaceAccessor.Workspace;
+ return workspaceContext.Workspace;
}
}
diff --git a/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/InkForgeServiceCollection.cs b/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/InkForgeServiceCollection.cs
index 77b1a3e..fa16721 100644
--- a/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/InkForgeServiceCollection.cs
+++ b/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/InkForgeServiceCollection.cs
@@ -1,6 +1,7 @@
using InkForge.Data;
using InkForge.Desktop.Data;
using InkForge.Desktop.Data.Options;
+using InkForge.Desktop.Dock;
using InkForge.Desktop.Managers;
using InkForge.Desktop.Models;
using InkForge.Desktop.ViewModels;
@@ -19,13 +20,23 @@ public static class InkForgeServiceCollections
{
services.AddHttpClient();
- services.AddScoped();
- services.AddScoped, NoteDbContextFactory>();
+ // Singletons
+ // - Concrete
+ services.AddSingleton();
+ services.AddSingleton();
+ services.AddSingleton();
+ services.AddSingleton();
+ // Scoped
+ // - Concrete
services.AddScoped();
- services.AddSingleton();
- services.AddSingleton();
+ // - Service
+ services.AddScoped, NoteDbContextFactory>();
+ services.AddScoped();
+
+ // - Forwarders
+ services.AddScoped(s => s.GetRequiredService().Workspace!);
Locator.CurrentMutable.RegisterViewsForViewModels(typeof(InkForgeServiceCollections).Assembly);
diff --git a/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/TypeFactories.cs b/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/TypeFactories.cs
index 1701a49..cb40b84 100644
--- a/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/TypeFactories.cs
+++ b/app/InkForge.Desktop/Microsoft/Extensions/DependencyInjection/TypeFactories.cs
@@ -1,5 +1,13 @@
namespace Microsoft.Extensions.DependencyInjection
{
+ public static class TypeFactory
+ {
+ public static T Create(IServiceProvider serviceProvider)
+ {
+ return TypeFactory.Create(serviceProvider, default);
+ }
+ }
+
public static class TypeFactory
where TArguments : IFactoryArguments
{
@@ -12,6 +20,13 @@ namespace Microsoft.Extensions.DependencyInjection
}
}
+ public readonly struct EmptyArguments : IFactoryArguments
+ {
+ public static Type[] Types => [];
+
+ public static implicit operator object[](in EmptyArguments _) => [];
+ }
+
public interface IFactoryArguments
where T : IFactoryArguments
{
diff --git a/app/InkForge.Desktop/Models/Note.cs b/app/InkForge.Desktop/Models/Note.cs
new file mode 100644
index 0000000..7e04030
--- /dev/null
+++ b/app/InkForge.Desktop/Models/Note.cs
@@ -0,0 +1,6 @@
+namespace InkForge.Desktop.Models;
+
+public class Note
+{
+
+}
diff --git a/app/InkForge.Desktop/Models/Workspace.cs b/app/InkForge.Desktop/Models/Workspace.cs
index 7204440..f8e9dbf 100644
--- a/app/InkForge.Desktop/Models/Workspace.cs
+++ b/app/InkForge.Desktop/Models/Workspace.cs
@@ -24,6 +24,15 @@ public sealed class Workspace : IDisposable
_dbContextFactory = Services.GetRequiredService>();
}
+ // public Note AddNote(Note? parent)
+ // {
+ // }
+
+ public T CreateViewModel()
+ {
+ return TypeFactory.Create(Services);
+ }
+
public void Dispose()
{
Dispose(disposing: true);
@@ -34,10 +43,7 @@ public sealed class Workspace : IDisposable
{
if (!_disposedValue)
{
- {
- _scope!.Dispose();
- }
-
+ _scope!.Dispose();
_scope = null;
_disposedValue = true;
}
diff --git a/app/InkForge.Desktop/Models/WorkspaceAccessor.cs b/app/InkForge.Desktop/Models/WorkspaceContext.cs
similarity index 59%
rename from app/InkForge.Desktop/Models/WorkspaceAccessor.cs
rename to app/InkForge.Desktop/Models/WorkspaceContext.cs
index 05a4c0e..d9e8fd3 100644
--- a/app/InkForge.Desktop/Models/WorkspaceAccessor.cs
+++ b/app/InkForge.Desktop/Models/WorkspaceContext.cs
@@ -1,11 +1,11 @@
namespace InkForge.Desktop.Models
{
- public interface IWorkspaceAccessor
+ public interface IWorkspaceContext
{
Workspace? Workspace { get; set; }
}
- public class WorkspaceAccessor : IWorkspaceAccessor
+ public class WorkspaceContext : IWorkspaceContext
{
public Workspace? Workspace { get; set; }
}
diff --git a/app/InkForge.Desktop/Program.cs b/app/InkForge.Desktop/Program.cs
index d52658f..8a09976 100644
--- a/app/InkForge.Desktop/Program.cs
+++ b/app/InkForge.Desktop/Program.cs
@@ -1,14 +1,18 @@
using Avalonia;
+using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Metadata;
using Avalonia.ReactiveUI;
using Avalonia.Threading;
using InkForge.Desktop;
+using InkForge.Desktop.ViewModels;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
+using ReactiveUI;
+
static class Program
{
[STAThread]
@@ -44,7 +48,7 @@ static class Program
configuration = new();
ServiceCollection services = [];
services.AddSingleton(configuration);
- App.Configure(services, configuration);
+ App.Configure(services);
builder.AfterSetup(services.SetupApp);
return builder;
@@ -58,18 +62,18 @@ static class Program
private class ServiceProviderDisposer
{
private readonly ServiceProvider _serviceProvider;
- private readonly TaskCompletionSource _shutdownTask = new();
+ private ValueTask? _shutdownTask;
public ServiceProviderDisposer(ServiceProvider serviceProvider, Dispatcher dispatcher)
{
- dispatcher.ShutdownStarted += OnShutdownStarted;
dispatcher.ShutdownFinished += OnShutdownFinished;
+ dispatcher.ShutdownStarted += OnShutdownStarted;
_serviceProvider = serviceProvider;
}
private void OnShutdownFinished(object? sender, EventArgs e)
{
- if (_shutdownTask.Task.Result is { IsCompleted: false } disposeTask)
+ if (_shutdownTask is { IsCompleted: false } disposeTask)
{
disposeTask.GetAwaiter().GetResult();
}
@@ -78,7 +82,7 @@ static class Program
private void OnShutdownStarted(object? sender, EventArgs e)
{
#pragma warning disable CA2012 // This will only ever be awaited once in ShutdownFinished
- _shutdownTask.SetResult(_serviceProvider.DisposeAsync());
+ _shutdownTask = _serviceProvider.DisposeAsync();
#pragma warning restore CA2012
}
}
diff --git a/app/InkForge.Desktop/Properties/AssemblyInfo.cs b/app/InkForge.Desktop/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..812d8dd
--- /dev/null
+++ b/app/InkForge.Desktop/Properties/AssemblyInfo.cs
@@ -0,0 +1,6 @@
+using Avalonia.Metadata;
+
+[assembly: XmlnsPrefix("app:InkForge", "inkforge")]
+[assembly: XmlnsDefinition("app:InkForge", "InkForge.Desktop.Controls")]
+[assembly: XmlnsDefinition("app:InkForge", "InkForge.Desktop.MarkupExtensions")]
+[assembly: XmlnsDefinition("app:InkForge", "InkForge.Desktop.Services")]
diff --git a/app/InkForge.Desktop/Services/WorkspaceContext.cs b/app/InkForge.Desktop/Services/WorkspaceContext.cs
deleted file mode 100644
index 1cb5043..0000000
--- a/app/InkForge.Desktop/Services/WorkspaceContext.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace InkForge.Desktop.Services;
-
-public class WorkspaceContext
-{
- public string DbPath { get; set; }
-}
diff --git a/app/InkForge.Desktop/ViewModels/AppViewModel.cs b/app/InkForge.Desktop/ViewModels/AppViewModel.cs
deleted file mode 100644
index dc1a82f..0000000
--- a/app/InkForge.Desktop/ViewModels/AppViewModel.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using InkForge.Desktop.Managers;
-using InkForge.Desktop.Models;
-
-using ReactiveUI;
-
-namespace InkForge.Desktop.ViewModels;
-
-public class AppViewModel : ReactiveObject
-{
- private readonly LandingViewModel _landingViewModel;
- private readonly WorkspaceManager _workspace;
- private object _view;
-
- public object View
- {
- get => _view;
- set => this.RaiseAndSetIfChanged(ref _view, value);
- }
-
- public AppViewModel(WorkspaceManager workspace, LandingViewModel landingViewModel)
- {
- _workspace = workspace;
- _landingViewModel = landingViewModel;
-
- this.WhenAnyValue(v => v._workspace.Workspace).Subscribe(OnWorkspaceChanged);
- }
-
- private void OnWorkspaceChanged(Workspace workspace)
- {
- View = workspace switch
- {
- null => _landingViewModel,
- { } => new WorkspaceViewModel(workspace) // scoped?
- };
- }
-}
diff --git a/app/InkForge.Desktop/ViewModels/LandingViewModel.cs b/app/InkForge.Desktop/ViewModels/Documents/WelcomePageDocumentViewModel.cs
similarity index 84%
rename from app/InkForge.Desktop/ViewModels/LandingViewModel.cs
rename to app/InkForge.Desktop/ViewModels/Documents/WelcomePageDocumentViewModel.cs
index 9c4c248..fa8a6fd 100644
--- a/app/InkForge.Desktop/ViewModels/LandingViewModel.cs
+++ b/app/InkForge.Desktop/ViewModels/Documents/WelcomePageDocumentViewModel.cs
@@ -1,28 +1,28 @@
-using System.Collections.ObjectModel;
using System.Reactive;
using Avalonia.Platform.Storage;
+using Dock.Model.ReactiveUI.Controls;
+
using InkForge.Desktop.Managers;
using InkForge.Desktop.Services;
using ReactiveUI;
-namespace InkForge.Desktop.ViewModels;
+namespace InkForge.Desktop.ViewModels.Documents;
-public class LandingViewModel : ReactiveObject
+public class WelcomePageDocumentViewModel : Document
{
- private ReadOnlyObservableCollection _recentItems;
private readonly WorkspaceManager _workspaceController;
public ReactiveCommand CreateNew { get; }
public ReactiveCommand OpenNew { get; }
- public ReadOnlyObservableCollection RecentItems => _recentItems;
-
- public LandingViewModel(WorkspaceManager workspaceController)
+ public WelcomePageDocumentViewModel(WorkspaceManager workspaceController)
{
+ Title = "Welcome";
+
_workspaceController = workspaceController;
CreateNew = ReactiveCommand.CreateFromTask(OnCreateNew);
OpenNew = ReactiveCommand.CreateFromTask(OnOpenNew);
diff --git a/app/InkForge.Desktop/ViewModels/DocumentsViewModel.cs b/app/InkForge.Desktop/ViewModels/DocumentsViewModel.cs
new file mode 100644
index 0000000..97d853a
--- /dev/null
+++ b/app/InkForge.Desktop/ViewModels/DocumentsViewModel.cs
@@ -0,0 +1,23 @@
+using Dock.Model.Controls;
+
+using InkForge.Desktop.Dock;
+using InkForge.Desktop.Managers;
+using InkForge.Desktop.ViewModels.Documents;
+
+namespace InkForge.Desktop.ViewModels;
+
+public class DocumentsViewModel
+{
+ private readonly WorkspaceFactory _workspaceFactory;
+
+ public IRootDock Layout { get; }
+
+ public DocumentsViewModel(WorkspaceFactory workspaceFactory, WorkspaceManager workspaceManager)
+ {
+ _workspaceFactory = workspaceFactory;
+
+ Layout = workspaceFactory.CreateLayout();
+ var documents = workspaceFactory.GetDockable("Documents")!;
+ workspaceFactory.AddDockable(documents, new WelcomePageDocumentViewModel(workspaceManager));
+ }
+}
diff --git a/app/InkForge.Desktop/ViewModels/WorkspaceViewModel.cs b/app/InkForge.Desktop/ViewModels/WorkspaceViewModel.cs
deleted file mode 100644
index fc60ab6..0000000
--- a/app/InkForge.Desktop/ViewModels/WorkspaceViewModel.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using InkForge.Desktop.Models;
-
-using ReactiveUI;
-
-namespace InkForge.Desktop.ViewModels;
-
-public class WorkspaceViewModel : ReactiveObject
-{
- private readonly Workspace _workspace;
- private readonly ObservableAsPropertyHelper _workspaceNameProperty;
-
- public string WorkspaceName => _workspaceNameProperty.Value;
-
- public WorkspaceViewModel(Workspace workspace)
- {
- _workspace = workspace;
- _workspaceNameProperty = this.WhenAnyValue(v => v._workspace.Name).ToProperty(this, nameof(WorkspaceName));
- }
-}
diff --git a/app/InkForge.Desktop/ViewModels/Workspaces/WorkspaceViewModel.cs b/app/InkForge.Desktop/ViewModels/Workspaces/WorkspaceViewModel.cs
new file mode 100644
index 0000000..3749880
--- /dev/null
+++ b/app/InkForge.Desktop/ViewModels/Workspaces/WorkspaceViewModel.cs
@@ -0,0 +1,26 @@
+using InkForge.Desktop.Models;
+
+namespace InkForge.Desktop.ViewModels.Workspaces;
+
+public class WorkspaceViewModel(Workspace workspace)
+{
+ // private readonly Workspace _workspace;
+ // private readonly ObservableAsPropertyHelper _workspaceNameProperty;
+
+ // public string WorkspaceName => _workspaceNameProperty.Value;
+
+ // public ReactiveCommand AddDocument { get; }
+
+ // public WorkspacesViewModel(Workspace workspace)
+ // {
+ // _workspace = workspace;
+ // _workspaceNameProperty = this.WhenAnyValue(v => v._workspace.Name).ToProperty(this, nameof(WorkspaceName));
+
+ // AddDocument = ReactiveCommand.Create(OnAddDocument);
+ // }
+
+ // private void OnAddDocument()
+ // {
+
+ // }
+}
diff --git a/app/InkForge.Desktop/ViewModels/WorkspacesViewModel.cs b/app/InkForge.Desktop/ViewModels/WorkspacesViewModel.cs
new file mode 100644
index 0000000..a0a76e3
--- /dev/null
+++ b/app/InkForge.Desktop/ViewModels/WorkspacesViewModel.cs
@@ -0,0 +1,24 @@
+using InkForge.Desktop.Managers;
+using InkForge.Desktop.ViewModels.Workspaces;
+
+using ReactiveUI;
+
+namespace InkForge.Desktop.ViewModels;
+
+public class WorkspacesViewModel : ReactiveObject
+{
+ private readonly WorkspaceManager _workspaceManager;
+ private WorkspaceViewModel? _workspace;
+
+ public WorkspaceViewModel? Workspace
+ {
+ get => _workspace;
+ private set => this.RaiseAndSetIfChanged(ref _workspace, value);
+ }
+
+ public WorkspacesViewModel(WorkspaceManager workspaceManager)
+ {
+ _workspaceManager = workspaceManager;
+ workspaceManager.WhenAnyValue(v => v.Workspace, v => v is null ? null : new WorkspaceViewModel(v)).BindTo(this, v => v.Workspace);
+ }
+}
diff --git a/app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml b/app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml
new file mode 100644
index 0000000..277f09b
--- /dev/null
+++ b/app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml
@@ -0,0 +1,14 @@
+
+ Welcome to Avalonia!
+
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml.cs b/app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml.cs
new file mode 100644
index 0000000..61334e9
--- /dev/null
+++ b/app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml.cs
@@ -0,0 +1,13 @@
+using Avalonia.ReactiveUI;
+
+using InkForge.Desktop.ViewModels.Documents;
+
+namespace InkForge.Desktop.Views.Documents;
+
+public partial class WelcomePageDocument : ReactiveUserControl
+{
+ public WelcomePageDocument()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/app/InkForge.Desktop/Views/DocumentsView.axaml b/app/InkForge.Desktop/Views/DocumentsView.axaml
new file mode 100644
index 0000000..a4f00e0
--- /dev/null
+++ b/app/InkForge.Desktop/Views/DocumentsView.axaml
@@ -0,0 +1,12 @@
+
+
+
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/DocumentsView.axaml.cs b/app/InkForge.Desktop/Views/DocumentsView.axaml.cs
new file mode 100644
index 0000000..49b6895
--- /dev/null
+++ b/app/InkForge.Desktop/Views/DocumentsView.axaml.cs
@@ -0,0 +1,24 @@
+using Avalonia;
+using Avalonia.Controls;
+
+using InkForge.Desktop.ViewModels;
+
+using Microsoft.Extensions.DependencyInjection;
+
+namespace InkForge.Desktop.Views;
+
+public partial class DocumentsView : UserControl
+{
+ public DocumentsView()
+ {
+ InitializeComponent();
+ DataContext = CreateViewModel();
+ }
+
+ private static DocumentsViewModel CreateViewModel()
+ {
+ return ActivatorUtilities.CreateInstance(
+ Application.Current!.GetValue(App.ServiceProviderProperty)
+ );
+ }
+}
diff --git a/app/InkForge.Desktop/Views/LandingView.axaml b/app/InkForge.Desktop/Views/LandingView.axaml
deleted file mode 100644
index 93014c9..0000000
--- a/app/InkForge.Desktop/Views/LandingView.axaml
+++ /dev/null
@@ -1,42 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/LandingView.axaml.cs b/app/InkForge.Desktop/Views/LandingView.axaml.cs
deleted file mode 100644
index 0461eca..0000000
--- a/app/InkForge.Desktop/Views/LandingView.axaml.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Avalonia.ReactiveUI;
-
-using InkForge.Desktop.ViewModels;
-
-namespace InkForge.Desktop.Views;
-
-public partial class LandingView : ReactiveUserControl
-{
- public LandingView()
- {
- InitializeComponent();
- }
-}
diff --git a/app/InkForge.Desktop/Views/MainWindow.axaml b/app/InkForge.Desktop/Views/MainWindow.axaml
index a0b6178..0ffa47f 100644
--- a/app/InkForge.Desktop/Views/MainWindow.axaml
+++ b/app/InkForge.Desktop/Views/MainWindow.axaml
@@ -2,19 +2,26 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:reactiveui="http://reactiveui.net"
- xmlns:inkforge="app:InkForge"
- xmlns:vm="using:InkForge.Desktop.ViewModels"
+ xmlns:local="using:InkForge.Desktop.Views"
mc:Ignorable="d"
Width="800"
Height="450"
x:Class="InkForge.Desktop.Views.MainWindow"
- x:DataType="vm:AppViewModel"
- Title="MainWindow"
- inkforge:TopLevels.Register="{CompiledBinding}">
-
-
+ Title="MainWindow">
+
+
+
-
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/MainWindow.axaml.cs b/app/InkForge.Desktop/Views/MainWindow.axaml.cs
index 901ee5c..712ecf3 100644
--- a/app/InkForge.Desktop/Views/MainWindow.axaml.cs
+++ b/app/InkForge.Desktop/Views/MainWindow.axaml.cs
@@ -1,11 +1,8 @@
-using Avalonia.Input;
-using Avalonia.ReactiveUI;
-
-using InkForge.Desktop.ViewModels;
+using Avalonia.Controls;
namespace InkForge.Desktop.Views;
-public partial class MainWindow : ReactiveWindow
+public partial class MainWindow : Window
{
public MainWindow()
{
diff --git a/app/InkForge.Desktop/Views/WorkspaceView.axaml b/app/InkForge.Desktop/Views/WorkspaceView.axaml
deleted file mode 100644
index a6c2139..0000000
--- a/app/InkForge.Desktop/Views/WorkspaceView.axaml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Hello There!
-
-
-
-
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/WorkspaceView.axaml.cs b/app/InkForge.Desktop/Views/WorkspaceView.axaml.cs
deleted file mode 100644
index 4166ebe..0000000
--- a/app/InkForge.Desktop/Views/WorkspaceView.axaml.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using Avalonia.ReactiveUI;
-
-using InkForge.Desktop.ViewModels;
-
-namespace InkForge.Desktop.Views;
-
-public partial class WorkspaceView : ReactiveUserControl
-{
- public WorkspaceView()
- {
- InitializeComponent();
- }
-}
diff --git a/app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.axaml b/app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.axaml
new file mode 100644
index 0000000..35e5083
--- /dev/null
+++ b/app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.axaml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.cs b/app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.cs
new file mode 100644
index 0000000..fed04b6
--- /dev/null
+++ b/app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.cs
@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace InkForge.Desktop.Views.Workspaces;
+
+public partial class WorkspaceViewModel : UserControl
+{
+ public WorkspaceViewModel()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/app/InkForge.Desktop/Views/WorkspacesView.axaml b/app/InkForge.Desktop/Views/WorkspacesView.axaml
new file mode 100644
index 0000000..436690c
--- /dev/null
+++ b/app/InkForge.Desktop/Views/WorkspacesView.axaml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/InkForge.Desktop/Views/WorkspacesView.axaml.cs b/app/InkForge.Desktop/Views/WorkspacesView.axaml.cs
new file mode 100644
index 0000000..8be6766
--- /dev/null
+++ b/app/InkForge.Desktop/Views/WorkspacesView.axaml.cs
@@ -0,0 +1,16 @@
+using Avalonia.Controls;
+
+using InkForge.Desktop.ViewModels;
+
+using Splat;
+
+namespace InkForge.Desktop.Views;
+
+public partial class WorkspacesView : UserControl
+{
+ public WorkspacesView()
+ {
+ InitializeComponent();
+ DataContext = Locator.Current.GetService();
+ }
+}