Exemplo n.º 1
0
        /// <summary>
        /// Called every frame before update.
        /// TextInput implement this function to get keyboard input and also to animate caret timer.
        /// </summary>
        override protected void DoBeforeUpdate()
        {
            // animate caret
            _caretAnim += (float)UserInterface.Active.CurrGameTime.ElapsedGameTime.TotalSeconds * CaretBlinkingSpeed;

            // if the element is not focused, return
            if (!IsFocused)
            {
                return;
            }

            // validate caret position
            FixCaretPosition();

            // get user input
            char?currCharacterInput    = KeyboardInput.GetTextInput();
            Keys currCharacterInputKey = KeyboardInput.GetInputKey();

            // if input char is invalid, return
            if (currCharacterInput == null)
            {
                return;
            }

            // if the input char is not supported, return
            if (currCharacterInput != '\0' && !TextParagraph.isCharacterSupported((char)currCharacterInput))
            {
                return;
            }

            // init some values to handle user input
            string oldVal        = _value;
            int    oldCaret      = _caret;
            int    newCaretIndex = (_caret == -1 ? _value.Length : _caret);

            if (currCharacterInput != '\0')
            {
                // for normal character input, insert them in the text
                _value = _value.Insert(newCaretIndex++, currCharacterInput.ToString());
            }
            else if (UserInterface.ControlKeys.Contains(currCharacterInputKey))
            {
                newCaretIndex = HandleControlInputKeys(newCaretIndex, currCharacterInputKey);
            }

            // if carret move or text change, make it stay a little longer on screen before blinking again
            if (_caret != newCaretIndex || _value != oldVal)
            {
                PauseCaretBlink();
            }

            // update caret position
            _caret = newCaretIndex;

            // if value changed:
            if (_value != oldVal)
            {
                // if new characters were added and input is now illegal, revert to previous value
                if (!ValidateInput(ref _value, oldVal))
                {
                    _value = oldVal;
                    _caret = oldCaret;
                }

                // call change event
                if (_value != oldVal)
                {
                    DoOnValueChange();
                }

                // fix caret position
                FixCaretPosition();
            }

            // when a key is pressed, recalculate scrollbas max value and scroll to caret
            calculateScrollBarMaxValue();
            ScrollToCaret();

            // call base do-before-update
            base.DoBeforeUpdate();
        }