/// <summary> /// 开始打字效果。可以重复调用重复启动。 /// </summary> public void Start() { _textField.graphics.meshModifier -= OnMeshModified; _textField.Redraw(); _textField.graphics.meshModifier += OnMeshModified; _backupVerts.Clear(); _stroke = false; _shadow = false; _strokeDrawDirs = 4; _mainLayerStart = 0; _mainLayerVertCount = 0; _printIndex = 0; _vertIndex = 0; _started = true; int vertCount = _textField.graphics.vertCount; //备份所有顶点后将顶点置0 Vector3[] vertices = _textField.graphics.vertices; Vector3 zero = Vector3.zero; for (int i = 0; i < vertCount; i++) { _backupVerts.Add(vertices[i]); vertices[i] = zero; } _textField.graphics.mesh.vertices = vertices; //隐藏所有混排的对象 if (_textField.richTextField != null) { int ec = _textField.richTextField.htmlElementCount; for (int i = 0; i < ec; i++) { _textField.richTextField.ShowHtmlObject(i, false); } } int charCount = _textField.charPositions.Count; for (int i = 0; i < charCount; i++) { TextField.CharPosition cp = _textField.charPositions[i]; if (cp.vertCount > 0) { _mainLayerVertCount += cp.vertCount; } } if (_mainLayerVertCount < vertCount) //说明有描边或者阴影 { int repeat = vertCount / _mainLayerVertCount; _stroke = repeat > 2; _shadow = repeat % 2 == 0; _mainLayerStart = vertCount - vertCount / repeat; _strokeLayerStart = _shadow ? (vertCount / repeat) : 0; _strokeDrawDirs = repeat > 8 ? 8 : 4; } }
void UpdateSelection(TextField.CharPosition cp) { TextField.CharPosition start = GetCharPosition(_selectionStart); if (start.charIndex == cp.charIndex) { _selectionShape.Clear(); return; } if (start.charIndex > cp.charIndex) { TextField.CharPosition tmp = start; start = cp; cp = tmp; } Vector2 v1 = GetCharLocation(start); Vector2 v2 = GetCharLocation(cp); List <Rect> rects = _selectionShape.rects; if (rects == null) { rects = new List <Rect>(2); } else { rects.Clear(); } textField.GetLinesShape(start.lineIndex, v1.x - textField.x, cp.lineIndex, v2.x - textField.x, false, rects); _selectionShape.rects = rects; _selectionShape.xy = textField.xy; }
override internal void RefreshObjects() { base.RefreshObjects(); if (_editing) { SetChildIndex(_selectionShape, this.numChildren - 1); SetChildIndex(_caret, this.numChildren - 2); } int cnt = textField.charPositions.Count; if (_caretPosition >= cnt) { _caretPosition = cnt - 1; } if (_selectionStart >= cnt) { _selectionStart = cnt - 1; } textField.SetXY(0, 0); TextField.CharPosition cp = GetCharPosition(_caretPosition); AdjustCaret(cp); }
void __touchMove(EventContext context) { if (isDisposed) { return; } if (_selectionStart == null) { return; } Vector3 v = Stage.inst.touchPosition; v = this.GlobalToLocal(v); if (float.IsNaN(v.x)) { return; } TextField.CharPosition cp = GetCharPosition(v); if (cp.caretIndex != _caretPosition) { AdjustCaret(cp); } }
void AdjustCaret(TextField.CharPosition cp) { _caretPosition = cp.caretIndex; Vector2 pos = GetCharLocation(cp); TextField.LineInfo line = textField.lines[cp.lineIndex]; pos.y = line.y + textField.y; Vector2 newPos = pos; if (newPos.x < textField.textFormat.size) { newPos.x += Math.Min(50, (int)(_contentRect.width / 2)); } else if (newPos.x > _contentRect.width - GUTTER_X - textField.textFormat.size) { newPos.x -= Math.Min(50, (int)(_contentRect.width / 2)); } if (newPos.x < GUTTER_X) { newPos.x = GUTTER_X; } else if (newPos.x > _contentRect.width - GUTTER_X) { newPos.x = Math.Max(GUTTER_X, _contentRect.width - GUTTER_X); } if (newPos.y < GUTTER_Y) { newPos.y = GUTTER_Y; } else if (newPos.y + line.height >= _contentRect.height - GUTTER_Y) { newPos.y = Math.Max(GUTTER_Y, _contentRect.height - line.height - GUTTER_Y); } pos += MoveContent(newPos - pos); if (_editing) { if (line.height > 0) //将光标居中 { pos.y += (int)(line.height - textField.textFormat.size) / 2; } _caret.SetPosition(pos.x, pos.y, 0); Vector2 cursorPos = _caret.LocalToGlobal(new Vector2(0, _caret.height)); Input.compositionCursorPos = cursorPos; _nextBlink = Time.time + 0.5f; _caret.graphics.enabled = true; if (_selectionStart != null) { UpdateSelection(cp); } } }
/// <summary> /// 获得字符的坐标。这个坐标是容器的坐标,不是文本里的坐标。 /// </summary> /// <param name="cp"></param> /// <returns></returns> Vector2 GetCharLocation(TextField.CharPosition cp) { TextField.LineInfo line = textField.lines[cp.lineIndex]; Vector2 pos; if (line.charCount == 0 || textField.charPositions.Count == 0) { if (textField.align == AlignType.Center) { pos.x = (int)(_contentRect.width / 2); } else { pos.x = GUTTER_X; } } else { TextField.CharPosition v = textField.charPositions[Math.Min(cp.charIndex, textField.charPositions.Count - 1)]; pos.x = v.offsetX - 1; } pos.x += textField.x; pos.y = textField.y + line.y; return(pos); }
void __focusIn(EventContext context) { if (!editable || !Application.isPlaying) { return; } _editing = true; if (_caret == null) { CreateCaret(); } if (!string.IsNullOrEmpty(_promptText)) { UpdateText(); } float caretSize; //如果界面缩小过,光标很容易看不见,这里放大一下 if (UIConfig.inputCaretSize == 1 && GRoot.contentScaleFactor < 1) { caretSize = (float)UIConfig.inputCaretSize / GRoot.contentScaleFactor; } else { caretSize = UIConfig.inputCaretSize; } _caret.SetSize(caretSize, textField.textFormat.size); _caret.DrawRect(0, Color.clear, textField.textFormat.color); AddChild(_caret); _selectionShape.Clear(); AddChild(_selectionShape); if (!textField.Redraw()) { TextField.CharPosition cp = GetCharPosition(_caretPosition); AdjustCaret(cp); } if (Stage.keyboardInput) { if (keyboardInput) { Stage.inst.OpenKeyboard(_text, false, _displayAsPassword ? false : !textField.singleLine, _displayAsPassword, false, null, keyboardType, hideInput); SetSelection(0, -1); } } else { Input.imeCompositionMode = IMECompositionMode.On; _composing = 0; } }
void AdjustCaret(TextField.CharPosition cp, bool moveSelectionHeader = false) { _caretPosition = cp.charIndex; if (moveSelectionHeader) { _selectionStart = _caretPosition; } UpdateCaret(); }
/// <summary> /// /// </summary> /// <param name="value"></param> public void ReplaceSelection(string value) { string leftText = null; string rightText = null; if (_selectionStart != null) { TextField.CharPosition cp = (TextField.CharPosition)_selectionStart; ClearSelection(); if (cp.caretIndex < _caretPosition) { leftText = textField.text.Substring(0, cp.caretIndex); rightText = textField.text.Substring(_caretPosition); _caretPosition = cp.caretIndex; } else { leftText = textField.text.Substring(0, _caretPosition); rightText = textField.text.Substring(cp.caretIndex); } } else { if (string.IsNullOrEmpty(value)) { return; } leftText = textField.text.Substring(0, _caretPosition); rightText = textField.text.Substring(_caretPosition); } if (!string.IsNullOrEmpty(value)) { value = ValidateInput(value); if (leftText.Length + rightText.Length + value.Length > maxLength) { value = value.Substring(0, Math.Max(0, maxLength - leftText.Length - rightText.Length)); } this.text = leftText + value + rightText; _caretPosition += value.Length; } else { this.text = leftText + rightText; } //这里立即更新,使内含的图片等对象能够立即创建,避免延迟在Update里才创建,那样会引起闪烁 textField.Redraw(); onChanged.Call(); }
void Scroll(int hScroll, int vScroll) { vScroll = Mathf.Clamp(vScroll, 0, textField.lines.Count - 1); TextField.LineInfo line = textField.lines[vScroll]; hScroll = Mathf.Clamp(hScroll, 0, line.charCount - 1); TextField.CharPosition cp = GetCharPosition(line.charIndex + hScroll); Vector2 pt = GetCharLocation(cp); MoveContent(new Vector2(GUTTER_X - pt.x, GUTTER_Y - pt.y), false); }
protected override void InternalRefreshObjects() { base.InternalRefreshObjects(); if (_editing) { SetChildIndex(_selectionShape, this.numChildren - 1); SetChildIndex(_caret, this.numChildren - 2); } TextField.CharPosition cp = GetCharPosition(_caretPosition); AdjustCaret(cp); }
TextField.CharPosition GetCharPosition(int caretIndex) { if (caretIndex < textField.charPositions.Count) { return(textField.charPositions[caretIndex]); } else { TextField.CharPosition cp = new TextField.CharPosition(); cp.caretIndex = caretIndex; cp.lineIndex = (short)Math.Max(0, textField.lines.Count - 1); return(cp); } }
void UpdateSelection(TextField.CharPosition cp) { if (_selectionStart == _caretPosition) { _selectionShape.Clear(); return; } TextField.CharPosition start; if (_editing && Input.compositionString.Length > 0) { if (_selectionStart < _caretPosition) { cp = GetCharPosition(_caretPosition); start = GetCharPosition(_selectionStart); } else { start = GetCharPosition(_selectionStart + Input.compositionString.Length); } } else { start = GetCharPosition(_selectionStart); } if (start.charIndex > cp.charIndex) { TextField.CharPosition tmp = start; start = cp; cp = tmp; } Vector2 v1 = GetCharLocation(start); Vector2 v2 = GetCharLocation(cp); List <Rect> rects = _selectionShape.rects; if (rects == null) { rects = new List <Rect>(2); } else { rects.Clear(); } textField.GetLinesShape(start.lineIndex, v1.x - textField.x, cp.lineIndex, v2.x - textField.x, false, rects); _selectionShape.rects = rects; _selectionShape.xy = textField.xy; }
string GetSelection() { if (_selectionStart == null) { return(string.Empty); } TextField.CharPosition cp = (TextField.CharPosition)_selectionStart; if (cp.caretIndex < _caretPosition) { return(textField.text.Substring(cp.caretIndex, _caretPosition - cp.caretIndex)); } else { return(textField.text.Substring(_caretPosition, cp.caretIndex - _caretPosition)); } }
void __touchBegin(EventContext context) { if (!_editing || textField.charPositions.Count <= 1) { return; } ClearSelection(); Vector2 v = Stage.inst.touchPosition; v = this.GlobalToLocal(v); TextField.CharPosition cp = GetCharPosition(v); AdjustCaret(cp, true); context.CaptureTouch(); }
void __touchBegin(EventContext context) { if (!_editing || textField.lines.Count == 0) { return; } ClearSelection(); Vector3 v = Stage.inst.touchPosition; v = this.GlobalToLocal(v); TextField.CharPosition cp = GetCharPosition(v); AdjustCaret(cp); _selectionStart = cp; context.CaptureTouch(); Stage.inst.onTouchMove.AddCapture(_touchMoveDelegate); }
void __mouseWheel(EventContext context) { if (_editing && mouseWheelEnabled) { context.StopPropagation(); TextField.CharPosition cp = GetCharPosition(Vector2.zero); int vScroll = cp.lineIndex; int hScroll = cp.charIndex - textField.lines[cp.lineIndex].charIndex; if (context.inputEvent.mouseWheelDelta < 0) { vScroll--; } else { vScroll++; } Scroll(hScroll, vScroll); } }
void __touchBegin(EventContext context) { if (!_editing || textField.charPositions.Count <= 1 || keyboardInput && Stage.keyboardInput && !Stage.inst.keyboard.supportsCaret || context.inputEvent.button != 0) { return; } ClearSelection(); Vector3 v = Stage.inst.touchPosition; v = this.GlobalToLocal(v); TextField.CharPosition cp = GetCharPosition(v); AdjustCaret(cp, true); context.CaptureTouch(); }
void __touchMove(EventContext context) { if (!_editing) { return; } Vector3 v = Stage.inst.touchPosition; v = this.GlobalToLocal(v); if (float.IsNaN(v.x)) { return; } TextField.CharPosition cp = GetCharPosition(v); if (cp.charIndex != _caretPosition) { AdjustCaret(cp); } }
void UpdateSelection(TextField.CharPosition cp) { if (_selectionStart == _caretPosition) { _selectionShape.Clear(); return; } TextField.CharPosition start; if (_editing && IMEAdapter.compositionString.Length > 0) { if (_selectionStart < _caretPosition) { cp = GetCharPosition(_caretPosition); start = GetCharPosition(_selectionStart); } else { start = GetCharPosition(_selectionStart + IMEAdapter.compositionString.Length); } } else { start = GetCharPosition(_selectionStart); } if (start.charIndex > cp.charIndex) { TextField.CharPosition tmp = start; start = cp; cp = tmp; } Vector2 v1 = GetCharLocation(start); Vector2 v2 = GetCharLocation(cp); _selectionShape.rects.Clear(); textField.GetLinesShape(start.lineIndex, v1.X - textField.x, cp.lineIndex, v2.X - textField.x, false, _selectionShape.rects); _selectionShape.Refresh(); _selectionShape.position = textField.position; }
void __focusIn(EventContext context) { if (!editable) { return; } _editing = true; if (_caret == null) { CreateCaret(); } if (!string.IsNullOrEmpty(_promptText)) { UpdateText(); } float caretSize = UIConfig.inputCaretSize; _caret.SetSize(caretSize, textField.textFormat.size); _caret.DrawRect(0, Color.Transparent, textField.textFormat.color); AddChild(_caret); _selectionShape.Clear(); AddChild(_selectionShape); if (!textField.Rebuild()) { TextField.CharPosition cp = GetCharPosition(_caretPosition); AdjustCaret(cp); } IMEAdapter.compositionMode = IMEAdapter.CompositionMode.On; _composing = 0; }
/// <summary> /// 开始打字效果。可以重复调用重复启动。 /// </summary> public void Start() { _textField.Redraw(); _backupColors.Clear(); _stroke = false; _shadow = false; _mainLayerStart = 0; _mainLayerVertCount = 0; _printIndex = 0; _vertIndex = 0; int vertCount = _textField.graphics.vertCount; //全部置为透明(不可见) Color32[] colors = _textField.graphics.colors; Color32 clear = Color.clear; for (int i = 0; i < vertCount; i++) { _backupColors.Add(colors[i]); colors[i] = clear; } _textField.graphics.mesh.colors32 = colors; //隐藏所有混排的对象 if (_textField.richTextField != null) { int ec = _textField.richTextField.htmlElementCount; for (int i = 0; i < ec; i++) { _textField.richTextField.ShowHtmlObject(i, false); } } int charCount = _textField.charPositions.Count; for (int i = 0; i < charCount; i++) { TextField.CharPosition cp = _textField.charPositions[i]; if (cp.vertCount > 0) { _mainLayerVertCount += cp.vertCount; } } if (_mainLayerVertCount < vertCount) //说明有描边或者阴影 { if (vertCount == _mainLayerVertCount * 6) { _stroke = true; _shadow = true; _mainLayerStart = vertCount * 5 / 6; _strokeLayerStart = vertCount / 6; } else if (vertCount == _mainLayerVertCount * 5) { _stroke = true; _shadow = false; _mainLayerStart = vertCount * 4 / 5; _strokeLayerStart = 0; } else if (vertCount == _mainLayerVertCount * 2) { _stroke = false; _shadow = true; _mainLayerStart = vertCount / 2; } } }
/// <summary> /// 通过本地坐标获得字符索引位置 /// </summary> /// <param name="location">本地坐标</param> /// <returns></returns> TextField.CharPosition GetCharPosition(Vector2 location) { TextField.CharPosition result = new TextField.CharPosition(); if (textField.charPositions.Count == 0) { result.lineIndex = 0; result.caretIndex = 0; return(result); } location.x -= textField.x; location.y -= textField.y; List <TextField.LineInfo> lines = textField.lines; int len = lines.Count; TextField.LineInfo line; int i; for (i = 0; i < len; i++) { line = lines[i]; if (line.y + line.height > location.y) { break; } } if (i == len) { i = len - 1; } result.lineIndex = (short)i; len = textField.charPositions.Count; TextField.CharPosition v; int firstInLine = -1; for (i = 0; i < len; i++) { v = textField.charPositions[i]; if (v.lineIndex == result.lineIndex) { if (firstInLine == -1) { firstInLine = i; } if (v.offsetX > location.x) { if (i > firstInLine) { //最后一个字符有点难点 if (v.offsetX - location.x < 2) { result.caretIndex = i; } else { result.caretIndex = i - 1; } } else { result.caretIndex = firstInLine; } return(result); } } else if (firstInLine != -1) { break; } } result.caretIndex = i - 1; return(result); }
bool HandleKey(InputEvent evt) { bool keyCodeHandled = true; switch (evt.keyCode) { case KeyCode.Backspace: { if (evt.command) { //for mac:CMD+Backspace=Delete if (_selectionStart == _caretPosition && _caretPosition < textField.charPositions.Count - 1) { _selectionStart = _caretPosition + 1; } } else { if (_selectionStart == _caretPosition && _caretPosition > 0) { _selectionStart = _caretPosition - 1; } } if (_editable) { ReplaceSelection(null); } break; } case KeyCode.Delete: { if (_selectionStart == _caretPosition && _caretPosition < textField.charPositions.Count - 1) { _selectionStart = _caretPosition + 1; } if (_editable) { ReplaceSelection(null); } break; } case KeyCode.LeftArrow: { if (!evt.shift) { ClearSelection(); } if (_caretPosition > 0) { if (evt.command) //mac keyboard { TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MinValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); } else { TextField.CharPosition cp = GetCharPosition(_caretPosition - 1); AdjustCaret(cp, !evt.shift); } } break; } case KeyCode.RightArrow: { if (!evt.shift) { ClearSelection(); } if (_caretPosition < textField.charPositions.Count - 1) { if (evt.command) { TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MaxValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); } else { TextField.CharPosition cp = GetCharPosition(_caretPosition + 1); AdjustCaret(cp, !evt.shift); } } break; } case KeyCode.UpArrow: { if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex > 0) { TextField.LineInfo line = textField.lines[cp.lineIndex - 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); AdjustCaret(cp, !evt.shift); } break; } case KeyCode.DownArrow: { if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == textField.lines.Count - 1) { cp.charIndex = textField.charPositions.Count - 1; } else { TextField.LineInfo line = textField.lines[cp.lineIndex + 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); } AdjustCaret(cp, !evt.shift); break; } case KeyCode.PageUp: { ClearSelection(); break; } case KeyCode.PageDown: { ClearSelection(); break; } case KeyCode.Home: { if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MinValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case KeyCode.End: { if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MaxValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } //Select All case KeyCode.A: { if (evt.ctrlOrCmd) { _selectionStart = 0; AdjustCaret(GetCharPosition(int.MaxValue)); } break; } //Copy case KeyCode.C: { if (evt.ctrlOrCmd && !_displayAsPassword) { string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); } } break; } //Paste case KeyCode.V: { if (evt.ctrlOrCmd && _editable) { DoPaste(); } break; } //Cut case KeyCode.X: { if (evt.ctrlOrCmd && !_displayAsPassword) { string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); if (_editable) { ReplaceSelection(null); } } } break; } case KeyCode.Z: { if (evt.ctrlOrCmd && _editable) { if (evt.shift) { TextInputHistory.inst.Redo(this); } else { TextInputHistory.inst.Undo(this); } } break; } case KeyCode.Y: { if (evt.ctrlOrCmd && _editable) { TextInputHistory.inst.Redo(this); } break; } case KeyCode.Return: case KeyCode.KeypadEnter: { if (textField.singleLine) { Stage.inst.focus = parent; DispatchEvent("onSubmit", null); DispatchEvent("onKeyDown", null); //for backward compatibility } break; } case KeyCode.Tab: { if (textField.singleLine) { Stage.inst.DoKeyNavigate(evt.shift); keyCodeHandled = false; } break; } case KeyCode.Escape: { this.text = _textBeforeEdit; Stage.inst.focus = parent; break; } default: keyCodeHandled = (int)evt.keyCode <= 272 && !evt.ctrlOrCmd; break; } char c = evt.character; if (c != 0) { if (evt.ctrlOrCmd) { return(true); } if (c == '\r' || c == 3) { c = '\n'; } if (c == 25)/*shift+tab*/ { c = '\t'; } if (c == 27 /*escape*/ || textField.singleLine && (c == '\n' || c == '\t')) { return(true); } if (char.IsHighSurrogate(c)) { _highSurrogateChar = c; return(true); } if (_editable) { if (char.IsLowSurrogate(c)) { ReplaceSelection(char.ConvertFromUtf32(((int)c & 0x03FF) + ((((int)_highSurrogateChar & 0x03FF) + 0x40) << 10))); } else { ReplaceSelection(c.ToString()); } } return(true); } else { if (Input.compositionString.Length > 0 && _editable) { UpdateText(); } return(keyCodeHandled); } }
void __focusIn(EventContext context) { if (!Application.isPlaying) { return; } _editing = true; _textBeforeEdit = _text; if (_caret == null) { CreateCaret(); } if (!string.IsNullOrEmpty(_promptText)) { UpdateText(); } float caretSize; //如果界面缩小过,光标很容易看不见,这里放大一下 if (UIConfig.inputCaretSize == 1 && UIContentScaler.scaleFactor < 1) { caretSize = UIConfig.inputCaretSize / UIContentScaler.scaleFactor; } else { caretSize = UIConfig.inputCaretSize; } _caret.SetSize(caretSize, textField.textFormat.size); _caret.DrawRect(0, Color.clear, textField.textFormat.color); _caret.visible = _editable; AddChild(_caret); _selectionShape.Clear(); AddChildAt(_selectionShape, 0); if (!textField.Redraw()) { TextField.CharPosition cp = GetCharPosition(_caretPosition); AdjustCaret(cp); } if (Stage.keyboardInput) { if (keyboardInput) { Stage.inst.OpenKeyboard(_text, false, _displayAsPassword ? false : !textField.singleLine, _displayAsPassword, false, null, keyboardType, hideInput); SetSelection(0, -1); } } else { if (!disableIME) { Input.imeCompositionMode = IMECompositionMode.On; } else { Input.imeCompositionMode = IMECompositionMode.Off; } _composing = 0; if ((string)context.data == "key") //select all if got focus by tab key { SetSelection(0, -1); } TextInputHistory.inst.StartRecord(this); } }
void __keydown(EventContext context) { if (!_editing || context.isDefaultPrevented) { return; } InputEvent evt = context.inputEvent; switch (evt.keyCode) { case KeyCode.Backspace: { context.PreventDefault(); if (_selectionStart == _caretPosition && _caretPosition > 0) { _selectionStart = _caretPosition - 1; } ReplaceSelection(null); break; } case KeyCode.Delete: { context.PreventDefault(); if (_selectionStart == _caretPosition && _caretPosition < textField.charPositions.Count - 1) { _selectionStart = _caretPosition + 1; } ReplaceSelection(null); break; } case KeyCode.LeftArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } if (_caretPosition > 0) { TextField.CharPosition cp = GetCharPosition(_caretPosition - 1); AdjustCaret(cp, !evt.shift); } break; } case KeyCode.RightArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } if (_caretPosition < textField.charPositions.Count - 1) { TextField.CharPosition cp = GetCharPosition(_caretPosition + 1); AdjustCaret(cp, !evt.shift); } break; } case KeyCode.UpArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == 0) { return; } TextField.LineInfo line = textField.lines[cp.lineIndex - 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case KeyCode.DownArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == textField.lines.Count - 1) { cp.charIndex = textField.charPositions.Count - 1; } else { TextField.LineInfo line = textField.lines[cp.lineIndex + 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); } AdjustCaret(cp, !evt.shift); break; } case KeyCode.PageUp: { context.PreventDefault(); ClearSelection(); break; } case KeyCode.PageDown: { context.PreventDefault(); ClearSelection(); break; } case KeyCode.Home: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MinValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case KeyCode.End: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MaxValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } //Select All case KeyCode.A: { if (evt.ctrl) { context.PreventDefault(); _selectionStart = 0; AdjustCaret(GetCharPosition(int.MaxValue)); } break; } //Copy case KeyCode.C: { if (evt.ctrl && !_displayAsPassword) { context.PreventDefault(); string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); } } break; } //Paste case KeyCode.V: { if (evt.ctrl) { context.PreventDefault(); DoPaste(); } break; } //Cut case KeyCode.X: { if (evt.ctrl && !_displayAsPassword) { context.PreventDefault(); string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); ReplaceSelection(null); } } break; } case KeyCode.Return: case KeyCode.KeypadEnter: { if (!evt.ctrl && !evt.shift) { context.PreventDefault(); if (!textField.singleLine) { ReplaceSelection("\n"); } } break; } } }
void __keydown(EventContext context) { if (!_editing || context.isDefaultPrevented) { return; } InputEvent evt = context.inputEvent; switch (evt.keyCode) { case KeyCode.Backspace: { context.PreventDefault(); if (_selectionStart == _caretPosition && _caretPosition > 0) { _selectionStart = _caretPosition - 1; } ReplaceSelection(null); break; } case KeyCode.Delete: { context.PreventDefault(); if (_selectionStart == _caretPosition && _caretPosition < textField.charPositions.Count - 1) { _selectionStart = _caretPosition + 1; } ReplaceSelection(null); break; } case KeyCode.LeftArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } if (_caretPosition > 0) { TextField.CharPosition cp = GetCharPosition(_caretPosition - 1); AdjustCaret(cp, !evt.shift); } break; } case KeyCode.RightArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } if (_caretPosition < textField.charPositions.Count - 1) { TextField.CharPosition cp = GetCharPosition(_caretPosition + 1); AdjustCaret(cp, !evt.shift); } break; } case KeyCode.UpArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == 0) { return; } TextField.LineInfo line = textField.lines[cp.lineIndex - 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case KeyCode.DownArrow: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == textField.lines.Count - 1) { cp.charIndex = textField.charPositions.Count - 1; } else { TextField.LineInfo line = textField.lines[cp.lineIndex + 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); } AdjustCaret(cp, !evt.shift); break; } case KeyCode.PageUp: { context.PreventDefault(); ClearSelection(); break; } case KeyCode.PageDown: { context.PreventDefault(); ClearSelection(); break; } case KeyCode.Home: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MinValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case KeyCode.End: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MaxValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } //Select All case KeyCode.A: { if (evt.ctrl) { context.PreventDefault(); _selectionStart = 0; AdjustCaret(GetCharPosition(int.MaxValue)); } break; } //Copy case KeyCode.C: { if (evt.ctrl && !_displayAsPassword) { context.PreventDefault(); string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); } } break; } //Paste case KeyCode.V: { if (evt.ctrl) { context.PreventDefault(); DoPaste(); } break; } //Cut case KeyCode.X: { if (evt.ctrl && !_displayAsPassword) { context.PreventDefault(); string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); ReplaceSelection(null); } } break; } case KeyCode.Return: case KeyCode.KeypadEnter: { if (textField.singleLine) { onSubmit.Call(); return; } break; } } char c = evt.character; if (c != 0) { if (evt.ctrl) { return; } if (c == '\r' || (int)c == 3) { c = '\n'; } if (c == 127 || textField.singleLine && c == '\n') { return; } if (char.IsHighSurrogate(c)) { _highSurrogateChar = c; return; } if (char.IsLowSurrogate(c)) { ReplaceSelection(char.ConvertFromUtf32(((int)c & 0x03FF) + ((((int)_highSurrogateChar & 0x03FF) + 0x40) << 10))); } else { ReplaceSelection(c.ToString()); } } else { if (Input.compositionString.Length > 0) { UpdateText(); } } }
void __keydown(EventContext context) { if (!_editing || context.isDefaultPrevented) { return; } InputEvent evt = context.inputEvent; switch (evt.keyCode) { case Keys.Back: { if (textField.text.Length > 0) { IMEAdapter.compositionString = textField.text.Remove(textField.text.Length - 1, 1); } context.PreventDefault(); if (_selectionStart == _caretPosition && _caretPosition > 0) { _selectionStart = _caretPosition - 1; } ReplaceSelection(null); break; } case Keys.Delete: { context.PreventDefault(); if (_selectionStart == _caretPosition && _caretPosition < textField.charPositions.Count - 1) { _selectionStart = _caretPosition + 1; } ReplaceSelection(null); break; } case Keys.Left: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } if (_caretPosition > 0) { TextField.CharPosition cp = GetCharPosition(_caretPosition - 1); AdjustCaret(cp, !evt.shift); } break; } case Keys.Right: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } if (_caretPosition < textField.charPositions.Count - 1) { TextField.CharPosition cp = GetCharPosition(_caretPosition + 1); AdjustCaret(cp, !evt.shift); } break; } case Keys.Up: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == 0) { return; } TextField.LineInfo line = textField.lines[cp.lineIndex - 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case Keys.Down: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); if (cp.lineIndex == textField.lines.Count - 1) { cp.charIndex = textField.charPositions.Count - 1; } else { TextField.LineInfo line = textField.lines[cp.lineIndex + 1]; cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y)); } AdjustCaret(cp, !evt.shift); break; } case Keys.PageUp: { context.PreventDefault(); ClearSelection(); break; } case Keys.PageDown: { context.PreventDefault(); ClearSelection(); break; } case Keys.Home: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MinValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } case Keys.End: { context.PreventDefault(); if (!evt.shift) { ClearSelection(); } TextField.CharPosition cp = GetCharPosition(_caretPosition); TextField.LineInfo line = textField.lines[cp.lineIndex]; cp = GetCharPosition(new Vector2(int.MaxValue, line.y + textField.y)); AdjustCaret(cp, !evt.shift); break; } //Select All case Keys.A: { if (evt.ctrl) { context.PreventDefault(); _selectionStart = 0; AdjustCaret(GetCharPosition(int.MaxValue)); } break; } //Copy case Keys.C: { if (evt.ctrl && !_displayAsPassword) { context.PreventDefault(); string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); } } break; } //Paste case Keys.V: { if (evt.ctrl) { context.PreventDefault(); DoPaste(); } break; } //Cut case Keys.X: { if (evt.ctrl && !_displayAsPassword) { context.PreventDefault(); string s = GetSelection(); if (!string.IsNullOrEmpty(s)) { DoCopy(s); ReplaceSelection(null); } } break; } case Keys.Enter: { if (textField.singleLine) { DispatchEvent("onSubmit", null); return; } break; } } if (evt.ctrl) { return; } string str = evt.KeyName; if (!string.IsNullOrEmpty(str) && IMEAdapter.compositionMode == IMEAdapter.CompositionMode.Off) { if (textField.singleLine && str == "\n") { return; } ReplaceSelection(str); } else { if (IMEAdapter.compositionString.Length > 0) { UpdateText(); } } }