3~~{<&p`@VN^#m1O+d+zw$x=dlTQJJ+#;re5Vky~JfwYxV&Lkq
z^^Zu!uao)c4f$g~$W+R7`PM9FpvuOy9T>t^iWKUK5(&!2|9a~^f2O(_U7xgq!0cX)
zr~v7nuNltUq?@B62ebf`EU7;Qt#s}Q|0=V1I~6^#GmQv_62fJ`wkdp_)P2^?aUW^E
zeIC~2fy6psoh4xybP)b_Ist|@1crX=87K^XL|^*MX;3AYSJFW5=PGVW&VC5pv_>
z>>!aaB`yh_#<;`SM{lGHo~Z;o>f&?9$_wEe%wE%hX@Asp&Iu#7l~kaP@6@vJK)unf
zdU#lC!@eM%m0@f)w!Kr11s-5QK{Fyu5oO=0W)LYV(cG@DKY5_%(_{~sn}Wc_fvxhq
zh?PDmH9n?;0CM?o^HD|-xU2mYunFLPs|7PyR>}LHJB5WtxbHjg;zL1@H{zrTd;J|k
z{=7zSkbO`6F-)!Pgh<#XcAOMIU?haqcY&~Ow?UO3V`A5k$gHNG#QMmccu0WDq;!|3
zTjhjo<_Hem^Pd7R)F8hKay~St%KZd^aiZ}e5DZsjlF^30$VtxC!^K3<0n-rxx3MKo
ziaD{*nARPBupCj
wu=zs?K@xFB59DJ_h+RJS>+nDz>nUVKKq^kuFRP~l;~VsfJ8!umh|4-qXUegFUf
literal 0
HcmV?d00001
diff --git a/GalaxyViewer.Android/Resources/values-night/colors.xml b/GalaxyViewer.Android/Resources/values-night/colors.xml
index 3d47b6f..e727ff0 100644
--- a/GalaxyViewer.Android/Resources/values-night/colors.xml
+++ b/GalaxyViewer.Android/Resources/values-night/colors.xml
@@ -1,4 +1,4 @@
- #212121
+ #0f1729
diff --git a/GalaxyViewer.Android/Resources/values/colors.xml b/GalaxyViewer.Android/Resources/values/colors.xml
index 59279d5..e727ff0 100644
--- a/GalaxyViewer.Android/Resources/values/colors.xml
+++ b/GalaxyViewer.Android/Resources/values/colors.xml
@@ -1,4 +1,4 @@
- #FFFFFF
+ #0f1729
diff --git a/GalaxyViewer.Browser/GalaxyViewer.Browser.csproj b/GalaxyViewer.Browser/GalaxyViewer.Browser.csproj
index ab16d45..ec18777 100644
--- a/GalaxyViewer.Browser/GalaxyViewer.Browser.csproj
+++ b/GalaxyViewer.Browser/GalaxyViewer.Browser.csproj
@@ -1,21 +1,21 @@
Exe
- net8.0-browser
+ net8.0
browser-wasm
- wwwroot\main.js
+ wwwroot/main.js
./_framework
-
+
-
+
-
+
\ No newline at end of file
diff --git a/GalaxyViewer.Desktop/GalaxyViewer.Desktop.csproj b/GalaxyViewer.Desktop/GalaxyViewer.Desktop.csproj
index 081b729..4d7ebe5 100644
--- a/GalaxyViewer.Desktop/GalaxyViewer.Desktop.csproj
+++ b/GalaxyViewer.Desktop/GalaxyViewer.Desktop.csproj
@@ -13,9 +13,9 @@
-
+
-
+
diff --git a/GalaxyViewer.sln.DotSettings b/GalaxyViewer.sln.DotSettings
index 29d1099..317d147 100644
--- a/GalaxyViewer.sln.DotSettings
+++ b/GalaxyViewer.sln.DotSettings
@@ -1,2 +1,5 @@
+ False
+ False
+ True
True
\ No newline at end of file
diff --git a/GalaxyViewer/App.axaml b/GalaxyViewer/App.axaml
index 3e557b5..fb4985b 100644
--- a/GalaxyViewer/App.axaml
+++ b/GalaxyViewer/App.axaml
@@ -2,7 +2,8 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:GalaxyViewer"
xmlns:semi="https://irihi.tech/semi"
- xmlns:u-semi="https://irihi.tech/ursa/themes/semi"
+ xmlns:u-Semi="https://irihi.tech/ursa/themes/semi"
+ xmlns:converters="clr-namespace:GalaxyViewer.Converters"
x:Class="GalaxyViewer.App">
@@ -10,7 +11,7 @@
-
+
@@ -18,6 +19,7 @@
+
\ No newline at end of file
diff --git a/GalaxyViewer/App.axaml.cs b/GalaxyViewer/App.axaml.cs
index 5e32e54..d00e80d 100644
--- a/GalaxyViewer/App.axaml.cs
+++ b/GalaxyViewer/App.axaml.cs
@@ -1,4 +1,6 @@
+using System;
using System.Diagnostics;
+using System.IO;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
@@ -6,96 +8,134 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Styling;
using GalaxyViewer.Models;
+using GalaxyViewer.Services;
using GalaxyViewer.ViewModels;
using GalaxyViewer.Views;
-using GalaxyViewer.Services;
+using Microsoft.Extensions.DependencyInjection;
using Serilog;
namespace GalaxyViewer;
-public class App : Application
+public class App : Application, IDisposable
{
+ private static IServiceProvider? _serviceProvider;
+ public static PreferencesManager? PreferencesManager { get; private set; }
+
public App()
{
- // Initialize Serilog here
+ ConfigureLogging();
+ }
+
+ private static void ConfigureLogging()
+ {
+ var logFilePath =
+ Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
+ "GalaxyViewer", "logs", "error.log");
+
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
- .WriteTo.File("logs/error.log", rollingInterval: RollingInterval.Day)
+ .WriteTo.File(logFilePath, rollingInterval: RollingInterval.Day)
.CreateLogger();
}
- public static PreferencesManager? PreferencesManager { get; private set; }
+ private static void ConfigureServices(IServiceCollection services)
+ {
+ services.AddSingleton();
+ // Register other services here
+ }
public override void Initialize()
{
- PreferencesManager = new PreferencesManager();
+ var serviceCollection = new ServiceCollection();
+ ConfigureServices(serviceCollection);
+ _serviceProvider = serviceCollection.BuildServiceProvider();
+
+ var liteDbService = _serviceProvider.GetService();
+ if (liteDbService == null)
+ {
+ throw new InvalidOperationException("LiteDbService is not registered.");
+ }
+
+ PreferencesManager = new PreferencesManager(liteDbService);
PreferencesManager.PreferencesChanged += OnPreferencesChanged;
+
AvaloniaXamlLoader.Load(this);
base.Initialize();
}
- public override async void OnFrameworkInitializationCompleted()
+ public override void OnFrameworkInitializationCompleted()
{
- var contentControl = new ContentControl();
- var navigationService = new NavigationService(contentControl);
-
- // Register routes
- navigationService.RegisterRoute("login", typeof(LoginView));
- navigationService.RegisterRoute("debug", typeof(DebugView));
- navigationService.RegisterRoute("preferences", typeof(PreferencesView));
-
- switch (ApplicationLifetime)
+ try
{
- case IClassicDesktopStyleApplicationLifetime desktop:
- desktop.MainWindow = new MainWindow
- {
- DataContext = new MainViewModel(navigationService)
- };
- break;
- case ISingleViewApplicationLifetime singleViewPlatform:
- singleViewPlatform.MainView = new MainView
- {
- DataContext = new MainViewModel(navigationService)
- };
- break;
+ switch (ApplicationLifetime)
+ {
+ case IClassicDesktopStyleApplicationLifetime desktop:
+ Log.Information("Initializing MainWindow for desktop application.");
+ desktop.MainWindow = new MainWindow
+ {
+ DataContext = new MainViewModel()
+ };
+ desktop.MainWindow.Show();
+ break;
+ case ISingleViewApplicationLifetime singleViewPlatform:
+ Log.Information("Initializing MainView for single view application.");
+ singleViewPlatform.MainView = new MainView
+ {
+ DataContext = new MainViewModel()
+ };
+ break;
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.Error(ex, "An error occurred while initializing the main window.");
+ throw; // Optionally rethrow the exception if you want to halt the application
}
-
- Debug.Assert(PreferencesManager != null, nameof(PreferencesManager) + " != null");
- var preferences = await PreferencesManager.LoadPreferencesAsync();
- ApplyPreferences(preferences);
base.OnFrameworkInitializationCompleted();
}
- private async void OnPreferencesChanged(object? sender, PreferencesModel preferences)
+ private void OnPreferencesChanged(object? sender, PreferencesModel preferences)
{
- if (PreferencesManager?.IsLoadingPreferences == true) return;
ApplyPreferences(preferences);
RefreshThemeForAllWindows();
}
private void ApplyPreferences(PreferencesModel preferences)
{
- RequestedThemeVariant = preferences.Theme switch
+ Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =>
{
- "Light" => ThemeVariant.Light,
- "Dark" => ThemeVariant.Dark,
- _ => ThemeVariant.Default
- };
+ RequestedThemeVariant = preferences.Theme switch
+ {
+ "Light" => ThemeVariant.Light,
+ "Dark" => ThemeVariant.Dark,
+ _ => ThemeVariant.Default
+ };
- // TODO: Apply other preferences
+ // TODO: Apply other preferences
+ });
}
- private void RefreshThemeForAllWindows()
+ private async void RefreshThemeForAllWindows()
{
if (ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktopLifetime)
return;
- foreach (var window in desktopLifetime.Windows)
+
+ await Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(async () =>
{
- if (window is not BaseWindow baseWindow) continue;
- var resultTheme = PreferencesManager?.LoadPreferencesAsync().Result.Theme;
- if (resultTheme != null)
- baseWindow.ApplyTheme(resultTheme);
- }
+ foreach (var window in desktopLifetime.Windows)
+ {
+ if (window is not BaseWindow baseWindow) continue;
+ var resultTheme = (await PreferencesManager?.LoadPreferencesAsync())?.Theme;
+ if (resultTheme != null)
+ baseWindow.ApplyTheme(resultTheme);
+ }
+ });
+ }
+
+ public void Dispose()
+ {
+ //PreferencesManager?.Dispose();
+ (_serviceProvider as IDisposable)?.Dispose();
}
}
\ No newline at end of file
diff --git a/GalaxyViewer/Assets/GalaxyViewerLogo.ico b/GalaxyViewer/Assets/GalaxyViewerLogo.ico
new file mode 100644
index 0000000000000000000000000000000000000000..74a3c6cd44405340b01a18657ac4e654de321ced
GIT binary patch
literal 70324
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