diff --git a/Marechai.App/Presentation/ViewModels/SoftwareViewViewModel.cs b/Marechai.App/Presentation/ViewModels/SoftwareViewViewModel.cs index f5697f1c..a9d9bcc8 100644 --- a/Marechai.App/Presentation/ViewModels/SoftwareViewViewModel.cs +++ b/Marechai.App/Presentation/ViewModels/SoftwareViewViewModel.cs @@ -20,6 +20,7 @@ using Marechai.App.Services.Caching; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Media; using Windows.System; namespace Marechai.App.Presentation.ViewModels; @@ -219,13 +220,22 @@ public partial class SoftwareViewViewModel : ObservableObject, IRegionAware [ObservableProperty] private Visibility _showDescription = Visibility.Collapsed; + [ObservableProperty] + private ImageSource? _heroImageSource; + public bool HasDescription => !string.IsNullOrWhiteSpace(DescriptionHtml); + public bool HasHeroImage => HeroImageSource is not null; partial void OnDescriptionHtmlChanged(string value) { OnPropertyChanged(nameof(HasDescription)); } + partial void OnHeroImageSourceChanged(ImageSource? value) + { + OnPropertyChanged(nameof(HasHeroImage)); + } + public SoftwareViewViewModel(ILogger logger, IRegionManager regionManager, SoftwareBrowsingService browsingService, AuthService authService, ITokenService tokenService, IJwtService jwtService, @@ -451,6 +461,7 @@ public partial class SoftwareViewViewModel : ObservableObject, IRegionAware IsDataLoaded = false; HasError = false; ErrorMessage = string.Empty; + HeroImageSource = null; Companies.Clear(); Versions.Clear(); CreditGroups.Clear(); @@ -765,6 +776,14 @@ public partial class SoftwareViewViewModel : ObservableObject, IRegionAware if(covers.Count == 0) return; + List frontCovers = covers.Where(cover => cover.Id.HasValue && cover.Type == 0).ToList(); + + if(frontCovers.Count > 0) + { + SoftwareCoverDto heroCover = frontCovers[Random.Shared.Next(frontCovers.Count)]; + _ = LoadHeroCoverAsync(heroCover.Id!.Value); + } + var byGroup = new Dictionary>(); foreach(SoftwareCoverDto cover in covers) @@ -804,6 +823,19 @@ public partial class SoftwareViewViewModel : ObservableObject, IRegionAware } } + private async Task LoadHeroCoverAsync(Guid coverId) + { + try + { + Stream stream = await _coverCache.GetCoverAsync(coverId); + HeroImageSource = await _imageSourceFactory.CreateBitmapImageSourceAsync(stream); + } + catch(Exception ex) + { + _logger.LogError(ex, "Error loading hero cover {Id}", coverId); + } + } + private async Task LoadCoverThumbnailAsync(CoverDisplayItem item) { try diff --git a/Marechai.App/Presentation/Views/SoftwareViewPage.xaml b/Marechai.App/Presentation/Views/SoftwareViewPage.xaml index cedd681e..23706119 100644 --- a/Marechai.App/Presentation/Views/SoftwareViewPage.xaml +++ b/Marechai.App/Presentation/Views/SoftwareViewPage.xaml @@ -101,7 +101,9 @@ Spacing="16"> + HeroSubtitle="{Binding Family}" + HeroImageSource="{Binding HeroImageSource}" + ShowImage="{Binding HasHeroImage}" />