diff --git a/MLEM.Ui/Elements/Element.cs b/MLEM.Ui/Elements/Element.cs
index aabcb30..a48e0d9 100644
--- a/MLEM.Ui/Elements/Element.cs
+++ b/MLEM.Ui/Elements/Element.cs
@@ -31,7 +31,7 @@ namespace MLEM.Ui.Elements {
///
public UiSystem System {
get => this.system;
- internal set {
+ private set {
this.system = value;
this.Controls = value?.Controls;
this.Style = this.Style.OrStyle(value?.Style);
@@ -50,7 +50,7 @@ namespace MLEM.Ui.Elements {
/// This element's .
/// Note that this value is set even if this element has a . To get the element that represents the root element, use .
///
- public RootElement Root { get; internal set; }
+ public RootElement Root { get; private set; }
///
/// The scale that this ui element renders with
///
@@ -481,8 +481,8 @@ namespace MLEM.Ui.Elements {
this.size = size;
this.Children = new ReadOnlyCollection(this.children);
- this.GetTabNextElement += (backward, next) => next;
- this.GetGamepadNextElement += (dir, next) => next;
+ this.GetTabNextElement = (backward, next) => next;
+ this.GetGamepadNextElement = (dir, next) => next;
this.SetAreaDirty();
this.SetSortedChildrenDirty();
@@ -506,12 +506,7 @@ namespace MLEM.Ui.Elements {
index = this.children.Count;
this.children.Insert(index, element);
element.Parent = this;
- element.AndChildren(e => {
- e.Root = this.Root;
- e.System = this.System;
- e.OnAddedToUi?.Invoke(e);
- this.Root?.InvokeOnElementAdded(e);
- });
+ element.AndChildren(e => e.AddedToUi(this.System, this.Root));
this.OnChildAdded?.Invoke(this, element);
this.SetSortedChildrenDirty();
element.SetAreaDirty();
@@ -530,12 +525,7 @@ namespace MLEM.Ui.Elements {
// upwards to us if the element is auto-positioned
element.SetAreaDirty();
element.Parent = null;
- element.AndChildren(e => {
- e.Root = null;
- e.System = null;
- e.OnRemovedFromUi?.Invoke(e);
- this.Root?.InvokeOnElementRemoved(e);
- });
+ element.AndChildren(e => e.RemovedFromUi());
this.OnChildRemoved?.Invoke(this, element);
this.SetSortedChildrenDirty();
}
@@ -1190,6 +1180,31 @@ namespace MLEM.Ui.Elements {
return this.TransformInverse(position);
}
+ ///
+ /// Called when this element is added to a and, optionally, a given .
+ /// This method is called in and .
+ ///
+ /// The ui system to add to.
+ /// The root element to add to.
+ protected internal virtual void AddedToUi(UiSystem system, RootElement root) {
+ this.Root = root;
+ this.System = system;
+ this.OnAddedToUi?.Invoke(this);
+ root?.InvokeOnElementAdded(this);
+ }
+
+ ///
+ /// Called when this element is removed from a and .
+ /// This method is called in and .
+ ///
+ protected internal virtual void RemovedFromUi() {
+ var root = this.Root;
+ this.Root = null;
+ this.System = null;
+ this.OnRemovedFromUi?.Invoke(this);
+ root?.InvokeOnElementRemoved(this);
+ }
+
///
/// A delegate used for the event.
///
diff --git a/MLEM.Ui/Elements/Panel.cs b/MLEM.Ui/Elements/Panel.cs
index 5f050e7..8605249 100644
--- a/MLEM.Ui/Elements/Panel.cs
+++ b/MLEM.Ui/Elements/Panel.cs
@@ -70,13 +70,6 @@ namespace MLEM.Ui.Elements {
this.scrollOverflow = scrollOverflow;
this.CanBeSelected = false;
- // we dispose our render target when removing so that it doesn't cause a memory leak
- // if we're added back afterwards, it'll be recreated in ScrollSetup anyway
- this.OnRemovedFromUi += _ => {
- this.renderTarget?.Dispose();
- this.renderTarget = null;
- };
-
if (scrollOverflow) {
this.ScrollBar = new ScrollBar(Anchor.TopRight, Vector2.Zero, 0, 0) {
OnValueChanged = (element, value) => this.ScrollChildren(),
@@ -234,6 +227,15 @@ namespace MLEM.Ui.Elements {
this.ScrollChildren();
}
+ ///
+ protected internal override void RemovedFromUi() {
+ base.RemovedFromUi();
+ // we dispose our render target when removing so that it doesn't cause a memory leak
+ // if we're added back afterwards, it'll be recreated in ScrollSetup anyway
+ this.renderTarget?.Dispose();
+ this.renderTarget = null;
+ }
+
///
/// Prepares the panel for auto-scrolling, creating the render target and setting up the scroll bar's maximum value.
///
diff --git a/MLEM.Ui/UiSystem.cs b/MLEM.Ui/UiSystem.cs
index 1e4587b..1f0454e 100644
--- a/MLEM.Ui/UiSystem.cs
+++ b/MLEM.Ui/UiSystem.cs
@@ -345,10 +345,7 @@ namespace MLEM.Ui {
var root = new RootElement(name, element, this);
this.rootElements.Add(root);
root.Element.AndChildren(e => {
- e.Root = root;
- e.System = this;
- e.OnAddedToUi?.Invoke(e);
- root.InvokeOnElementAdded(e);
+ e.AddedToUi(this, root);
e.SetAreaDirty();
});
this.OnRootAdded?.Invoke(root);
@@ -368,10 +365,7 @@ namespace MLEM.Ui {
this.rootElements.Remove(root);
this.Controls.SelectElement(root, null);
root.Element.AndChildren(e => {
- e.Root = null;
- e.System = null;
- e.OnRemovedFromUi?.Invoke(e);
- root.InvokeOnElementRemoved(e);
+ e.RemovedFromUi();
e.SetAreaDirty();
});
this.OnRootRemoved?.Invoke(root);