From 693d12b61cc92b3d56fe4c6cb921164a65670a23 Mon Sep 17 00:00:00 2001 From: AliveDevil Date: Mon, 26 Feb 2024 18:08:18 +0100 Subject: [PATCH] Dock --- Directory.Packages.props | 1 + app/InkForge.Desktop/App.axaml | 1 + app/InkForge.Desktop/App.axaml.cs | 34 +-------- app/InkForge.Desktop/Dock/WorkspaceFactory.cs | 29 ++++++++ app/InkForge.Desktop/InkForge.Desktop.csproj | 1 + .../Managers/DocumentManager.cs | 11 +++ .../Managers/WorkspaceManager.cs | 8 +-- .../InkForgeServiceCollection.cs | 19 +++-- .../DependencyInjection/TypeFactories.cs | 15 ++++ app/InkForge.Desktop/Models/Note.cs | 6 ++ app/InkForge.Desktop/Models/Workspace.cs | 14 ++-- ...rkspaceAccessor.cs => WorkspaceContext.cs} | 4 +- app/InkForge.Desktop/Program.cs | 14 ++-- .../Properties/AssemblyInfo.cs | 6 ++ .../Services/WorkspaceContext.cs | 6 -- .../ViewModels/AppViewModel.cs | 36 ---------- .../WelcomePageDocumentViewModel.cs} | 14 ++-- .../ViewModels/DocumentsViewModel.cs | 23 +++++++ .../ViewModels/WorkspaceViewModel.cs | 19 ----- .../Workspaces/WorkspaceViewModel.cs | 26 +++++++ .../ViewModels/WorkspacesViewModel.cs | 24 +++++++ .../Views/Documents/WelcomePageDocument.axaml | 14 ++++ .../Documents/WelcomePageDocument.axaml.cs | 13 ++++ .../Views/DocumentsView.axaml | 12 ++++ .../Views/DocumentsView.axaml.cs | 24 +++++++ app/InkForge.Desktop/Views/LandingView.axaml | 42 ----------- .../Views/LandingView.axaml.cs | 13 ---- app/InkForge.Desktop/Views/MainWindow.axaml | 25 ++++--- .../Views/MainWindow.axaml.cs | 7 +- .../Views/WorkspaceView.axaml | 69 ------------------- .../Views/WorkspaceView.axaml.cs | 13 ---- .../Views/Workspaces/WorkspaceViewModel.axaml | 53 ++++++++++++++ .../Views/Workspaces/WorkspaceViewModel.cs | 13 ++++ .../Views/WorkspacesView.axaml | 33 +++++++++ .../Views/WorkspacesView.axaml.cs | 16 +++++ 35 files changed, 389 insertions(+), 269 deletions(-) create mode 100644 app/InkForge.Desktop/Dock/WorkspaceFactory.cs create mode 100644 app/InkForge.Desktop/Managers/DocumentManager.cs create mode 100644 app/InkForge.Desktop/Models/Note.cs rename app/InkForge.Desktop/Models/{WorkspaceAccessor.cs => WorkspaceContext.cs} (59%) create mode 100644 app/InkForge.Desktop/Properties/AssemblyInfo.cs delete mode 100644 app/InkForge.Desktop/Services/WorkspaceContext.cs delete mode 100644 app/InkForge.Desktop/ViewModels/AppViewModel.cs rename app/InkForge.Desktop/ViewModels/{LandingViewModel.cs => Documents/WelcomePageDocumentViewModel.cs} (84%) create mode 100644 app/InkForge.Desktop/ViewModels/DocumentsViewModel.cs delete mode 100644 app/InkForge.Desktop/ViewModels/WorkspaceViewModel.cs create mode 100644 app/InkForge.Desktop/ViewModels/Workspaces/WorkspaceViewModel.cs create mode 100644 app/InkForge.Desktop/ViewModels/WorkspacesViewModel.cs create mode 100644 app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml create mode 100644 app/InkForge.Desktop/Views/Documents/WelcomePageDocument.axaml.cs create mode 100644 app/InkForge.Desktop/Views/DocumentsView.axaml create mode 100644 app/InkForge.Desktop/Views/DocumentsView.axaml.cs delete mode 100644 app/InkForge.Desktop/Views/LandingView.axaml delete mode 100644 app/InkForge.Desktop/Views/LandingView.axaml.cs delete mode 100644 app/InkForge.Desktop/Views/WorkspaceView.axaml delete mode 100644 app/InkForge.Desktop/Views/WorkspaceView.axaml.cs create mode 100644 app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.axaml create mode 100644 app/InkForge.Desktop/Views/Workspaces/WorkspaceViewModel.cs create mode 100644 app/InkForge.Desktop/Views/WorkspacesView.axaml create mode 100644 app/InkForge.Desktop/Views/WorkspacesView.axaml.cs 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(); + } +}