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

109 lines
3.4 KiB
C#

using System;
using UnityEngine;
namespace GamecraftModdingAPI.Interface.IMGUI
{
/// <summary>
/// A text input field.
/// This wraps Unity's IMGUI TextField and TextArea.
/// </summary>
public class Text : UIElement
{
private bool automaticLayout;
/// <summary>
/// Whether the text input field is multiline (true -> TextArea) or not (false -> TextField).
/// </summary>
public bool Multiline { get; set; }
private string text;
/// <summary>
/// The rectangular area that the text field can use.
/// </summary>
public Rect Box { get; set; } = Rect.zero;
/// <summary>
/// An event that fires whenever the text input is edited.
/// </summary>
public event EventHandler<string> OnEdit;
public void OnGUI()
{
string editedText = null;
if (automaticLayout)
{
if (Multiline)
{
editedText = GUILayout.TextArea(text, Constants.Default.textArea);
}
else
{
editedText = GUILayout.TextField(text, Constants.Default.textField);
}
}
else
{
if (Multiline)
{
editedText = GUI.TextArea(Box, text, Constants.Default.textArea);
}
else
{
editedText = GUI.TextField(Box, text, Constants.Default.textField);
}
}
if (editedText != null && editedText != text)
{
OnEdit?.Invoke(this, editedText);
text = editedText;
}
}
/// <summary>
/// The text field's unique name.
/// </summary>
public string Name { get; }
/// <summary>
/// Whether to display the text field.
/// </summary>
public bool Enabled { set; get; } = true;
/// <summary>
/// Initialize the text input field with automatic layout.
/// </summary>
/// <param name="initialText">Initial text in the input field.</param>
/// <param name="name">The text field's name.</param>
/// <param name="multiline">Allow multiple lines?</param>
public Text(string initialText = null, string name = null, bool multiline = false)
{
this.Multiline = multiline;
automaticLayout = true;
text = initialText ?? "";
if (name == null)
{
this.Name = typeof(Text).FullName + "::" + text;
}
else
{
this.Name = name;
}
IMGUIManager.AddElement(this);
}
/// <summary>
/// Initialize the text input field.
/// </summary>
/// <param name="box">Rectangular area for the text field.</param>
/// <param name="initialText">Initial text in the input field.</param>
/// <param name="name">The text field's name.</param>
/// <param name="multiline">Allow multiple lines?</param>
public Text(Rect box, string initialText = null, string name = null, bool multiline = false) : this(initialText, name, multiline)
{
this.Box = box;
automaticLayout = false;
}
}
}