diff --git a/CHANGELOG.md b/CHANGELOG.md index a8aa02d..bcf845d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ Improvements - Allow dropdowns to have scrolling panels - Improved Panel performance when adding and removing a lot of children - Don't reset the caret position of a text field when selecting or deselecting it +- Improved UiParser.ParseImage with locks and a callback action Fixes - Fixed panels updating their relevant children too much when the scroll bar is hidden diff --git a/MLEM.Ui/Parsers/UiParser.cs b/MLEM.Ui/Parsers/UiParser.cs index db4d76d..f6f8e78 100644 --- a/MLEM.Ui/Parsers/UiParser.cs +++ b/MLEM.Ui/Parsers/UiParser.cs @@ -10,6 +10,7 @@ using MLEM.Ui.Style; #if NETSTANDARD2_0_OR_GREATER || NET6_0_OR_GREATER using System.Net.Http; + #else using System.Net; #endif @@ -138,22 +139,32 @@ namespace MLEM.Ui.Parsers { /// This method invokes an asynchronouns action, meaning the 's will likely not have loaded in when this method returns. /// /// The absolute, relative or web path to the image. + /// An action that is invoked with the loaded image once it is fetched. Note that this action will be invoked asynchronously. /// The loaded image. /// Thrown if is null, or if there is an loading the image and is unset. - protected Image ParseImage(string path) { + protected Image ParseImage(string path, Action onImageFetched = null) { if (this.GraphicsDevice == null) throw new NullReferenceException("A UI parser requires a GraphicsDevice for parsing images"); + var imageLock = new object(); TextureRegion image = null; - return new Image(Anchor.AutoLeft, Vector2.One, _ => image) { + return new Image(Anchor.AutoLeft, Vector2.One, _ => { + lock (imageLock) + return image; + }) { SetHeightBasedOnAspect = true, OnAddedToUi = e => { - if (image == null) + bool imageNull; + lock (imageLock) + imageNull = image == null; + if (imageNull) LoadImageAsync(); }, OnRemovedFromUi = e => { - image?.Texture.Dispose(); - image = null; + lock (imageLock) { + image?.Texture.Dispose(); + image = null; + } } }; @@ -178,7 +189,12 @@ namespace MLEM.Ui.Parsers { using (var stream = Path.IsPathRooted(path) ? File.OpenRead(path) : TitleContainer.OpenStream(path)) tex = Texture2D.FromStream(this.GraphicsDevice, stream); } - image = new TextureRegion(tex); + lock (imageLock) { + if (image == null) { + image = new TextureRegion(tex); + onImageFetched?.Invoke(image); + } + } } catch (Exception e) { if (this.ImageExceptionHandler != null) { this.ImageExceptionHandler.Invoke(path, e);