diff --git a/Demos/UiDemo.cs b/Demos/UiDemo.cs index b6de705..3a3fa11 100644 --- a/Demos/UiDemo.cs +++ b/Demos/UiDemo.cs @@ -160,11 +160,19 @@ namespace Demos { root.AddChild(ElementHelper.NumberField(Anchor.AutoLeft, new Vector2(1, 10))).PositionOffset = new Vector2(0, 1); root.AddChild(new Paragraph(Anchor.AutoLeft, 1, "There is an easy helper method to make any amount of same-sized columns:") {PositionOffset = new Vector2(0, 1)}); - var cols = ElementHelper.MakeColumns(root, new Vector2(1), 3); + var cols = ElementHelper.MakeColumns(root, Anchor.AutoLeft, new Vector2(1), 3); cols[0].AddChild(new Paragraph(Anchor.AutoLeft, 1, "This is the first column")); cols[1].AddChild(new Paragraph(Anchor.AutoLeft, 1, "This is the second column")); cols[2].AddChild(new Paragraph(Anchor.AutoLeft, 1, "This is the third column")); + root.AddChild(new Button(Anchor.AutoLeft, new Vector2(1, 10), "Show Info Box") { + OnClicked = (element, button) => { + if (button == MouseButton.Left) + ElementHelper.ShowInfoBox(this.UiSystem, Anchor.Center, 100, "This is an easy info box that you can open with just one line of code! It automatically closes when you press the button below as well."); + }, + PositionOffset = new Vector2(0, 1) + }); + // Below are some querying examples that help you find certain elements easily var children = root.GetChildren(); diff --git a/MLEM.Ui/Elements/Element.cs b/MLEM.Ui/Elements/Element.cs index 859ce6c..9f96c72 100644 --- a/MLEM.Ui/Elements/Element.cs +++ b/MLEM.Ui/Elements/Element.cs @@ -296,7 +296,7 @@ namespace MLEM.Ui.Elements { child.ForceUpdateArea(); if (this.SetHeightBasedOnChildren && this.Children.Count > 0) { - var lowest = this.GetLowestReachingChild(); + var lowest = this.GetLowestReachingChild(false, true); var newHeight = (lowest.area.Bottom - pos.Y + this.ScaledChildPadding.Y) / this.Scale; if (newHeight != this.size.Y) { this.size.Y = newHeight; @@ -316,12 +316,12 @@ namespace MLEM.Ui.Elements { return this.Area; } - public Element GetLowestReachingChild() { + public Element GetLowestReachingChild(bool hiddenAlso, bool unattachableAlso) { Element lowest = null; // the lowest child is expected to be towards the back, so search is usually faster if done backwards for (var i = this.Children.Count - 1; i >= 0; i--) { var child = this.Children[i]; - if (child.isHidden) + if (!hiddenAlso && child.IsHidden || !unattachableAlso && !child.CanAutoAnchorsAttach) continue; if (child.Anchor > Anchor.TopRight && child.Anchor < Anchor.AutoLeft) continue; @@ -337,9 +337,7 @@ namespace MLEM.Ui.Elements { Element lastChild = null; foreach (var child in this.Parent.Children) { - if (!hiddenAlso && child.IsHidden) - continue; - if (!unattachableAlso && !child.CanAutoAnchorsAttach) + if (!hiddenAlso && child.IsHidden || !unattachableAlso && !child.CanAutoAnchorsAttach) continue; if (child == this) break; diff --git a/MLEM.Ui/Elements/ElementHelper.cs b/MLEM.Ui/Elements/ElementHelper.cs index fe5ba96..7963e64 100644 --- a/MLEM.Ui/Elements/ElementHelper.cs +++ b/MLEM.Ui/Elements/ElementHelper.cs @@ -4,13 +4,29 @@ using MLEM.Input; namespace MLEM.Ui.Elements { public static class ElementHelper { - public static Group[] MakeColumns(Element parent, Vector2 totalSize, int amount, bool setHeightBasedOnChildren = true) { + public static Panel ShowInfoBox(UiSystem system, Anchor anchor, float width, string text, float buttonHeight = 10, string okText = "Okay") { + var box = new Panel(anchor, new Vector2(width, 1), Vector2.Zero, true); + box.AddChild(new Paragraph(Anchor.AutoLeft, 1, text)); + box.AddChild(new Button(Anchor.AutoCenter, new Vector2(0.5F, buttonHeight), okText) { + OnClicked = (element, button) => { + if (button == MouseButton.Left) + system.Remove("InfoBox"); + }, + PositionOffset = new Vector2(0, 1) + }); + system.Add("InfoBox", box); + return box; + } + + public static Group[] MakeColumns(Element parent, Anchor anchor, Vector2 totalSize, int amount, bool setHeightBasedOnChildren = true) { + var group = new Group(anchor, totalSize, setHeightBasedOnChildren); var cols = new Group[amount]; for (var i = 0; i < amount; i++) { cols[i] = new Group(Anchor.AutoInline, new Vector2(totalSize.X / amount, totalSize.Y), setHeightBasedOnChildren); - if (parent != null) - parent.AddChild(cols[i]); + group.AddChild(cols[i]); } + if (parent != null) + parent.AddChild(group); return cols; } diff --git a/MLEM.Ui/Elements/Panel.cs b/MLEM.Ui/Elements/Panel.cs index a687671..7349c34 100644 --- a/MLEM.Ui/Elements/Panel.cs +++ b/MLEM.Ui/Elements/Panel.cs @@ -65,7 +65,7 @@ namespace MLEM.Ui.Elements { return; // the "real" first child is the scroll bar, which we want to ignore var firstChild = this.Children[1]; - var lowestChild = this.GetLowestReachingChild(); + var lowestChild = this.GetLowestReachingChild(false, true); // the max value of the scrollbar is the amount of non-scaled pixels taken up by overflowing components var childrenHeight = lowestChild.Area.Bottom - firstChild.Area.Top; this.ScrollBar.MaxValue = (childrenHeight - this.Area.Height) / this.Scale + this.ChildPadding.Y * 2; diff --git a/MLEM.Ui/UiSystem.cs b/MLEM.Ui/UiSystem.cs index 7b68e67..c8da991 100644 --- a/MLEM.Ui/UiSystem.cs +++ b/MLEM.Ui/UiSystem.cs @@ -120,18 +120,18 @@ namespace MLEM.Ui { public RootElement Add(string name, Element element) { var root = new RootElement(name, element, this); - this.Add(root); - return root; + return !this.Add(root) ? null : root; } - internal void Add(RootElement root, int index = -1) { + internal bool Add(RootElement root, int index = -1) { if (this.IndexOf(root.Name) >= 0) - throw new ArgumentException($"There is already a root element with name {root.Name}"); + return false; if (index < 0 || index > this.rootElements.Count) index = this.rootElements.Count; this.rootElements.Insert(index, root); root.Element.PropagateRoot(root); root.Element.PropagateUiSystem(this); + return true; } public void Remove(string name) { @@ -153,8 +153,8 @@ namespace MLEM.Ui { } private Element GetMousedElement() { - foreach (var root in this.rootElements) { - var moused = root.Element.GetMousedElement(); + for (var i = this.rootElements.Count - 1; i >= 0; i--) { + var moused = this.rootElements[i].Element.GetMousedElement(); if (moused != null) return moused; }