Internal class representing ImGui text input state. Stores text buffer, cursor/selection positions, undo/redo stacks, flags and helpers to clamp/select/undo behaviors for a single input widget.
// Vendored from zeljkovranjes/sbox-imgui; see LICENSE and PROVENANCE.md in this folder.
using Sandbox;
#pragma warning disable CS0649 // Upstream reserves fields for optional widgets and features.
namespace SboxSuperuser.Engine.Vendor.ImGui;
/// <summary>Internal state of the currently active (or last active) text input.</summary>
internal class ImGuiInputTextState
{
public int ID;
public string Text = string.Empty;
public string InitialText = string.Empty;
public int Cursor;
public int SelectStart;
public float ScrollX;
public float CursorAnim;
public bool CursorFollow;
public bool SelectedAllMouseLock;
public bool Edited;
public ImGuiInputTextFlags Flags;
public int MaxLength;
public readonly List<(string Text, int Cursor, int Select)> UndoStack = new();
public readonly List<(string Text, int Cursor, int Select)> RedoStack = new();
public bool HasSelection => SelectStart != Cursor;
public int SelMin => Math.Min( SelectStart, Cursor );
public int SelMax => Math.Max( SelectStart, Cursor );
public void ClampPositions()
{
Cursor = Math.Clamp( Cursor, 0, Text.Length );
SelectStart = Math.Clamp( SelectStart, 0, Text.Length );
}
public void ClearSelection() => SelectStart = Cursor;
public void SelectAll()
{
SelectStart = 0;
Cursor = Text.Length;
}
public void PushUndo()
{
UndoStack.Add( (Text, Cursor, SelectStart) );
if ( UndoStack.Count > 100 )
UndoStack.RemoveAt( 0 );
RedoStack.Clear();
}
}