TechbloxModdingAPI/GamecraftModdingAPI/Interface/IMGUI/Group.cs
2020-12-21 16:31:57 -05:00

157 lines
No EOL
5.1 KiB
C#

using System;
using GamecraftModdingAPI.Utility;
using Svelto.DataStructures;
using UnityEngine;
namespace GamecraftModdingAPI.Interface.IMGUI
{
/// <summary>
/// A group of elements.
/// This wraps Unity's GUILayout Area and GUI Group system.
/// </summary>
public class Group : UIElement
{
private bool automaticLayout;
private FasterList<UIElement> elements = new FasterList<UIElement>();
/// <summary>
/// The rectangular area in the window that the UI group can use
/// </summary>
public Rect Box { get; set; }
public void OnGUI()
{
/*if (Constants.Default == null) return;
if (Constants.Default.box == null) return;*/
GUIStyle guiStyle = Constants.Default.box;
UIElement[] elems = elements.ToArrayFast(out uint count);
if (automaticLayout)
{
GUILayout.BeginArea(Box, guiStyle);
for (uint i = 0; i < count; i++)
{
/*try
{
if (elems[i].Enabled)
elems[i].OnGUI();
}
catch (ArgumentException)
{
// ignore these, since this is (hopefully) just Unity being dumb
}
catch (Exception e)
{
Logging.MetaDebugLog($"Element '{elems[i].Name}' threw exception:\n{e.ToString()}");
}*/
if (elems[i].Enabled)
elems[i].OnGUI();
}
GUILayout.EndArea();
}
else
{
GUI.BeginGroup(Box, guiStyle);
for (uint i = 0; i < count; i++)
{
if (elems[i].Enabled)
elems[i].OnGUI();
}
GUI.EndGroup();
}
}
/// <summary>
/// The group's unique name.
/// </summary>
public string Name { get; }
/// <summary>
/// Whether to display the group and everything in it.
/// </summary>
public bool Enabled { set; get; } = true;
/// <summary>
/// The amount of elements in the group.
/// </summary>
public int Length
{
get => elements.count;
}
/// <summary>
/// Initializes a new instance of the <see cref="T:GamecraftModdingAPI.Interface.IMGUI.Group"/> class.
/// </summary>
/// <param name="box">The rectangular area to use in the window.</param>
/// <param name="name">Name of the group.</param>
/// <param name="automaticLayout">Whether to use automatic UI layout.</param>
public Group(Rect box, string name = null, bool automaticLayout = false)
{
Box = box;
if (name == null)
{
this.Name = typeof(Group).FullName + "::" + box.ToString().Replace(" ", "");
}
else
{
this.Name = name;
}
this.automaticLayout = automaticLayout;
IMGUIManager.AddElement(this);
}
/// <summary>
/// Add an element to the group.
/// </summary>
/// <param name="element">The element to add.</param>
/// <returns>Index of the new element.</returns>
public int AddElement(UIElement element)
{
IMGUIManager.RemoveElement(element); // groups manage internal elements themselves
elements.Add(element);
return elements.count - 1;
}
/// <summary>
/// Remove an element from the group.
/// </summary>
/// <param name="element">The element to remove.</param>
/// <returns>Whether removal was successful.</returns>
public bool RemoveElement(UIElement element)
{
int index = IndexOf(element);
return RemoveAt(index);
}
/// <summary>
/// Remove the element in a specific location.
/// </summary>
/// <param name="index">Index of the element.</param>
/// <returns>Whether removal was successful.</returns>
public bool RemoveAt(int index)
{
if (index < 0 || index >= elements.count) return false;
IMGUIManager.AddElement(elements[index]); // re-add to global manager
elements.RemoveAt(index);
return true;
}
/// <summary>
/// Get the index of an element.
/// </summary>
/// <param name="element">The element to search for.</param>
/// <returns>The element's index, or -1 if not found.</returns>
public int IndexOf(UIElement element)
{
UIElement[] elems = elements.ToArrayFast(out uint count);
for (int i = 0; i < count; i++)
{
if (elems[i].Name == element.Name)
{
return i;
}
}
return -1;
}
}
}