Improve UI elements (IMGUI)

This commit is contained in:
Norbi Peti 2022-02-23 02:25:34 +01:00
parent 7f63944a6e
commit 2db7b607f0
11 changed files with 37 additions and 132 deletions

View file

@ -24,7 +24,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// </summary>
public event EventHandler<bool> OnClick;
public void OnGUI()
public override void OnGUI()
{
if (automaticLayout)
{
@ -42,34 +42,15 @@ namespace TechbloxModdingAPI.Interface.IMGUI
}
}
/// <summary>
/// The button's unique name.
/// </summary>
public string Name { get; private set; }
/// <summary>
/// Whether to display the button.
/// </summary>
public bool Enabled { get; set; } = true;
/// <summary>
/// Initialize a new button with automatic layout.
/// </summary>
/// <param name="text">The text to display on the button.</param>
/// <param name="name">The button's name.</param>
public Button(string text, string name = null)
public Button(string text, string name = null) : base(text, name)
{
automaticLayout = true;
this.text = text;
if (name == null)
{
this.Name = typeof(Button).FullName + "::" + text;
}
else
{
this.Name = name;
}
IMGUIManager.AddElement(this);
}
/// <summary>
@ -83,10 +64,5 @@ namespace TechbloxModdingAPI.Interface.IMGUI
automaticLayout = false;
this.Box = box;
}
~Button()
{
IMGUIManager.RemoveElement(this);
}
}
}

View file

@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// </summary>
public Rect Box { get; set; }
public void OnGUI()
public override void OnGUI()
{
/*if (Constants.Default == null) return;
if (Constants.Default.box == null) return;*/
@ -60,16 +60,6 @@ namespace TechbloxModdingAPI.Interface.IMGUI
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.
@ -85,19 +75,10 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// <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)
public Group(Rect box, string name = null, bool automaticLayout = false) : base(box.ToString().Replace(" ", ""), name)
{
Box = box;
if (name == null)
{
this.Name = typeof(Group).FullName + "::" + box.ToString().Replace(" ", "");
}
else
{
this.Name = name;
}
this.automaticLayout = automaticLayout;
IMGUIManager.AddElement(this);
}
/// <summary>

View file

@ -2,6 +2,7 @@ using System.Collections.Generic;
using Svelto.Tasks;
using Svelto.Tasks.ExtraLean;
using TechbloxModdingAPI.Tasks;
using TechbloxModdingAPI.Utility;
using UnityEngine;
namespace TechbloxModdingAPI.Interface.IMGUI
@ -14,9 +15,9 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// </summary>
public static class IMGUIManager
{
internal static OnGuiRunner ImguiScheduler = new OnGuiRunner("TechbloxModdingAPI_IMGUIScheduler");
private static Dictionary<string, UIElement> _activeElements = new Dictionary<string,UIElement>();
internal static OnGuiRunner ImguiScheduler = new("TechbloxModdingAPI_IMGUIScheduler");
private static readonly WeakDictionary<string, UIElement> _activeElements = new();
/// <summary>
/// Add an UIElement instance to be managed by IMGUIManager.

View file

@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// </summary>
public Rect Box { get; set; } = Rect.zero;
public void OnGUI()
public override void OnGUI()
{
//if (Texture == null) return;
if (automaticLayout)
@ -32,43 +32,16 @@ namespace TechbloxModdingAPI.Interface.IMGUI
GUI.Label(Box, Texture, Constants.Default.label);
}
}
/// <summary>
/// The image element's unique name.
/// </summary>
public string Name { get; }
/// <summary>
/// Whether to display the image and everything in it.
/// </summary>
public bool Enabled { set; get; } = true;
/// <summary>
/// Initializes a new instance of the <see cref="T:TechbloxModdingAPI.Interface.IMGUI.Image"/> class with automatic layout.
/// </summary>
/// <param name="texture">Image to display.</param>
/// <param name="name">The element's name.</param>
public Image(Texture texture = null, string name = null)
public Image(Texture texture = null, string name = null) : base(texture == null ? "" : $"{texture.name}({texture.width}x{texture.height})", name)
{
automaticLayout = true;
Texture = texture;
if (name == null)
{
if (texture == null)
{
this.Name = typeof(Image).FullName + "::" + texture;
}
else
{
this.Name = typeof(Image).FullName + "::" + texture.name + "(" + texture.width + "x" + texture.height + ")";
}
}
else
{
this.Name = name;
}
IMGUIManager.AddElement(this);
}
/// <summary>

View file

@ -20,7 +20,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// </summary>
public Rect Box { get; set; } = Rect.zero;
public void OnGUI()
public override void OnGUI()
{
if (automaticLayout)
{
@ -32,34 +32,15 @@ namespace TechbloxModdingAPI.Interface.IMGUI
}
}
/// <summary>
/// The label's unique name.
/// </summary>
public string Name { get; }
/// <summary>
/// Whether to display the label.
/// </summary>
public bool Enabled { set; get; } = true;
/// <summary>
/// Initializes a new instance of the <see cref="T:TechbloxModdingAPI.Interface.IMGUI.Label"/> class with automatic layout.
/// </summary>
/// <param name="initialText">Initial string to display on the label.</param>
/// <param name="name">The element's name.</param>
public Label(string initialText = null, string name = null)
public Label(string initialText = null, string name = null) : base(initialText, name)
{
automaticLayout = true;
Text = initialText;
if (name == null)
{
this.Name = typeof(Label).FullName + "::" + initialText;
}
else
{
this.Name = name;
}
IMGUIManager.AddElement(this);
}
/// <summary>

View file

@ -28,7 +28,7 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// </summary>
public event EventHandler<string> OnEdit;
public void OnGUI()
public override void OnGUI()
{
string editedText = null;
if (automaticLayout)
@ -61,36 +61,17 @@ namespace TechbloxModdingAPI.Interface.IMGUI
}
}
/// <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)
public Text(string initialText = null, string name = null, bool multiline = false) : base(initialText, name)
{
this.Multiline = multiline;
automaticLayout = true;
text = initialText ?? "";
if (name == null)
{
this.Name = typeof(Text).FullName + "::" + text;
}
else
{
this.Name = name;
}
IMGUIManager.AddElement(this);
}
/// <summary>

View file

@ -6,23 +6,34 @@ namespace TechbloxModdingAPI.Interface.IMGUI
/// GUI Element like a text field, button or picture.
/// This interface is used to wrap many elements from Unity's IMGUI system.
/// </summary>
public interface UIElement
public abstract class UIElement
{
protected UIElement(string text, string name)
{
Name = name ?? GetType().FullName + "::" + text;
IMGUIManager.AddElement(this);
}
~UIElement()
{
IMGUIManager.RemoveElement(this);
}
/// <summary>
/// GUI operations to perform in the OnGUI scope.
/// This is basically equivalent to a MonoBehaviour's OnGUI method.
/// </summary>
void OnGUI();
public abstract void OnGUI();
/// <summary>
/// The element's name.
/// This should be unique for every instance of the class.
/// </summary>
string Name { get; }
public string Name { get; }
/// <summary>
/// Whether to display the UI element or not.
/// </summary>
bool Enabled { get; }
public bool Enabled { get; set; } = true;
}
}

View file

@ -195,8 +195,8 @@ namespace TechbloxModdingAPI
/// The player's mass.
/// </summary>
/// <value>The mass.</value>
public float Mass =>
1f / playerEngine.GetCharacterStruct<RigidBodyEntityStruct>(Id).Get().physicsMass.InverseMass;
[Obsolete] // We cannot get it clientside or something
public float Mass => 0;
/// <summary>
/// The player's latest network ping time.

View file

@ -139,7 +139,7 @@ namespace TechbloxModdingAPI.Players
group = default;
if (GameState.IsBuildMode())
return entitiesDB.QueryEntityOptional<T>(new EGID(playerId, LocalBuildingDrone.BuildGroup));
var characterGroups = CharacterExclusiveGroups.AllCharacters;
for (int i = 0; i < characterGroups.count; i++)
{

View file

@ -73,9 +73,10 @@ namespace TechbloxModdingAPI
}
}
[Obsolete] //Cannot get mass even from UECS
public float Mass
{
get => 0f; //TODO: Get mass from UECS entity
get => 0f;
//set => GetStruct().physicsMass.InverseMass = math.rcp(value);
}

View file

@ -261,7 +261,7 @@ namespace TechbloxModdingAPI.Tests
/*((FasterList<GuiInputMap.GuiInputMapElement>)AccessTools.Property(typeof(GuiInputMap), "GuiInputsButtonDown").GetValue(null))
.Add(new GuiInputMap.GuiInputMapElement(RewiredConsts.Action.ToggleCommandLine, GuiIn))*/
Game.Enter += (sender, e) =>
/*Game.Enter += (sender, e) =>
{
ushort lastKey = ushort.MaxValue;
foreach (var kv in FullGameFields._dataDb.GetValues<CubeListData>()
@ -299,7 +299,7 @@ namespace TechbloxModdingAPI.Tests
return result;
})
.Aggregate((a, b) => a + "\n" + b));
};
};*/
CommandBuilder.Builder("takeScreenshot", "Enables the screenshot taker")
.Action(() =>
@ -368,7 +368,7 @@ namespace TechbloxModdingAPI.Tests
}, () => shouldTestGhostBlock));
Logging.CommandLog("Test enabled");
}).Build();
Client.EnterMenu += (sender, args) => Scheduler.Schedule(new Once(() => Client.Instance.CloseBetaPopup()));
Game.Enter += (sender, args) =>