Exemple #1
0
        /// <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);
        }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
        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();
        }
Exemple #9
0
        /// <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);
        }
Exemple #11
0
        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);
        }
Exemple #12
0
 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;
        }
Exemple #14
0
        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));
            }
        }
Exemple #15
0
        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();
        }
Exemple #16
0
        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);
            }
        }
Exemple #20
0
        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;
        }
Exemple #21
0
        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;
                }
            }
        }
Exemple #23
0
        /// <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();
                }
            }
        }
Exemple #28
0
        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();
                }
            }
        }