- Choosing another language now changes every text on the screen at once. Before, the titles, the question about the test from outside and most labels stayed in the previous language until the app was restarted. - On narrow phones the name at the top shrinks to fit instead of slipping under the info button. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
78 lines
2.7 KiB
C#
78 lines
2.7 KiB
C#
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Headless;
|
|
using Avalonia.Media.Imaging;
|
|
using Avalonia.Threading;
|
|
|
|
using MeWeb.App;
|
|
using MeWeb.App.Services;
|
|
using MeWeb.App.ViewModels;
|
|
using MeWeb.App.Views;
|
|
using MeWeb.Core.Checks;
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
var output = args.Length > 0 ? args[0] : Path.Combine("dist", "screenshots");
|
|
var codes = args.Length > 1 ? args[1].Split(',', StringSplitOptions.RemoveEmptyEntries) : Languages.All.Select(l => l.Code).ToArray();
|
|
Directory.CreateDirectory(output);
|
|
|
|
var session = HeadlessUnitTestSession.StartNew(typeof(ScreenshotEntry));
|
|
await session.Dispatch(async () =>
|
|
{
|
|
var saved = AppSettings.Read();
|
|
var run = await App.Services.GetRequiredService<CheckRunner>().Run((_, _) => { }, CancellationToken.None);
|
|
Console.WriteLine($"run: {string.Join(", ", run.Findings.Select(f => $"{f.Id}={f.Outcome}"))}");
|
|
foreach (var (width, height, label) in new[] { (1100, 1500, "desktop"), (400, 8000, "phone") })
|
|
{
|
|
foreach (var code in codes)
|
|
{
|
|
Localizer.Instance.SetLanguage(Languages.Find(code) ?? Languages.Fallback);
|
|
Shoot(width, height, $"main-{label}-{code}", model => model.Replay(run));
|
|
if (label != "desktop")
|
|
{
|
|
Localizer.Instance.SetLanguage(Languages.Fallback);
|
|
Shoot(width, 860, $"start-{code}", model => model.SelectedLanguage = Languages.Find(code) ?? Languages.Fallback);
|
|
continue;
|
|
}
|
|
Shoot(width, 900, $"contacts-{code}", model => model.ShowContacts = true);
|
|
Shoot(width, 900, $"share-{code}", model =>
|
|
{
|
|
model.Replay(run);
|
|
model.OpenShareCommand.Execute(null);
|
|
});
|
|
}
|
|
}
|
|
AppSettings.Write(saved);
|
|
return 0;
|
|
}, CancellationToken.None);
|
|
Environment.Exit(0);
|
|
|
|
void Shoot(int width, int height, string name, Action<MainViewModel> prepare)
|
|
{
|
|
var model = App.Services.GetRequiredService<MainViewModel>();
|
|
var view = new MainView { DataContext = model };
|
|
var window = new Window { Width = width, Height = height, Content = view };
|
|
window.Show();
|
|
model.AvailableWidth = width;
|
|
prepare(model);
|
|
for (var i = 0; i < 6; i++) Dispatcher.UIThread.RunJobs();
|
|
var frame = window.CaptureRenderedFrame();
|
|
var path = Path.Combine(output, $"{name}.png");
|
|
if (frame is not null)
|
|
{
|
|
using var file = File.Create(path);
|
|
frame.Save(file, new PngBitmapEncoderOptions());
|
|
}
|
|
Console.WriteLine($"{path} {(frame is null ? "no frame" : "ok")}");
|
|
window.Close();
|
|
}
|
|
|
|
public static class ScreenshotEntry
|
|
{
|
|
public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure<MeWeb.App.App>()
|
|
.UseSkia()
|
|
.UseHarfBuzz()
|
|
.WithInterFont()
|
|
.UseHeadless(new AvaloniaHeadlessPlatformOptions { UseHeadlessDrawing = false });
|
|
}
|