DiscordChatExporter/DiscordChatExporter.Gui/App.axaml.cs

122 lines
3.9 KiB
C#
Raw Normal View History

2024-04-26 21:17:46 -04:00
using System;
using System.Net;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
using Avalonia.Platform;
using DiscordChatExporter.Gui.Framework;
using DiscordChatExporter.Gui.Services;
using DiscordChatExporter.Gui.Utils;
using DiscordChatExporter.Gui.Utils.Extensions;
2024-04-26 21:17:46 -04:00
using DiscordChatExporter.Gui.ViewModels;
using DiscordChatExporter.Gui.ViewModels.Components;
using DiscordChatExporter.Gui.ViewModels.Dialogs;
using DiscordChatExporter.Gui.Views;
using Material.Styles.Themes;
using Microsoft.Extensions.DependencyInjection;
namespace DiscordChatExporter.Gui;
public class App : Application, IDisposable
2024-04-26 21:17:46 -04:00
{
2024-05-15 16:16:14 -04:00
private readonly DisposableCollector _eventRoot = new();
2024-04-26 21:17:46 -04:00
private readonly ServiceProvider _services;
private readonly SettingsService _settingsService;
2024-04-26 21:17:46 -04:00
private readonly MainViewModel _mainViewModel;
public App()
{
var services = new ServiceCollection();
// Framework
services.AddSingleton<DialogManager>();
services.AddSingleton<SnackbarManager>();
services.AddSingleton<ViewManager>();
services.AddSingleton<ViewModelManager>();
// Services
services.AddSingleton<SettingsService>();
services.AddSingleton<UpdateService>();
// View models
services.AddTransient<MainViewModel>();
services.AddTransient<DashboardViewModel>();
services.AddTransient<ExportSetupViewModel>();
services.AddTransient<MessageBoxViewModel>();
services.AddTransient<SettingsViewModel>();
_services = services.BuildServiceProvider(true);
_settingsService = _services.GetRequiredService<SettingsService>();
2024-04-26 21:17:46 -04:00
_mainViewModel = _services.GetRequiredService<ViewModelManager>().CreateMainViewModel();
// Re-initialize the theme when the user changes it
_eventRoot.Add(
_settingsService.WatchProperty(
o => o.Theme,
() =>
{
RequestedThemeVariant = _settingsService.Theme switch
{
ThemeVariant.Light => Avalonia.Styling.ThemeVariant.Light,
ThemeVariant.Dark => Avalonia.Styling.ThemeVariant.Dark,
2024-05-13 17:03:32 -04:00
_ => Avalonia.Styling.ThemeVariant.Default
};
InitializeTheme();
}
)
);
2024-04-26 21:17:46 -04:00
}
public override void Initialize()
{
base.Initialize();
2024-04-26 21:17:46 -04:00
// Increase maximum concurrent connections
ServicePointManager.DefaultConnectionLimit = 20;
AvaloniaXamlLoader.Load(this);
}
private void InitializeTheme()
{
var actualTheme = RequestedThemeVariant?.Key switch
{
"Light" => PlatformThemeVariant.Light,
"Dark" => PlatformThemeVariant.Dark,
2024-05-13 17:03:32 -04:00
_ => PlatformSettings?.GetColorValues().ThemeVariant ?? PlatformThemeVariant.Light
};
2024-05-13 17:03:32 -04:00
this.LocateMaterialTheme<MaterialThemeBase>().CurrentTheme =
actualTheme == PlatformThemeVariant.Light
? Theme.Create(Theme.Light, Color.Parse("#343838"), Color.Parse("#F9A825"))
: Theme.Create(Theme.Dark, Color.Parse("#E8E8E8"), Color.Parse("#F9A825"));
}
2024-04-26 21:17:46 -04:00
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
desktop.MainWindow = new MainView { DataContext = _mainViewModel };
base.OnFrameworkInitializationCompleted();
// Set up custom theme colors
InitializeTheme();
2024-04-26 21:17:46 -04:00
// Load settings
_settingsService.Load();
2024-04-26 21:17:46 -04:00
}
private void Application_OnActualThemeVariantChanged(object? sender, EventArgs args) =>
// Re-initialize the theme when the system theme changes
InitializeTheme();
2024-04-26 21:17:46 -04:00
public void Dispose()
2024-04-26 21:17:46 -04:00
{
_eventRoot.Dispose();
_services.Dispose();
2024-04-26 21:17:46 -04:00
}
}