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 run = await App.Services.GetRequiredService().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, 2600, "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") Shoot(width, 900, $"contacts-{code}", model => model.ShowContacts = true); } } return 0; }, CancellationToken.None); Environment.Exit(0); void Shoot(int width, int height, string name, Action prepare) { var model = App.Services.GetRequiredService(); 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() .UseSkia() .UseHarfBuzz() .WithInterFont() .UseHeadless(new AvaloniaHeadlessPlatformOptions { UseHeadlessDrawing = false }); }