internal void DrawWithTextSelectionAndCursor(MeshGenerationContext mgc, string newText, float pixelsPerPoint) { var playmodeTintColor = panel.contextType == ContextType.Editor ? UIElementsUtility.editorPlayModeTintColor : Color.white; var keyboardTextEditor = editorEventHandler as KeyboardTextEditorEventHandler; if (keyboardTextEditor == null) { return; } keyboardTextEditor.PreDrawCursor(newText); int cursorIndex = editorEngine.cursorIndex; int selectIndex = editorEngine.selectIndex; var scrollOffset = editorEngine.scrollOffset; float textScaling = TextUtilities.ComputeTextScaling(worldTransform, pixelsPerPoint); var textParams = MeshGenerationContextUtils.TextParams.MakeStyleBased(this, " "); float lineHeight = m_TextHandle.GetLineHeight(0, textParams, textScaling, pixelsPerPoint); float wordWrapWidth = 0.0f; // Make sure to take into account the word wrap style... if (editorEngine.multiline && (resolvedStyle.whiteSpace == WhiteSpace.Normal)) { wordWrapWidth = contentRect.width; } Vector2 pos = editorEngine.graphicalCursorPos - scrollOffset; pos.y += lineHeight; GUIUtility.compositionCursorPos = this.LocalToWorld(pos); int selectionEndIndex = string.IsNullOrEmpty(GUIUtility.compositionString) ? selectIndex : cursorIndex + GUIUtility.compositionString.Length; CursorPositionStylePainterParameters cursorParams; // Draw highlighted section, if any if ((cursorIndex != selectionEndIndex) && !isDragging) { int min = cursorIndex < selectionEndIndex ? cursorIndex : selectionEndIndex; int max = cursorIndex > selectionEndIndex ? cursorIndex : selectionEndIndex; cursorParams = CursorPositionStylePainterParameters.GetDefault(this, text); cursorParams.text = editorEngine.text; cursorParams.wordWrapWidth = wordWrapWidth; cursorParams.cursorIndex = min; Vector2 minPos = m_TextHandle.GetCursorPosition(cursorParams, textScaling); cursorParams.cursorIndex = max; Vector2 maxPos = m_TextHandle.GetCursorPosition(cursorParams, textScaling); minPos -= scrollOffset; maxPos -= scrollOffset; lineHeight = m_TextHandle.GetLineHeight(cursorIndex, textParams, textScaling, pixelsPerPoint); if (Mathf.Approximately(minPos.y, maxPos.y)) { mgc.Rectangle(new MeshGenerationContextUtils.RectangleParams() { rect = new Rect(minPos.x, minPos.y, maxPos.x - minPos.x, lineHeight), color = selectionColor, playmodeTintColor = playmodeTintColor }); } else { // Draw first line mgc.Rectangle(new MeshGenerationContextUtils.RectangleParams() { rect = new Rect(minPos.x, minPos.y, contentRect.xMax - minPos.x, lineHeight), color = selectionColor, playmodeTintColor = playmodeTintColor }); var inbetweenHeight = (maxPos.y - minPos.y) - lineHeight; if (inbetweenHeight > 0f) { // Draw all lines in-between mgc.Rectangle(new MeshGenerationContextUtils.RectangleParams() { rect = new Rect(contentRect.xMin, minPos.y + lineHeight, contentRect.width, inbetweenHeight), color = selectionColor, playmodeTintColor = playmodeTintColor }); } // Draw last line if not empty if (maxPos.x != contentRect.x) { mgc.Rectangle(new MeshGenerationContextUtils.RectangleParams() { rect = new Rect(contentRect.xMin, maxPos.y, maxPos.x, lineHeight), color = selectionColor, playmodeTintColor = playmodeTintColor }); } } } // Draw the text with the scroll offset if (!string.IsNullOrEmpty(editorEngine.text) && contentRect.width > 0.0f && contentRect.height > 0.0f) { textParams.rect = new Rect(contentRect.x - scrollOffset.x, contentRect.y - scrollOffset.y, contentRect.width + scrollOffset.x, contentRect.height + scrollOffset.y); textParams.text = editorEngine.text; mgc.Text(textParams, m_TextHandle, scaledPixelsPerPoint); } // Draw the cursor if (!isReadOnly && !isDragging) { if (cursorIndex == selectionEndIndex && (computedStyle.unityFont != null || !computedStyle.unityFontDefinition.IsEmpty())) { cursorParams = CursorPositionStylePainterParameters.GetDefault(this, text); cursorParams.text = editorEngine.text; cursorParams.wordWrapWidth = wordWrapWidth; cursorParams.cursorIndex = cursorIndex; Vector2 cursorPosition = m_TextHandle.GetCursorPosition(cursorParams, textScaling); cursorPosition -= scrollOffset; mgc.Rectangle(new MeshGenerationContextUtils.RectangleParams { rect = new Rect(cursorPosition.x, cursorPosition.y, 1f, lineHeight), color = cursorColor, playmodeTintColor = playmodeTintColor }); } // Draw alternate cursor, if any if (editorEngine.altCursorPosition != -1) { cursorParams = CursorPositionStylePainterParameters.GetDefault(this, text); cursorParams.text = editorEngine.text.Substring(0, editorEngine.altCursorPosition); cursorParams.wordWrapWidth = wordWrapWidth; cursorParams.cursorIndex = editorEngine.altCursorPosition; Vector2 altCursorPosition = m_TextHandle.GetCursorPosition(cursorParams, textScaling); altCursorPosition -= scrollOffset; mgc.Rectangle(new MeshGenerationContextUtils.RectangleParams { rect = new Rect(altCursorPosition.x, altCursorPosition.y, 1f, lineHeight), color = cursorColor, playmodeTintColor = playmodeTintColor }); } } keyboardTextEditor.PostDrawCursor(); }
public Vector2 GetCursorPosition(CursorPositionStylePainterParameters parms, float scaling) { return(textHandle.GetCursorPosition(parms, scaling)); }