diff --git a/src/UI/CSConsole/CSConsole.cs b/src/UI/CSConsole/CSConsole.cs
index c290282..b17473f 100644
--- a/src/UI/CSConsole/CSConsole.cs
+++ b/src/UI/CSConsole/CSConsole.cs
@@ -1,9 +1,11 @@
using System;
+using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEngine;
+using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityExplorer.Core.CSharp;
using UnityExplorer.Core.Input;
@@ -72,20 +74,20 @@ The following helper methods are available:
{
try
{
- Lexer = new LexerBuilder();
-
ResetConsole(false);
Evaluator.Compile("0 == 0");
-
- Panel.OnInputChanged += OnConsoleInputChanged;
- Panel.InputScroll.OnScroll += ForceOnContentChange;
- // TODO other panel listeners (buttons, etc)
-
}
- catch (Exception ex)
+ catch
{
- ExplorerCore.LogWarning(ex);
+ ExplorerCore.LogWarning("C# Console probably not supported, todo");
+ return;
}
+
+ Lexer = new LexerBuilder();
+
+ Panel.OnInputChanged += OnConsoleInputChanged;
+ Panel.InputScroll.OnScroll += ForceOnContentChange;
+ // TODO other panel listeners (buttons, etc)
}
// Updating and event listeners
@@ -98,6 +100,8 @@ The following helper methods are available:
public static void Update()
{
+ UpdateCaret();
+
if (EnableCtrlRShortcut)
{
if ((InputManager.GetKey(KeyCode.LeftControl) || InputManager.GetKey(KeyCode.RightControl))
@@ -131,80 +135,21 @@ The following helper methods are available:
private static void OnConsoleInputChanged(string value)
{
// todo auto indent? or only on enter?
+ // todo update auto completes
+
// syntax highlight
- LexerHighlightAndSet(value);
-
-
- // todo update auto completes
- // ...
+ HighlightVisibleInput(value);
}
- private static void LexerHighlightAndSet(string value)
+ private static void UpdateCaret()
{
- int startLine = 0;
- int endLine = Input.TextGenerator.lineCount - 1;
+ LastCaretPosition = Input.InputField.caretPosition;
- if (Input.Rect.rect.height > Panel.InputScroll.ViewportRect.rect.height)
- {
- // Not all text is displayed.
- // Only syntax highlight what we need to.
-
- int topLine = -1;
- int bottomLine = -1;
- var half = Input.Rect.rect.height * 0.5f;
-
- var top = Input.Rect.rect.height - Input.Rect.anchoredPosition.y;
- var bottom = top - Panel.InputScroll.ViewportRect.rect.height;
-
- for (int i = 0; i < Input.TextGenerator.lineCount; i++)
- {
- var line = Input.TextGenerator.lines[i];
- var pos = line.topY + half;
-
- if (topLine == -1 && pos <= top)
- topLine = i;
-
- if ((pos - line.height) >= bottom)
- bottomLine = i;
- }
-
- startLine = Math.Max(0, topLine - 1);
- endLine = Math.Min(Input.TextGenerator.lineCount - 1, bottomLine + 1);
- }
-
- int startIdx = Input.TextGenerator.lines[startLine].startCharIdx;
- int endIdx;
- if (endLine >= Input.TextGenerator.lineCount - 1)
- endIdx = value.Length - 1;
- else
- endIdx = Math.Min(value.Length - 1, Input.TextGenerator.lines[endLine + 1].startCharIdx);
-
- var sb = new StringBuilder();
- for (int i = 0; i < startLine; i++)
- sb.Append('\n');
- for (int i = startIdx; i <= endIdx; i++)
- sb.Append(value[i]);
-
- Panel.HighlightText.text = Lexer.SyntaxHighlight(sb.ToString());
+ // todo check if out of bounds
}
- // TODO indenting
-
- //private static void DoAutoIndent()
- //{
- // int caret = Panel.LastCaretPosition;
- // Panel.InputField.Text = Lexer.AutoIndentOnEnter(InputField.text, ref caret);
- // InputField.caretPosition = caret;
- //
- // Panel.InputText.Rebuild(CanvasUpdate.Prelayout);
- // InputField.ForceLabelUpdate();
- // InputField.Rebuild(CanvasUpdate.Prelayout);
- //
- // OnConsoleInputChanged(InputField.text);
- //}
-
#region Evaluating console input
public static void ResetConsole(bool logSuccess = true)
@@ -267,5 +212,278 @@ The following helper methods are available:
#endregion
+
+ #region Lexer Highlighting
+
+ private static void HighlightVisibleInput(string value)
+ {
+ int startLine = 0;
+ int endLine = Input.TextGenerator.lineCount - 1;
+
+ // Calculate visible text if necessary
+ if (Input.Rect.rect.height > Panel.InputScroll.ViewportRect.rect.height)
+ {
+ // This was mostly done through trial and error, it probably depends on the anchoring.
+ int topLine = -1;
+ int bottomLine = -1;
+ var heightCorrection = Input.Rect.rect.height * 0.5f;
+
+ var viewportMin = Input.Rect.rect.height - Input.Rect.anchoredPosition.y;
+ var viewportMax = viewportMin - Panel.InputScroll.ViewportRect.rect.height;
+
+ for (int i = 0; i < Input.TextGenerator.lineCount; i++)
+ {
+ var line = Input.TextGenerator.lines[i];
+ var pos = line.topY + heightCorrection;
+
+ // if top of line is below the viewport top
+ if (topLine == -1 && pos <= viewportMin)
+ topLine = i;
+
+ // if bottom of line is below the viewport bottom
+ if ((pos - line.height) >= viewportMax)
+ bottomLine = i;
+ }
+
+ startLine = Math.Max(0, topLine - 1);
+ endLine = Math.Min(Input.TextGenerator.lineCount - 1, bottomLine + 1);
+ }
+
+ int startIdx = Input.TextGenerator.lines[startLine].startCharIdx;
+ int endIdx;
+ if (endLine >= Input.TextGenerator.lineCount - 1)
+ endIdx = value.Length - 1;
+ else
+ endIdx = Math.Min(value.Length - 1, Input.TextGenerator.lines[endLine + 1].startCharIdx);
+
+
+ // Highlight the visible text with the LexerBuilder
+ Panel.HighlightText.text = Lexer.BuildHighlightedString(value, startIdx, endIdx, startLine);
+ }
+
+ #endregion
+
+
+ #region Autocompletes
+
+ public static void UseSuggestion(string suggestion)
+ {
+ string input = Input.Text;
+ input = input.Insert(LastCaretPosition, suggestion);
+ Input.Text = input;
+
+ RuntimeProvider.Instance.StartCoroutine(SetAutocompleteCaret(LastCaretPosition += suggestion.Length));
+ }
+
+ public static int LastCaretPosition { get; private set; }
+ internal static float defaultInputFieldAlpha;
+
+ private static IEnumerator SetAutocompleteCaret(int caretPosition)
+ {
+ var color = Input.InputField.selectionColor;
+ color.a = 0f;
+ Input.InputField.selectionColor = color;
+ yield return null;
+
+ EventSystem.current.SetSelectedGameObject(Panel.Input.UIRoot, null);
+ yield return null;
+
+ Input.InputField.caretPosition = caretPosition;
+ Input.InputField.selectionFocusPosition = caretPosition;
+ color.a = defaultInputFieldAlpha;
+ Input.InputField.selectionColor = color;
+ }
+
+ #endregion
+
+
+ // TODO indenting
+ #region AUTO INDENT TODO
+
+ //private static void DoAutoIndent()
+ //{
+ // int caret = Panel.LastCaretPosition;
+ // Panel.InputField.Text = Lexer.AutoIndentOnEnter(InputField.text, ref caret);
+ // InputField.caretPosition = caret;
+ //
+ // Panel.InputText.Rebuild(CanvasUpdate.Prelayout);
+ // InputField.ForceLabelUpdate();
+ // InputField.Rebuild(CanvasUpdate.Prelayout);
+ //
+ // OnConsoleInputChanged(InputField.text);
+ //}
+
+
+ // Auto-indenting
+
+ //public int GetIndentLevel(string input, int toIndex)
+ //{
+ // bool stringState = false;
+ // int indent = 0;
+ //
+ // for (int i = 0; i < toIndex && i < input.Length; i++)
+ // {
+ // char character = input[i];
+ //
+ // if (character == '"')
+ // stringState = !stringState;
+ // else if (!stringState && character == INDENT_OPEN)
+ // indent++;
+ // else if (!stringState && character == INDENT_CLOSE)
+ // indent--;
+ // }
+ //
+ // if (indent < 0)
+ // indent = 0;
+ //
+ // return indent;
+ //}
+
+ //// TODO not quite correct, but almost there.
+ //
+ //public string AutoIndentOnEnter(string input, ref int caretPos)
+ //{
+ // var sb = new StringBuilder(input);
+ //
+ // bool inString = false;
+ // bool inChar = false;
+ // int currentIndent = 0;
+ // int curLineIndent = 0;
+ // bool prevWasNewLine = true;
+ //
+ // // process before caret position
+ // for (int i = 0; i < caretPos; i++)
+ // {
+ // char c = sb[i];
+ //
+ // ExplorerCore.Log(i + ": " + c);
+ //
+ // // update string/char state
+ // if (!inChar && c == '\"')
+ // inString = !inString;
+ // else if (!inString && c == '\'')
+ // inChar = !inChar;
+ //
+ // // continue if inside string or char
+ // if (inString || inChar)
+ // continue;
+ //
+ // // check for new line
+ // if (c == '\n')
+ // {
+ // ExplorerCore.Log("new line, resetting line counts");
+ // curLineIndent = 0;
+ // prevWasNewLine = true;
+ // }
+ // // check for indent
+ // else if (c == '\t' && prevWasNewLine)
+ // {
+ // ExplorerCore.Log("its a tab");
+ // if (curLineIndent > currentIndent)
+ // {
+ // ExplorerCore.Log("too many tabs, removing");
+ // // already reached the indent we should have
+ // sb.Remove(i, 1);
+ // i--;
+ // caretPos--;
+ // curLineIndent--;
+ // }
+ // else
+ // curLineIndent++;
+ // }
+ // // remove spaces on new lines
+ // else if (c == ' ' && prevWasNewLine)
+ // {
+ // ExplorerCore.Log("removing newline-space");
+ // sb.Remove(i, 1);
+ // i--;
+ // caretPos--;
+ // }
+ // else
+ // {
+ // if (c == INDENT_CLOSE)
+ // currentIndent--;
+ //
+ // if (prevWasNewLine && curLineIndent < currentIndent)
+ // {
+ // ExplorerCore.Log("line is not indented enough");
+ // // line is not indented enough
+ // int diff = currentIndent - curLineIndent;
+ // sb.Insert(i, new string('\t', diff));
+ // caretPos += diff;
+ // i += diff;
+ // }
+ //
+ // // check for brackets
+ // if ((c == INDENT_CLOSE || c == INDENT_OPEN) && !prevWasNewLine)
+ // {
+ // ExplorerCore.Log("bracket needs new line");
+ //
+ // // need to put it on a new line
+ // sb.Insert(i, $"\n{new string('\t', currentIndent)}");
+ // caretPos += 1 + currentIndent;
+ // i += 1 + currentIndent;
+ // }
+ //
+ // if (c == INDENT_OPEN)
+ // currentIndent++;
+ //
+ // prevWasNewLine = false;
+ // }
+ // }
+ //
+ // // todo put caret on new line after previous bracket if needed
+ // // indent caret to current indent
+ //
+ // // process after caret position, make sure there are equal opened/closed brackets
+ // ExplorerCore.Log("-- after caret --");
+ // for (int i = caretPos; i < sb.Length; i++)
+ // {
+ // char c = sb[i];
+ // ExplorerCore.Log(i + ": " + c);
+ //
+ // // update string/char state
+ // if (!inChar && c == '\"')
+ // inString = !inString;
+ // else if (!inString && c == '\'')
+ // inChar = !inChar;
+ //
+ // if (inString || inChar)
+ // continue;
+ //
+ // if (c == INDENT_OPEN)
+ // currentIndent++;
+ // else if (c == INDENT_CLOSE)
+ // currentIndent--;
+ // }
+ //
+ // if (currentIndent > 0)
+ // {
+ // ExplorerCore.Log("there are not enough closing brackets, curIndent is " + currentIndent);
+ // // There are not enough close brackets
+ //
+ // // TODO this should append in reverse indent order (small indents inserted first, then biggest).
+ // while (currentIndent > 0)
+ // {
+ // ExplorerCore.Log("Inserting closing bracket with " + currentIndent + " indent");
+ // // append the indented '}' on a new line
+ // sb.Insert(caretPos, $"\n{new string('\t', currentIndent - 1)}}}");
+ //
+ // currentIndent--;
+ // }
+ //
+ // }
+ // //else if (currentIndent < 0)
+ // //{
+ // // // There are too many close brackets
+ // //
+ // // // todo?
+ // //}
+ //
+ // return sb.ToString();
+ //}
+
+ #endregion
+
}
}
diff --git a/src/UI/CSConsole/LexerBuilder.cs b/src/UI/CSConsole/LexerBuilder.cs
index 484db3a..376cbae 100644
--- a/src/UI/CSConsole/LexerBuilder.cs
+++ b/src/UI/CSConsole/LexerBuilder.cs
@@ -17,7 +17,7 @@ namespace UnityExplorer.UI.CSharpConsole
public class LexerBuilder
{
- // Initialization and core
+ #region Core and initialization
public const char WHITESPACE = ' ';
public const char INDENT_OPEN = '{';
@@ -47,35 +47,45 @@ namespace UnityExplorer.UI.CSharpConsole
}
}
- public bool IsDelimiter(char character, bool orWhitespace = false, bool orLetterOrDigit = false)
- {
- return delimiters.Contains(character)
- || (orWhitespace && char.IsWhiteSpace(character))
- || (orLetterOrDigit && char.IsLetterOrDigit(character));
- }
-
- // Lexer enumeration
-
- public string InputString { get; private set; }
- public int Length => InputString.Length;
+ #endregion
public int LastCommittedIndex { get; private set; }
public int LookaheadIndex { get; private set; }
- public char Current => !EndOfInput ? InputString[LookaheadIndex] : WHITESPACE;
- public char Previous => LookaheadIndex >= 1 ? InputString[LookaheadIndex - 1] : WHITESPACE;
+ public char Current => !EndOfInput ? currentInput[LookaheadIndex] : WHITESPACE;
+ public char Previous => LookaheadIndex >= 1 ? currentInput[LookaheadIndex - 1] : WHITESPACE;
- public bool EndOfInput => LookaheadIndex >= Length;
+ public bool EndOfInput => LookaheadIndex > currentEndIdx;
public bool EndOrNewLine => EndOfInput || Current == '\n' || Current == '\r';
- public string SyntaxHighlight(string input)
+ private string currentInput;
+ private int currentStartIdx;
+ private int currentEndIdx;
+
+ ///
+ /// Parse the range of the string with the Lexer and build a RichText-highlighted representation of it.
+ ///
+ /// The entire input string which you want to parse a section (or all) of
+ /// The first character you want to highlight
+ /// The last character you want to highlight
+ /// The amount of leading empty lines you want before the first character in the return string.
+ /// A string which contains the amount of leading lines specified, as well as the rich-text highlighted section.
+ public string BuildHighlightedString(string input, int startIdx, int endIdx, int leadingLines)
{
+ if (string.IsNullOrEmpty(input) || endIdx <= startIdx)
+ return input;
+
+ currentInput = input;
+ currentStartIdx = startIdx;
+ currentEndIdx = endIdx;
+
var sb = new StringBuilder();
- int lastUnhighlighted = 0;
- // TODO auto indent as part of this parse
+ for (int i = 0; i < leadingLines; i++)
+ sb.Append('\n');
- foreach (var match in GetMatches(input))
+ int lastUnhighlighted = startIdx;
+ foreach (var match in GetMatches())
{
// append non-highlighted text between last match and this
for (int i = lastUnhighlighted; i < match.startIndex; i++)
@@ -84,7 +94,7 @@ namespace UnityExplorer.UI.CSharpConsole
// append the highlighted match
sb.Append(match.htmlColorTag);
- for (int i = match.startIndex; i <= match.endIndex && i < input.Length; i++)
+ for (int i = match.startIndex; i <= match.endIndex && i <= currentEndIdx; i++)
sb.Append(input[i]);
sb.Append(SignatureHighlighter.CLOSE_COLOR);
@@ -96,13 +106,12 @@ namespace UnityExplorer.UI.CSharpConsole
return sb.ToString();
}
- public IEnumerable GetMatches(string input)
- {
- if (string.IsNullOrEmpty(input))
- yield break;
- InputString = input;
- LastCommittedIndex = -1;
+ // Match builder, iterates through each Lexer and returns all matches found.
+
+ private IEnumerable GetMatches()
+ {
+ LastCommittedIndex = currentStartIdx - 1;
Rollback();
while (!EndOfInput)
@@ -137,6 +146,8 @@ namespace UnityExplorer.UI.CSharpConsole
}
}
+ // Methods used by the Lexers for interfacing with the current parse process
+
public char PeekNext(int amount = 1)
{
LookaheadIndex += amount;
@@ -145,7 +156,7 @@ namespace UnityExplorer.UI.CSharpConsole
public void Commit()
{
- LastCommittedIndex = Math.Min(Length - 1, LookaheadIndex);
+ LastCommittedIndex = Math.Min(currentEndIdx, LookaheadIndex);
}
public void Rollback()
@@ -158,6 +169,13 @@ namespace UnityExplorer.UI.CSharpConsole
LookaheadIndex = Math.Max(LastCommittedIndex + 1, LookaheadIndex - amount);
}
+ public bool IsDelimiter(char character, bool orWhitespace = false, bool orLetterOrDigit = false)
+ {
+ return delimiters.Contains(character)
+ || (orWhitespace && char.IsWhiteSpace(character))
+ || (orLetterOrDigit && char.IsLetterOrDigit(character));
+ }
+
private void SkipWhitespace()
{
// peek and commit as long as there is whitespace
@@ -170,178 +188,5 @@ namespace UnityExplorer.UI.CSharpConsole
// revert the last PeekNext which would have returned false
Rollback();
}
-
- #region AUTO INDENT TODO
-
- // Auto-indenting
-
- //public int GetIndentLevel(string input, int toIndex)
- //{
- // bool stringState = false;
- // int indent = 0;
- //
- // for (int i = 0; i < toIndex && i < input.Length; i++)
- // {
- // char character = input[i];
- //
- // if (character == '"')
- // stringState = !stringState;
- // else if (!stringState && character == INDENT_OPEN)
- // indent++;
- // else if (!stringState && character == INDENT_CLOSE)
- // indent--;
- // }
- //
- // if (indent < 0)
- // indent = 0;
- //
- // return indent;
- //}
-
- //// TODO not quite correct, but almost there.
- //
- //public string AutoIndentOnEnter(string input, ref int caretPos)
- //{
- // var sb = new StringBuilder(input);
- //
- // bool inString = false;
- // bool inChar = false;
- // int currentIndent = 0;
- // int curLineIndent = 0;
- // bool prevWasNewLine = true;
- //
- // // process before caret position
- // for (int i = 0; i < caretPos; i++)
- // {
- // char c = sb[i];
- //
- // ExplorerCore.Log(i + ": " + c);
- //
- // // update string/char state
- // if (!inChar && c == '\"')
- // inString = !inString;
- // else if (!inString && c == '\'')
- // inChar = !inChar;
- //
- // // continue if inside string or char
- // if (inString || inChar)
- // continue;
- //
- // // check for new line
- // if (c == '\n')
- // {
- // ExplorerCore.Log("new line, resetting line counts");
- // curLineIndent = 0;
- // prevWasNewLine = true;
- // }
- // // check for indent
- // else if (c == '\t' && prevWasNewLine)
- // {
- // ExplorerCore.Log("its a tab");
- // if (curLineIndent > currentIndent)
- // {
- // ExplorerCore.Log("too many tabs, removing");
- // // already reached the indent we should have
- // sb.Remove(i, 1);
- // i--;
- // caretPos--;
- // curLineIndent--;
- // }
- // else
- // curLineIndent++;
- // }
- // // remove spaces on new lines
- // else if (c == ' ' && prevWasNewLine)
- // {
- // ExplorerCore.Log("removing newline-space");
- // sb.Remove(i, 1);
- // i--;
- // caretPos--;
- // }
- // else
- // {
- // if (c == INDENT_CLOSE)
- // currentIndent--;
- //
- // if (prevWasNewLine && curLineIndent < currentIndent)
- // {
- // ExplorerCore.Log("line is not indented enough");
- // // line is not indented enough
- // int diff = currentIndent - curLineIndent;
- // sb.Insert(i, new string('\t', diff));
- // caretPos += diff;
- // i += diff;
- // }
- //
- // // check for brackets
- // if ((c == INDENT_CLOSE || c == INDENT_OPEN) && !prevWasNewLine)
- // {
- // ExplorerCore.Log("bracket needs new line");
- //
- // // need to put it on a new line
- // sb.Insert(i, $"\n{new string('\t', currentIndent)}");
- // caretPos += 1 + currentIndent;
- // i += 1 + currentIndent;
- // }
- //
- // if (c == INDENT_OPEN)
- // currentIndent++;
- //
- // prevWasNewLine = false;
- // }
- // }
- //
- // // todo put caret on new line after previous bracket if needed
- // // indent caret to current indent
- //
- // // process after caret position, make sure there are equal opened/closed brackets
- // ExplorerCore.Log("-- after caret --");
- // for (int i = caretPos; i < sb.Length; i++)
- // {
- // char c = sb[i];
- // ExplorerCore.Log(i + ": " + c);
- //
- // // update string/char state
- // if (!inChar && c == '\"')
- // inString = !inString;
- // else if (!inString && c == '\'')
- // inChar = !inChar;
- //
- // if (inString || inChar)
- // continue;
- //
- // if (c == INDENT_OPEN)
- // currentIndent++;
- // else if (c == INDENT_CLOSE)
- // currentIndent--;
- // }
- //
- // if (currentIndent > 0)
- // {
- // ExplorerCore.Log("there are not enough closing brackets, curIndent is " + currentIndent);
- // // There are not enough close brackets
- //
- // // TODO this should append in reverse indent order (small indents inserted first, then biggest).
- // while (currentIndent > 0)
- // {
- // ExplorerCore.Log("Inserting closing bracket with " + currentIndent + " indent");
- // // append the indented '}' on a new line
- // sb.Insert(caretPos, $"\n{new string('\t', currentIndent - 1)}}}");
- //
- // currentIndent--;
- // }
- //
- // }
- // //else if (currentIndent < 0)
- // //{
- // // // There are too many close brackets
- // //
- // // // todo?
- // //}
- //
- // return sb.ToString();
- //}
-
- #endregion
}
}
diff --git a/src/UI/Models/InputFieldRef.cs b/src/UI/Models/InputFieldRef.cs
index 72df011..d2b5532 100644
--- a/src/UI/Models/InputFieldRef.cs
+++ b/src/UI/Models/InputFieldRef.cs
@@ -30,8 +30,8 @@ namespace UnityExplorer.UI
set => InputField.text = value;
}
- public bool ReachedMaxVerts => TextGenerator.vertexCount >= UIManager.MAX_TEXT_VERTS;
public TextGenerator TextGenerator => InputField.cachedInputTextGenerator;
+ public bool ReachedMaxVerts => TextGenerator.vertexCount >= UIManager.MAX_TEXT_VERTS;
private bool updatedWanted;
@@ -44,7 +44,6 @@ namespace UnityExplorer.UI
{
if (updatedWanted)
{
- //LayoutRebuilder.ForceRebuildLayoutImmediate(Rect);
LayoutRebuilder.MarkLayoutForRebuild(Rect);
OnValueChanged?.Invoke(InputField.text);
diff --git a/src/UI/Panels/CSConsolePanel.cs b/src/UI/Panels/CSConsolePanel.cs
index c775102..263f37b 100644
--- a/src/UI/Panels/CSConsolePanel.cs
+++ b/src/UI/Panels/CSConsolePanel.cs
@@ -31,24 +31,6 @@ namespace UnityExplorer.UI.Panels
public Action OnSuggestionsToggled;
public Action OnAutoIndentToggled;
- public int LastCaretPosition { get; private set; }
- private int m_desiredCaretFix;
- private bool m_fixWaiting;
- private float m_defaultInputFieldAlpha;
-
- public void UseSuggestion(string suggestion)
- {
- string input = Input.Text;
- input = input.Insert(LastCaretPosition, suggestion);
- Input.Text = input;
-
- m_desiredCaretFix = LastCaretPosition += suggestion.Length;
-
- var color = Input.InputField.selectionColor;
- color.a = 0f;
- Input.InputField.selectionColor = color;
- }
-
private void InvokeOnValueChanged(string value)
{
// Todo show a label instead of just logging
@@ -63,28 +45,6 @@ namespace UnityExplorer.UI.Panels
base.Update();
CSConsole.Update();
-
- if (m_desiredCaretFix >= 0)
- {
- if (!m_fixWaiting)
- {
- EventSystem.current.SetSelectedGameObject(InputScroll.UIRoot, null);
- m_fixWaiting = true;
- }
- else
- {
- Input.InputField.caretPosition = m_desiredCaretFix;
- Input.InputField.selectionFocusPosition = m_desiredCaretFix;
- var color = Input.InputField.selectionColor;
- color.a = m_defaultInputFieldAlpha;
- Input.InputField.selectionColor = color;
-
- m_fixWaiting = false;
- m_desiredCaretFix = -1;
- }
- }
- else if (Input.InputField.caretPosition > 0)
- LastCaretPosition = Input.InputField.caretPosition;
}
// Saving
@@ -153,30 +113,33 @@ namespace UnityExplorer.UI.Panels
var inputObj = UIFactory.CreateSrollInputField(this.content, "ConsoleInput", CSConsole.STARTUP_TEXT, out var inputScroller, fontSize);
InputScroll = inputScroller;
- m_defaultInputFieldAlpha = Input.InputField.selectionColor.a;
+ CSConsole.defaultInputFieldAlpha = Input.InputField.selectionColor.a;
Input.OnValueChanged += InvokeOnValueChanged;
- var placeHolderText = Input.PlaceholderText;
- placeHolderText.fontSize = fontSize;
-
InputText = Input.InputField.textComponent;
InputText.supportRichText = false;
InputText.color = new Color(1, 1, 1, 0.65f);
+ Input.PlaceholderText.fontSize = fontSize;
- var mainTextObj = InputText.gameObject;
- var highlightTextObj = UIFactory.CreateUIObject("HighlightText", mainTextObj.gameObject);
+ // Lexer highlight text overlay
+ var highlightTextObj = UIFactory.CreateUIObject("HighlightText", InputText.gameObject);
var highlightTextRect = highlightTextObj.GetComponent();
highlightTextRect.pivot = new Vector2(0, 1);
highlightTextRect.anchorMin = Vector2.zero;
highlightTextRect.anchorMax = Vector2.one;
- highlightTextRect.offsetMin = new Vector2(20, 0);
- highlightTextRect.offsetMax = new Vector2(14, 0);
+ highlightTextRect.offsetMin = Vector2.zero;
+ highlightTextRect.offsetMax = Vector2.zero;
HighlightText = highlightTextObj.AddComponent();
HighlightText.color = Color.clear;
HighlightText.supportRichText = true;
HighlightText.fontSize = fontSize;
+ // Set fonts
+ InputText.font = UIManager.ConsoleFont;
+ Input.PlaceholderText.font = UIManager.ConsoleFont;
+ HighlightText.font = UIManager.ConsoleFont;
+
#endregion
#region COMPILE BUTTON BAR
@@ -196,15 +159,6 @@ namespace UnityExplorer.UI.Panels
#endregion
- InputText.font = UIManager.ConsoleFont;
- placeHolderText.font = UIManager.ConsoleFont;
- HighlightText.font = UIManager.ConsoleFont;
-
- // reset this after formatting finalized
- highlightTextRect.anchorMin = Vector2.zero;
- highlightTextRect.anchorMax = Vector2.one;
- highlightTextRect.offsetMin = Vector2.zero;
- highlightTextRect.offsetMax = Vector2.zero;
}
}
}