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}"));
}
});
}
}
}