diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml b/src/Avalonia/Artemis.UI.Linux/App.axaml index 25cdb6886..59ab769bd 100644 --- a/src/Avalonia/Artemis.UI.Linux/App.axaml +++ b/src/Avalonia/Artemis.UI.Linux/App.axaml @@ -1,6 +1,5 @@ @@ -8,6 +7,7 @@ - + + - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Linux/App.axaml.cs b/src/Avalonia/Artemis.UI.Linux/App.axaml.cs index 99bf1b9ab..a054a252d 100644 --- a/src/Avalonia/Artemis.UI.Linux/App.axaml.cs +++ b/src/Avalonia/Artemis.UI.Linux/App.axaml.cs @@ -1,50 +1,26 @@ -using Artemis.Core.Ninject; -using Artemis.UI.Ninject; -using Artemis.UI.Screens.Root.ViewModels; -using Artemis.UI.Shared.Ninject; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Threading; -using Ninject; using ReactiveUI; -using Splat.Ninject; namespace Artemis.UI.Linux { public class App : Application { - private StandardKernel _kernel = null!; - public override void Initialize() { - InitializeNinject(); + ArtemisBootstrapper.Bootstrap(); RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; - AvaloniaXamlLoader.Load(this); } public override void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - desktop.MainWindow = new MainWindow - { - DataContext = _kernel.Get() - }; + ArtemisBootstrapper.ConfigureApplicationLifetime(desktop); base.OnFrameworkInitializationCompleted(); } - - private void InitializeNinject() - { - _kernel = new StandardKernel(); - _kernel.Settings.InjectNonPublic = true; - - _kernel.Load(); - _kernel.Load(); - _kernel.Load(); - - _kernel.UseNinjectDependencyResolver(); - } } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.MacOS/App.axaml b/src/Avalonia/Artemis.UI.MacOS/App.axaml index 100a21804..2ee6366e3 100644 --- a/src/Avalonia/Artemis.UI.MacOS/App.axaml +++ b/src/Avalonia/Artemis.UI.MacOS/App.axaml @@ -1,6 +1,5 @@ @@ -8,6 +7,7 @@ - + + - + \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.MacOS/App.axaml.cs b/src/Avalonia/Artemis.UI.MacOS/App.axaml.cs index 49e01c8e7..597873852 100644 --- a/src/Avalonia/Artemis.UI.MacOS/App.axaml.cs +++ b/src/Avalonia/Artemis.UI.MacOS/App.axaml.cs @@ -1,50 +1,26 @@ -using Artemis.Core.Ninject; -using Artemis.UI.Ninject; -using Artemis.UI.Screens.Root.ViewModels; -using Artemis.UI.Shared.Ninject; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Threading; -using Ninject; using ReactiveUI; -using Splat.Ninject; namespace Artemis.UI.MacOS { public class App : Application { - private StandardKernel _kernel = null!; - public override void Initialize() { - InitializeNinject(); + ArtemisBootstrapper.Bootstrap(); RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; - AvaloniaXamlLoader.Load(this); } public override void OnFrameworkInitializationCompleted() { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - desktop.MainWindow = new MainWindow - { - DataContext = _kernel.Get() - }; + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + ArtemisBootstrapper.ConfigureApplicationLifetime(desktop); base.OnFrameworkInitializationCompleted(); } - - private void InitializeNinject() - { - _kernel = new StandardKernel(); - _kernel.Settings.InjectNonPublic = true; - - _kernel.Load(); - _kernel.Load(); - _kernel.Load(); - - _kernel.UseNinjectDependencyResolver(); - } } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI.Shared/Styles/Artemis.axaml b/src/Avalonia/Artemis.UI.Shared/Styles/Artemis.axaml new file mode 100644 index 000000000..008cf7654 --- /dev/null +++ b/src/Avalonia/Artemis.UI.Shared/Styles/Artemis.axaml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/src/Avalonia/Artemis.UI/Styles/Border.axaml b/src/Avalonia/Artemis.UI.Shared/Styles/Border.axaml similarity index 100% rename from src/Avalonia/Artemis.UI/Styles/Border.axaml rename to src/Avalonia/Artemis.UI.Shared/Styles/Border.axaml diff --git a/src/Avalonia/Artemis.UI/Styles/Button.axaml b/src/Avalonia/Artemis.UI.Shared/Styles/Button.axaml similarity index 100% rename from src/Avalonia/Artemis.UI/Styles/Button.axaml rename to src/Avalonia/Artemis.UI.Shared/Styles/Button.axaml diff --git a/src/Avalonia/Artemis.UI/Styles/Sidebar.axaml b/src/Avalonia/Artemis.UI.Shared/Styles/Sidebar.axaml similarity index 100% rename from src/Avalonia/Artemis.UI/Styles/Sidebar.axaml rename to src/Avalonia/Artemis.UI.Shared/Styles/Sidebar.axaml diff --git a/src/Avalonia/Artemis.UI/Styles/TextBlock.axaml b/src/Avalonia/Artemis.UI.Shared/Styles/TextBlock.axaml similarity index 100% rename from src/Avalonia/Artemis.UI/Styles/TextBlock.axaml rename to src/Avalonia/Artemis.UI.Shared/Styles/TextBlock.axaml diff --git a/src/Avalonia/Artemis.UI.Windows/App.axaml b/src/Avalonia/Artemis.UI.Windows/App.axaml index c0d54a0e2..117be8559 100644 --- a/src/Avalonia/Artemis.UI.Windows/App.axaml +++ b/src/Avalonia/Artemis.UI.Windows/App.axaml @@ -1,31 +1,13 @@ - - - - - - - - - - - - - - - - - - + + diff --git a/src/Avalonia/Artemis.UI.Windows/App.axaml.cs b/src/Avalonia/Artemis.UI.Windows/App.axaml.cs index 4e72ab276..65a5c77b2 100644 --- a/src/Avalonia/Artemis.UI.Windows/App.axaml.cs +++ b/src/Avalonia/Artemis.UI.Windows/App.axaml.cs @@ -1,27 +1,18 @@ -using Artemis.Core.Ninject; -using Artemis.UI.Ninject; -using Artemis.UI.Screens.Root.ViewModels; -using Artemis.UI.Shared.Ninject; using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Threading; using FluentAvalonia.Styling; -using Ninject; using ReactiveUI; -using Splat.Ninject; namespace Artemis.UI.Windows { public class App : Application { - private StandardKernel _kernel = null!; - public override void Initialize() { - InitializeNinject(); + ArtemisBootstrapper.Bootstrap(); RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; - AvaloniaXamlLoader.Load(this); } @@ -29,26 +20,11 @@ namespace Artemis.UI.Windows { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - desktop.MainWindow = new MainWindow - { - DataContext = _kernel.Get() - }; + ArtemisBootstrapper.ConfigureApplicationLifetime(desktop); AvaloniaLocator.Current.GetService().ForceNativeTitleBarToTheme(desktop.MainWindow, "Dark"); } base.OnFrameworkInitializationCompleted(); } - - private void InitializeNinject() - { - _kernel = new StandardKernel(); - _kernel.Settings.InjectNonPublic = true; - - _kernel.Load(); - _kernel.Load(); - _kernel.Load(); - - _kernel.UseNinjectDependencyResolver(); - } } } \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI/App.axaml b/src/Avalonia/Artemis.UI/App.axaml deleted file mode 100644 index 320593eef..000000000 --- a/src/Avalonia/Artemis.UI/App.axaml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI/App.axaml.cs b/src/Avalonia/Artemis.UI/App.axaml.cs deleted file mode 100644 index 0572fda7c..000000000 --- a/src/Avalonia/Artemis.UI/App.axaml.cs +++ /dev/null @@ -1,54 +0,0 @@ -using Artemis.Core.Ninject; -using Artemis.UI.Ninject; -using Artemis.UI.Screens.Root.ViewModels; -using Artemis.UI.Shared.Ninject; -using Avalonia; -using Avalonia.Controls.ApplicationLifetimes; -using Avalonia.Markup.Xaml; -using Avalonia.Threading; -using FluentAvalonia.Styling; -using Ninject; -using ReactiveUI; -using Splat.Ninject; - -namespace Artemis.UI -{ - public class App : Application - { - private StandardKernel _kernel = null!; - - public override void Initialize() - { - InitializeNinject(); - RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; - - AvaloniaXamlLoader.Load(this); - } - - public override void OnFrameworkInitializationCompleted() - { - if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) - { - desktop.MainWindow = new MainWindow - { - DataContext = _kernel.Get() - }; - AvaloniaLocator.Current.GetService().ForceNativeTitleBarToTheme(desktop.MainWindow, "Dark"); - } - - base.OnFrameworkInitializationCompleted(); - } - - private void InitializeNinject() - { - _kernel = new StandardKernel(); - _kernel.Settings.InjectNonPublic = true; - - _kernel.Load(); - _kernel.Load(); - _kernel.Load(); - - _kernel.UseNinjectDependencyResolver(); - } - } -} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI/Artemis.UI.csproj b/src/Avalonia/Artemis.UI/Artemis.UI.csproj index 76d126dc2..0397a036b 100644 --- a/src/Avalonia/Artemis.UI/Artemis.UI.csproj +++ b/src/Avalonia/Artemis.UI/Artemis.UI.csproj @@ -8,6 +8,10 @@ + + + + diff --git a/src/Avalonia/Artemis.UI/ArtemisBootstrapper.cs b/src/Avalonia/Artemis.UI/ArtemisBootstrapper.cs new file mode 100644 index 000000000..8d47b2f6d --- /dev/null +++ b/src/Avalonia/Artemis.UI/ArtemisBootstrapper.cs @@ -0,0 +1,39 @@ +using Artemis.Core.Ninject; +using Artemis.UI.Exceptions; +using Artemis.UI.Ninject; +using Artemis.UI.Screens.Root.ViewModels; +using Artemis.UI.Shared.Ninject; +using Avalonia.Controls.ApplicationLifetimes; +using Ninject; +using Splat.Ninject; + +namespace Artemis.UI +{ + public static class ArtemisBootstrapper + { + private static StandardKernel? _kernel; + + public static void Bootstrap() + { + if (_kernel != null) + throw new ArtemisUIException("UI already bootstrapped"); + + _kernel = new StandardKernel(); + _kernel.Settings.InjectNonPublic = true; + + _kernel.Load(); + _kernel.Load(); + _kernel.Load(); + + _kernel.UseNinjectDependencyResolver(); + } + + public static void ConfigureApplicationLifetime(IClassicDesktopStyleApplicationLifetime applicationLifetime) + { + if (_kernel == null) + throw new ArtemisUIException("UI not yet bootstrapped"); + + applicationLifetime.MainWindow = new MainWindow {DataContext = _kernel.Get()}; + } + } +} \ No newline at end of file diff --git a/src/Avalonia/Artemis.UI/Styles/Artemis.axaml b/src/Avalonia/Artemis.UI/Styles/Artemis.axaml new file mode 100644 index 000000000..8ad567c01 --- /dev/null +++ b/src/Avalonia/Artemis.UI/Styles/Artemis.axaml @@ -0,0 +1,13 @@ + + + + + + + + + + +