public void Rebuild() { if (input.textComponent.enabled && checker.NeedRebuild()) { //================================ // fix bug for tmp // TMPの不具合で、正しく座標を設定されてなかったため、試しに対応する var rt = input.textComponent.GetComponent <RectTransform>(); var size = input.textComponent.GetPreferredValues(); if (size.x < rt.rect.xMax) { // textComponent の座標を更新 var pos = rt.anchoredPosition; pos.x = 0; rt.anchoredPosition = pos; // caret の座標更新 var caret = input.GetComponentInChildren <TMP_SelectionCaret>(); var caretRect = caret.GetComponent <RectTransform>(); caretRect.anchoredPosition = rt.anchoredPosition; } //============================== // HACK : 1フレーム無効にする // MEMO : 他にいい方法Rebuildがあれば対応する // LayoutRebuilder.ForceRebuildLayoutImmediate(); で試してダメでした input.textComponent.enabled = false; input.Rebuild(CanvasUpdate.LatePreRender); input.textComponent.SetAllDirty(); } else { input.textComponent.enabled = true; } }
public void Rebuild(CanvasUpdate update) { input.Rebuild(update); }
private void AutoIndentCaret(bool isClosingToken = false) { // Check for new line if (Input.GetKeyDown(KeyCode.Return) == true) { // Update line column and indent positions UpdateCurrentLineColumnIndent(); // Build indent string string indent = string.Empty; // Make sure we have some text if (inputField.caretPosition < inputField.text.Length) { // Check for tabs before caret int beforeIndentCount = 0; int caretIndentCount = 0; for (int i = inputField.caretPosition; i >= 0; i--) { // Check for tab characters if (inputField.text[i] == '\t') { beforeIndentCount++; } // Check for previous line or spaces if (inputField.text[i] == '\n' || (languageTheme.autoIndent.autoIndentMode == AutoIndent.IndentMode.AutoTabContextual && inputField.text[i] != ' ')) { if (i != inputField.caretPosition) { break; } } } if (languageTheme.autoIndent.autoIndentMode == AutoIndent.IndentMode.AutoTabContextual) { // Take into account any previous tab characters caretIndentCount = currentIndent - caretIndentCount; } else { caretIndentCount = beforeIndentCount; } indent = GetAutoIndentTab(caretIndentCount); //int length = 0; //for(int i = inputField.caretPosition + 1; i < inputField.text.Length; i++, length++) //{ // if (inputField.text[i] == '\n') // break; //} //int caret = 0; //string formatted = languageTheme.autoIndent.GetAutoIndentedFormattedString(inputField.text.Substring(inputField.caretPosition + 1, length), currentIndent, out caret); //inputField.text = inputField.text.Remove(inputField.caretPosition + 1, length); //inputField.text = inputField.text.Insert(inputField.caretPosition + 1, formatted); //inputField.stringPosition = inputField.stringPosition + caret; //return; } if (indent.Length > 0) { // Get caret position inputField.text = inputField.text.Insert(inputField.caretPosition + 1, indent); // Move to the end of the new line inputField.stringPosition = inputField.stringPosition + indent.Length; } //if (languageTheme.autoIndent.autoIndentMode == AutoIndent.IndentMode.AutoTabContextual) //{ // Check for closing bracket bool immediateClosing = false; int closingOffset = -1; for (int i = inputField.caretPosition + 1; i < inputField.text.Length; i++) { if (inputField.text[i] == languageTheme.autoIndent.indentDecreaseCharacter) { // Set the closing flag immediateClosing = true; closingOffset = i - (inputField.caretPosition + 1); break; } // Check for any other character if (char.IsWhiteSpace(inputField.text[i]) == false || inputField.text[i] == '\n') { break; } } if (immediateClosing == true) { // Remove unnecessary white space inputField.text = inputField.text.Remove(inputField.caretPosition + 1, closingOffset); string localIndent = (string.IsNullOrEmpty(indent) == true) ? string.Empty : indent.Remove(0, 1); // Insert new line inputField.text = inputField.text.Insert(inputField.caretPosition + 1, GetAutoIndentTab(currentIndent) + "\n" + localIndent); //inputField.stringPosition -= 1; if (string.IsNullOrEmpty(localIndent) == false) { //inputField.stringPosition -= localIndent.Length; } // Update line column and indent positions UpdateCurrentLineColumnIndent(); } } //} // Check for closing token if (isClosingToken == true) { if (inputField.caretPosition > 0) { // Check for tab before caret if (inputField.text[inputField.caretPosition - 1] == '\t') { // Remove 1 tab because we have received a closing token inputField.text = inputField.text.Remove(inputField.caretPosition - 1, 1); inputField.stringPosition = inputField.stringPosition - 1; } } } inputText.text = inputField.text; inputText.SetText(inputField.text, true); inputText.Rebuild(CanvasUpdate.Prelayout); inputField.ForceLabelUpdate(); inputField.Rebuild(CanvasUpdate.Prelayout); Refresh(true); delayedRefresh = true; }