From 90aca4b6f3fcf27dbbf0e3e6b6706319136baae7 Mon Sep 17 00:00:00 2001 From: Drombeys Date: Tue, 23 Apr 2024 10:08:58 +0300 Subject: [PATCH] Implement basic loading splash --- .../App.axaml.cs | 42 +++++++++++-- .../Assets/Locales/eng.axaml | 5 ++ .../Assets/Locales/rus.axaml | 5 ++ .../Models/InformationMessage.cs | 3 + .../ViewModels/MainWindowViewModel.cs | 5 ++ .../ViewModels/SplashScreenViewModel.cs | 30 ++++++++++ .../Views/SplashScreenView.axaml | 59 +++++++++++++++++++ .../Views/SplashScreenView.axaml.cs | 10 ++++ .../Manager/InitializerManager.cs | 4 +- 9 files changed, 155 insertions(+), 8 deletions(-) create mode 100644 src/ImeSense.Launchers.Belarus.Avalonia/Models/InformationMessage.cs create mode 100644 src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/SplashScreenViewModel.cs create mode 100644 src/ImeSense.Launchers.Belarus.Avalonia/Views/SplashScreenView.axaml create mode 100644 src/ImeSense.Launchers.Belarus.Avalonia/Views/SplashScreenView.axaml.cs diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/App.axaml.cs b/src/ImeSense.Launchers.Belarus.Avalonia/App.axaml.cs index 675ec31..a6f1d80 100644 --- a/src/ImeSense.Launchers.Belarus.Avalonia/App.axaml.cs +++ b/src/ImeSense.Launchers.Belarus.Avalonia/App.axaml.cs @@ -5,6 +5,7 @@ using Avalonia.Markup.Xaml; using ImeSense.Launchers.Belarus.Avalonia.Manager; +using ImeSense.Launchers.Belarus.Avalonia.Models; using ImeSense.Launchers.Belarus.Avalonia.Services; using ImeSense.Launchers.Belarus.Avalonia.ViewModels; using ImeSense.Launchers.Belarus.Avalonia.ViewModels.Validators; @@ -48,6 +49,7 @@ private IServiceCollection ConfigureServices() services.AddSingleton(); services.AddSingleton(); services.AddTransient(); + services.AddTransient(); services.AddSingleton(); services.AddTransient(); @@ -71,6 +73,7 @@ private IServiceCollection ConfigureServices() services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddSingleton(); @@ -109,15 +112,44 @@ public override void Initialize() public override async void OnFrameworkInitializationCompleted() { if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { - desktop.MainWindow = new MainWindow(); - var initializerManager = _serviceProvider.GetRequiredService(); - await initializerManager.InitializeAsync(); + initializerManager.InitializeLocale(); + + var userManager = _serviceProvider.GetRequiredService(); + var localeManager = _serviceProvider.GetRequiredService(); + var locale = userManager.UserSettings?.Locale?.Key ?? "rus"; + + var initMessage = new InformationMessage( + localeManager.GetStringByKey("LocalizedStrings.Message", locale), + localeManager.GetStringByKey("LocalizedStrings.InitApp", locale) + ); + var splashScreenViewModel = _serviceProvider.GetRequiredService(); var mainViewModel = _serviceProvider.GetRequiredService(); - await mainViewModel.InitializeAsync(); + desktop.MainWindow = new MainWindow { + DataContext = mainViewModel + }; + + try { + mainViewModel.ShowSplashScreenImpl(splashScreenViewModel); + splashScreenViewModel.Progress++; + splashScreenViewModel.InformationMessage = new InformationMessage( + localeManager.GetStringByKey("LocalizedStrings.Loading", locale), + localeManager.GetStringByKey("LocalizedStrings.AccessingRepository", locale)); + //await Task.Delay(2000, splashScreenViewModel.CancellationToken); + await initializerManager.InitializeAsync(); + splashScreenViewModel.Progress++; + splashScreenViewModel.InformationMessage = new InformationMessage( + localeManager.GetStringByKey("LocalizedStrings.Loading", locale), + localeManager.GetStringByKey("LocalizedStrings.DataInitialization", locale)); + //await Task.Delay(2000, splashScreenViewModel.CancellationToken); + await mainViewModel.InitializeAsync(); + splashScreenViewModel.Progress++; + } catch (TaskCanceledException) { + desktop.Shutdown(); + return; + } - desktop.MainWindow.DataContext = _serviceProvider.GetRequiredService(); } base.OnFrameworkInitializationCompleted(); diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/eng.axaml b/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/eng.axaml index f1cc1e7..750f408 100644 --- a/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/eng.axaml +++ b/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/eng.axaml @@ -27,4 +27,9 @@ Unable to connect to the server! Warning News is loading + Message + Cancel + Loading + Accessing the repository + Data initialization diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/rus.axaml b/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/rus.axaml index 3d3c4d0..f84022a 100644 --- a/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/rus.axaml +++ b/src/ImeSense.Launchers.Belarus.Avalonia/Assets/Locales/rus.axaml @@ -27,4 +27,9 @@ Невозможно подключиться к серверу! Предупреждение Идет загрузка новостей + Сообщение + Отменить + Загрузка лаунчера + Обращение к репозиторию + Инициализация данных diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/Models/InformationMessage.cs b/src/ImeSense.Launchers.Belarus.Avalonia/Models/InformationMessage.cs new file mode 100644 index 0000000..c8f70c4 --- /dev/null +++ b/src/ImeSense.Launchers.Belarus.Avalonia/Models/InformationMessage.cs @@ -0,0 +1,3 @@ +namespace ImeSense.Launchers.Belarus.Avalonia.Models; + +public record InformationMessage(string Title, string Description); diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/MainWindowViewModel.cs b/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/MainWindowViewModel.cs index 06159db..e242f7f 100644 --- a/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/MainWindowViewModel.cs +++ b/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/MainWindowViewModel.cs @@ -98,4 +98,9 @@ public void ShowStartGameImpl() { PageViewModel = _startGameViewModel; } + + public void ShowSplashScreenImpl(SplashScreenViewModel splash) + { + PageViewModel = splash; + } } diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/SplashScreenViewModel.cs b/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/SplashScreenViewModel.cs new file mode 100644 index 0000000..19a0c29 --- /dev/null +++ b/src/ImeSense.Launchers.Belarus.Avalonia/ViewModels/SplashScreenViewModel.cs @@ -0,0 +1,30 @@ +using System.Reactive; + +using ImeSense.Launchers.Belarus.Avalonia.Models; + +using ReactiveUI; +using ReactiveUI.Fody.Helpers; + +namespace ImeSense.Launchers.Belarus.Avalonia.ViewModels; + +public class SplashScreenViewModel : ReactiveObject +{ + private readonly CancellationTokenSource _cts = new(); + + public CancellationToken CancellationToken => _cts.Token; + public ReactiveCommand Cancel { get; set; } = null!; + [Reactive] public InformationMessage? InformationMessage { get; set; } + [Reactive] public int Progress { get; set; } = 0; + [Reactive] public int MaxProgress { get; set; } = 3; + + public SplashScreenViewModel() + { + InformationMessage = new InformationMessage("Title", "Description"); + Cancel = ReactiveCommand.Create(CancelImpl); + } + + private void CancelImpl() + { + _cts.Cancel(); + } +} diff --git a/src/ImeSense.Launchers.Belarus.Avalonia/Views/SplashScreenView.axaml b/src/ImeSense.Launchers.Belarus.Avalonia/Views/SplashScreenView.axaml new file mode 100644 index 0000000..e9d2161 --- /dev/null +++ b/src/ImeSense.Launchers.Belarus.Avalonia/Views/SplashScreenView.axaml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + +