Files
se-launcher/CringePlugins/Splash/Splash.cs
zznty 79f8d4b6a5
All checks were successful
Build / Compute Version (push) Successful in 6s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 4m16s
Build / Build Nuget package (NuGet) (push) Successful in 4m16s
Build / Build Nuget package (SharedCringe) (push) Successful in 4m15s
Build / Build Nuget package (CringePlugins) (push) Successful in 4m41s
Build / Build Launcher (push) Successful in 5m12s
basic splash.png
2025-06-08 21:46:47 +07:00

90 lines
2.6 KiB
C#

using System.Numerics;
using CringePlugins.Abstractions;
using CringePlugins.Services;
using ImGuiNET;
using Microsoft.Extensions.DependencyInjection;
using NLog;
using static ImGuiNET.ImGui;
namespace CringePlugins.Splash;
public class Splash : ISplashProgress, IRenderComponent
{
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private readonly List<ILoadingStage> _loadingStages = [];
private ProgressInfo? _lastInfo;
private bool _done;
private readonly string _splashPath = Path.Join(AppContext.BaseDirectory, "splash.png");
private readonly IImGuiImageService _imageService =
GameServicesExtension.GameServices.GetRequiredService<IImGuiImageService>();
public void Report(ProgressInfo value)
{
_lastInfo = value;
if (value is PercentProgressInfo percentProgressInfo)
Logger.Info("{Text} {Percent:P0}", percentProgressInfo.Text, percentProgressInfo.Percent);
else
Logger.Info("{Text}", value.Text);
}
public void Report(float value)
{
if (_lastInfo is not null)
Logger.Info("{Text} {Percent:P0}", _lastInfo.Text, value);
}
public void DefineStage(ILoadingStage stage) => _loadingStages.Add(stage);
public void DefineStepsCount(int count)
{
}
public void ExecuteLoadingStages()
{
try
{
foreach (var loadingStage in _loadingStages)
{
// todo sync context
loadingStage.Load(this).AsTask().GetAwaiter().GetResult();
_lastInfo = null;
}
}
finally
{
_done = true;
}
}
public void OnFrame()
{
if (_done) return;
SetNextWindowPos(GetMainViewport().GetCenter(), ImGuiCond.Always, new(.5f, .5f));
const int imageSize = 512;
SetNextWindowSize(new(512, GetFrameHeightWithSpacing() * 2 + imageSize), ImGuiCond.Always);
Begin("Splash", ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoInputs);
var image = _imageService.GetFromPath(_splashPath);
Image(image, new(imageSize));
var sizeArg = new Vector2(GetWindowWidth() - GetStyle().WindowPadding.X * 2, 0);
if (_lastInfo is null)
{
const string text = "Loading...";
var size = CalcTextSize(text);
SetCursorPosX((GetWindowWidth() - size.X) * .5f);
Text(text);
}
else
ProgressBar((_lastInfo as PercentProgressInfo)?.Percent ?? 0, sizeArg, _lastInfo.Text);
End();
}
}