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