Skip to content

Commit

Permalink
Implement basic loading splash
Browse files Browse the repository at this point in the history
  • Loading branch information
Drombeys committed Apr 23, 2024
1 parent 5b77c4a commit 90aca4b
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 8 deletions.
42 changes: 37 additions & 5 deletions src/ImeSense.Launchers.Belarus.Avalonia/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -48,6 +49,7 @@ private IServiceCollection ConfigureServices()
services.AddSingleton<LinkView>();
services.AddSingleton<NewsSliderView>();
services.AddTransient<NewsView>();
services.AddTransient<SplashScreenView>();
services.AddSingleton<StartGameView>();

services.AddTransient<GameDirectoryValidator>();
Expand All @@ -71,6 +73,7 @@ private IServiceCollection ConfigureServices()
services.AddSingleton<StartGameViewModelValidator>();
services.AddSingleton<UserManager>();
services.AddSingleton<InitializerManager>();
services.AddTransient<SplashScreenViewModel>();
services.AddTransient<LinkViewModel>();
services.AddTransient<NewsSliderViewModel>();
services.AddSingleton<LauncherViewModel>();
Expand Down Expand Up @@ -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<InitializerManager>();
await initializerManager.InitializeAsync();
initializerManager.InitializeLocale();

var userManager = _serviceProvider.GetRequiredService<UserManager>();
var localeManager = _serviceProvider.GetRequiredService<ILocaleManager>();
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<SplashScreenViewModel>();
var mainViewModel = _serviceProvider.GetRequiredService<MainWindowViewModel>();
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<MainWindowViewModel>();
}

base.OnFrameworkInitializationCompleted();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,9 @@
<s:String x:Key="LocalizedStrings.ErrorInternetDescription">Unable to connect to the server!</s:String>
<s:String x:Key="LocalizedStrings.Warning">Warning</s:String>
<s:String x:Key="LocalizedStrings.LoadNews">News is loading</s:String>
<s:String x:Key="LocalizedStrings.Message">Message</s:String>
<s:String x:Key="LocalizedStrings.Cancel">Cancel</s:String>
<s:String x:Key="LocalizedStrings.Loading">Loading</s:String>
<s:String x:Key="LocalizedStrings.AccessingRepository">Accessing the repository</s:String>
<s:String x:Key="LocalizedStrings.DataInitialization">Data initialization</s:String>
</ResourceDictionary>
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,9 @@
<s:String x:Key="LocalizedStrings.ErrorInternetDescription">Невозможно подключиться к серверу!</s:String>
<s:String x:Key="LocalizedStrings.Warning">Предупреждение</s:String>
<s:String x:Key="LocalizedStrings.LoadNews">Идет загрузка новостей</s:String>
<s:String x:Key="LocalizedStrings.Message">Сообщение</s:String>
<s:String x:Key="LocalizedStrings.Cancel">Отменить</s:String>
<s:String x:Key="LocalizedStrings.Loading">Загрузка лаунчера</s:String>
<s:String x:Key="LocalizedStrings.AccessingRepository">Обращение к репозиторию</s:String>
<s:String x:Key="LocalizedStrings.DataInitialization">Инициализация данных</s:String>
</ResourceDictionary>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
namespace ImeSense.Launchers.Belarus.Avalonia.Models;

public record InformationMessage(string Title, string Description);
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,9 @@ public void ShowStartGameImpl()
{
PageViewModel = _startGameViewModel;
}

public void ShowSplashScreenImpl(SplashScreenViewModel splash)
{
PageViewModel = splash;
}
}
Original file line number Diff line number Diff line change
@@ -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<Unit, Unit> 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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<UserControl
x:Class="ImeSense.Launchers.Belarus.Avalonia.Views.SplashScreenView"
x:DataType="vm:SplashScreenViewModel"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:vm="using:ImeSense.Launchers.Belarus.Avalonia.ViewModels"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">

<Design.DataContext>
<vm:SplashScreenViewModel />
</Design.DataContext>

<Border
Padding="30,30,30,0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Classes="styled">
<StackPanel>
<TextBlock
Text="{Binding InformationMessage.Title}"
Margin="10"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Classes="styled"
FontSize="28" />

<TextBlock
Text="{Binding InformationMessage.Description}"
Margin="10,10"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Classes="styled"
FontSize="20" />

<ProgressBar
Value="{Binding Progress}"
Height="10"
Margin="0,5,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Foreground="LightGray"
Maximum="{Binding MaxProgress}"
Minimum="0" />
<Button
Content="{DynamicResource LocalizedStrings.Cancel}"
Command="{Binding Cancel}"
Margin="10"
Padding="10"
HorizontalAlignment="Center"
Classes="styled"
FontSize="20" />
</StackPanel>
</Border>

</UserControl>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Avalonia.Controls;

namespace ImeSense.Launchers.Belarus.Avalonia.Views;
public partial class SplashScreenView : UserControl
{
public SplashScreenView()
{
InitializeComponent();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ public class InitializerManager(

public async Task InitializeAsync()
{
SetLocale();

try {
var stopwatch = new Stopwatch();
stopwatch.Start();
Expand Down Expand Up @@ -175,7 +173,7 @@ private async Task<bool> IsGameReleaseCurrentAsync()
}
}

private void SetLocale()
public void InitializeLocale()
{
var userSettings = _userManager.UserSettings ??
throw new Exception("Error loading user config!");
Expand Down

0 comments on commit 90aca4b

Please sign in to comment.