157 lines
5.1 KiB
C#
157 lines
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;
|
||
|
}
|
||
|
}
|
||
|
}
|