using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Threading; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using OwlCore.Provisos; using StrixMusic.Sdk.WinUI.Services.ShellManagement; using Windows.Storage; namespace StrixMusic.Shared.ViewModels { /// /// A view model containing metadata about a shell that the user can switch to. /// public class ShellInfoViewModel : ObservableObject, IAsyncInit { /// /// Initializes a new instance of the class. /// /// The shell metadata to wrap around. public ShellInfoViewModel(ShellMetadata metadata) { Metadata = metadata; IsFullyResponsive = metadata.MaxWindowSize.Height == double.PositiveInfinity && metadata.MaxWindowSize.Width == double.PositiveInfinity && metadata.MinWindowSize.Height == 0 && metadata.MinWindowSize.Width == 0; ShellPreviews = new ObservableCollection(); } /// public ShellMetadata Metadata { get; } /// /// s pointing to preview images for this shell. Ordered Alphanumerically based on file name. /// public ObservableCollection ShellPreviews { get; set; } /// /// If true, this shell is capable of supporting all screen sizes. /// public bool IsFullyResponsive { get; } /// public string DisplayName => Metadata.DisplayName; /// public string Description => Metadata.Description; /// public bool IsInitialized { get; private set; } /// public Task InitAsync(CancellationToken cancellationToken = default) { return SetupImages(cancellationToken); } private async Task SetupImages(CancellationToken cancellationToken) { var foundFiles = new List(); // Brute find each image. We can't enumerate bundled content. A little hacky but it does the job. var index = 0; while (true) { try { cancellationToken.ThrowIfCancellationRequested(); var fileName = $"{++index}.png"; var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/ShellPreviews/{Metadata.Id}/{fileName}")); foundFiles.Add(file); } catch { break; } } await OwlCore.Threading.OnPrimaryThread(() => { foreach (var file in foundFiles) { ShellPreviews.Add(new Uri($"ms-appx:///Assets/ShellPreviews/{Metadata.Id}/{file.Name}")); } }); } } }