using System.Runtime.InteropServices.WindowsRuntime; using Microsoft.UI.Xaml.Media; using Microsoft.UI.Xaml.Media.Imaging; using XFEEDToolBox.Core.Rendering; using XFEEDToolBox.Rendering; namespace XFEEDToolBox.Controls; public sealed class ModuleIcon:UserControl { public static readonly DependencyProperty ItemProperty=DependencyProperty.Register(nameof(Item),typeof(string),typeof(ModuleIcon),new PropertyMetadata("",Changed)); public string Item{get=>(string)GetValue(ItemProperty);set=>SetValue(ItemProperty,value);} public string ResourceHash{get;private set;}=""; public string Failure{get;private set;}=""; public bool IsRealGameIcon=>ResourceHash.Length==40&&image.Source is not null; private readonly Image image=new(){Stretch=Stretch.Uniform}; private int version; public ModuleIcon(){Content=image;IsHitTestVisible=false;Loaded+=(_,_)=>Update();Unloaded+=(_,_)=>version++;} private static void Changed(DependencyObject sender,DependencyPropertyChangedEventArgs args)=>((ModuleIcon)sender).Update(); private async void Update() { var request=++version;image.Source=null;ResourceHash=Failure=""; var name=EliteModuleIcons.IconName(Item); if(!IsLoaded||name.Length==0)return; try { var pixels=await LocalShipModels.LoadIconAsync(name); if(request!=version||!IsLoaded)return; var bitmap=new WriteableBitmap(pixels.Width,pixels.Height); using(var stream=bitmap.PixelBuffer.AsStream()) { var bgra=new byte[pixels.Rgba.Length]; for(var i=0;i