diff --git a/Needlework.Net/App.axaml b/Needlework.Net/App.axaml
index a0e5438..1829c04 100644
--- a/Needlework.Net/App.axaml
+++ b/Needlework.Net/App.axaml
@@ -7,12 +7,8 @@
xmlns:materialIcons="clr-namespace:Material.Icons.Avalonia;assembly=Material.Icons.Avalonia"
RequestedThemeVariant="Dark">
-
-
-
-
-
+
diff --git a/Needlework.Net/App.axaml.cs b/Needlework.Net/App.axaml.cs
index a1bee0d..aa0c9d4 100644
--- a/Needlework.Net/App.axaml.cs
+++ b/Needlework.Net/App.axaml.cs
@@ -2,18 +2,31 @@ using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
-using Microsoft.Extensions.DependencyInjection;
+using Flurl.Http.Configuration;
+using Needlework.Net.Converters;
+using Needlework.Net.Services;
using Needlework.Net.ViewModels.MainWindow;
+using Needlework.Net.ViewModels.Pages;
+using Needlework.Net.ViewModels.Pages.About;
+using Needlework.Net.ViewModels.Pages.Console;
+using Needlework.Net.ViewModels.Pages.Endpoints;
+using Needlework.Net.ViewModels.Pages.Home;
+using Needlework.Net.ViewModels.Pages.WebSocket;
using Needlework.Net.Views.MainWindow;
-using System;
+using Needlework.Net.Views.Pages.About;
+using Needlework.Net.Views.Pages.Console;
+using Needlework.Net.Views.Pages.Endpoints;
+using Needlework.Net.Views.Pages.Home;
+using Needlework.Net.Views.Pages.WebSocket;
+using ReactiveUI;
+using Splat;
+using Splat.Serilog;
using System.Text.Json;
namespace Needlework.Net;
-public partial class App(IServiceProvider serviceProvider) : Application
+public partial class App : Application
{
- private readonly IServiceProvider _serviceProvider = serviceProvider;
-
public static JsonSerializerOptions JsonSerializerOptions { get; } = new()
{
WriteIndented = true,
@@ -31,15 +44,62 @@ public partial class App(IServiceProvider serviceProvider) : Application
public override void OnFrameworkInitializationCompleted()
{
+ RegisterValueConverters();
+ RegisterAppServices();
+ RegisterViews();
+ RegisterViewModels();
+
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
- desktop.MainWindow = new MainWindowView()
- {
- DataContext = _serviceProvider.GetRequiredService()
- };
+ desktop.MainWindow = new MainWindow() { DataContext = Locator.Current.GetService() };
MainWindow = desktop.MainWindow;
}
base.OnFrameworkInitializationCompleted();
}
+
+ private void RegisterValueConverters()
+ {
+ Locator.CurrentMutable.RegisterConstant(new NullableToVisibilityConverter());
+ Locator.CurrentMutable.RegisterConstant(new EnumerableToVisibilityConverter());
+ }
+
+ private static void RegisterViewModels()
+ {
+ Locator.CurrentMutable.RegisterConstant(new HomeViewModel());
+ Locator.CurrentMutable.RegisterConstant(new EndpointsViewModel());
+ Locator.CurrentMutable.RegisterConstant(new ConsoleViewModel());
+ Locator.CurrentMutable.RegisterConstant(new WebSocketViewModel());
+ Locator.CurrentMutable.RegisterConstant(new AboutViewModel());
+ Locator.CurrentMutable.RegisterConstant(new MainWindowViewModel());
+ }
+
+ private static void RegisterViews()
+ {
+ Locator.CurrentMutable.Register>(() => new LibraryView());
+ Locator.CurrentMutable.Register>(() => new NotificationView());
+ Locator.CurrentMutable.Register>(() => new EventView());
+ Locator.CurrentMutable.Register>(() => new EndpointTabListView());
+ Locator.CurrentMutable.Register>(() => new EndpointTabItemContentView());
+ Locator.CurrentMutable.Register>(() => new EndpointSearchDetailsView());
+ Locator.CurrentMutable.Register>(() => new PluginView());
+ Locator.CurrentMutable.Register>(() => new PropertyClassView());
+ Locator.CurrentMutable.Register>(() => new PathOperationView());
+
+ Locator.CurrentMutable.RegisterConstant>(new HomePage());
+ Locator.CurrentMutable.RegisterConstant>(new EndpointsPage());
+ Locator.CurrentMutable.RegisterConstant>(new ConsolePage());
+ Locator.CurrentMutable.RegisterConstant>(new WebSocketPage());
+ Locator.CurrentMutable.RegisterConstant>(new AboutPage());
+ }
+
+ private static void RegisterAppServices()
+ {
+ Locator.CurrentMutable.UseSerilogFullLogger(Logger.Setup());
+ Locator.CurrentMutable.RegisterConstant(new FlurlClientCache()
+ .Add("GithubClient", "https://api.github.com")
+ .Add("GithubUserContentClient", "https://raw.githubusercontent.com"));
+ Locator.CurrentMutable.RegisterConstant(new NotificationService());
+ Locator.CurrentMutable.RegisterConstant(new DataSource());
+ }
}
\ No newline at end of file
diff --git a/Needlework.Net/Converters/EnumerableToVisibilityConverter.cs b/Needlework.Net/Converters/EnumerableToVisibilityConverter.cs
new file mode 100644
index 0000000..7668abd
--- /dev/null
+++ b/Needlework.Net/Converters/EnumerableToVisibilityConverter.cs
@@ -0,0 +1,33 @@
+using ReactiveUI;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Needlework.Net.Converters
+{
+ public class EnumerableToVisibilityConverter : IBindingTypeConverter
+ {
+ public int GetAffinityForObjects(Type fromType, Type toType)
+ {
+ if (typeof(IEnumerable