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