using Avalonia.Media; using Avalonia.Media.Imaging; using Avalonia.Threading; using CommunityToolkit.Mvvm.ComponentModel; using GSS2.Core.Analysis.AmineContent.Database.Calibration; namespace GSS2.UI.Core.ViewModels; public partial class AsyncImageRecordViewModel : ViewModelBase { private static readonly SemaphoreSlim _semaphore = new(1, 1); private readonly string _path; [ObservableProperty] public partial ImageRecord ImageRecord { get; set; } [ObservableProperty] public partial IImage? Image { get; set; } [ObservableProperty] public partial bool IsLoading { get; set; } = true; public AsyncImageRecordViewModel(string path, ImageRecord imageRecord) { _path = path; ImageRecord = imageRecord; _ = LoadAsync(); } private async Task LoadAsync() { await _semaphore.WaitAsync(); try { var bitmap = await Task.Run(() => new Bitmap(_path)); await Dispatcher.UIThread.InvokeAsync(() => { Image = bitmap; IsLoading = false; }); } catch { await Dispatcher.UIThread.InvokeAsync(() => IsLoading = false); } finally { _semaphore.Release(); } } }