Esempio n. 1
0
        public void Update(GameTime gameTime)
        {
            #region update ui area

            _oskShowHide.Update(gameTime.ElapsedGameTime);
            switch (OskAlignment)
            {
            case AlignmentX.Left:
                _oskOffset = new Vector2(0,
                                         Game.Height - _oskLower.Height * (float)Math.Sin(_oskShowHide * MathHelper.PiOver2));
                break;

            case AlignmentX.Center:
                _oskOffset = new Vector2(Game.Center.X - _oskLower.Width / 2f,
                                         Game.Height - _oskLower.Height * (float)Math.Sin(_oskShowHide * MathHelper.PiOver2));
                break;

            case AlignmentX.Right:
                _oskOffset = new Vector2(Game.Width - _oskLower.Width,
                                         Game.Height - _oskLower.Height * (float)Math.Sin(_oskShowHide * MathHelper.PiOver2));
                break;
            }
            OskArea = new Rectangle((int)_oskOffset.X, (int)_oskOffset.Y, _oskLower.Width, _oskLower.Height);

            foreach (var b in _oskButtonHits)
            {
                b.TimeToLive.Update(gameTime.ElapsedGameTime);
            }
            _oskButtonHits.RemoveAll(b => b.TimeToLive.IsComplete);

            #endregion

            #region reset states

            _oskPreviousState.Clear();
            _oskPreviousState.AddRange(_oskCurrentState);
            _oskCurrentState.Clear();

            foreach (var k in Keyboard.GetState().GetPressedKeys().Where(k => !_oskCurrentState.Contains(k))
                     )
            {
                _oskCurrentState.Add(k);
            }

            _taps.Clear();
            if (Game.UnifiedInput.Action)
            {
                _taps.Add(Game.UnifiedInput.Location);
            }
            foreach (var t in Game.TouchInput.Touches.Where(t => !_taps.Contains(t)))
            {
                _taps.Add(t);
            }
            if (_oskVisible)
            {
                //bool shift;
                //var shR = new Rectangle(_oskRects[Keys.LeftShift].X + (int)_oskOffset.X, _oskRects[Keys.LeftShift].Y + (int)_oskOffset.Y,
                //        _oskRects[Keys.LeftShift].Width, _oskRects[Keys.LeftShift].Width);
                //var shL = new Rectangle(_oskRects[Keys.LeftShift].X + (int)_oskOffset.X, _oskRects[Keys.LeftShift].Y + (int)_oskOffset.Y,
                //        _oskRects[Keys.LeftShift].Width, _oskRects[Keys.LeftShift].Width);
                //if (_taps.Any(k => shR.Contains(k) || shL.Contains(k)))
                // {
                //    shift = true;
                // }

                foreach (var t in _taps)
                {
                    var p = new Point((int)t.X, (int)t.Y);
                    foreach (var r in _oskRects)
                    {
                        var or = new Rectangle(r.Value.X + (int)_oskOffset.X, r.Value.Y + (int)_oskOffset.Y,
                                               r.Value.Width,
                                               r.Value.Height);
                        if (or.Contains(p))
                        {
                            _oskCurrentState.Add(r.Key);


                            _oskButtonHits.Add(new OskButton
                            {
                                TimeToLive = new Tween(new TimeSpan(0, 0, 0, 1), 1, 0),
                                Rect       = new Rectangle(r.Value.X, r.Value.Y, r.Value.Width, r.Value.Height)
                            });
                        }
                        if (
                            new Rectangle(_oskExitRect.X + (int)_oskOffset.X, _oskExitRect.Y + (int)_oskOffset.Y,
                                          _oskExitRect.Width, _oskExitRect.Width).Contains(p))
                        {
                            IsOskVisable = false;
                        }
                    }
                }
            }

            #endregion

            if (TypedKey(Keys.CapsLock))
            {
                _isOskCaps = !_isOskCaps;
            }
            Typed.Clear();
            foreach (var t in _keys)
            {
                if (!TypedKey(t))
                {
                    continue;
                }
                var l = t.ToString();
                if (l.Length == 1)
                {
                    //if (Released(Keys.LeftShift) && Released(Keys.RightShift))
                    //    l = l.ToLower();
                    if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) && !_isOskCaps)
                    {
                        l = l.ToUpper();
                    }
                    else if (_isOskCaps)
                    {
                        l = l.ToUpper();
                    }
                    else
                    {
                        l = l.ToLower();
                    }
                }
                else
                {
                    #region Name Numbers

                    if (l.StartsWith(D) & !l.Equals(DecimalStr) &
                        !l.Equals(Divide))
                    {
                        l = l.Substring(1);
                        if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift))
                        {
                            switch (l)
                            {
                            case Zero:
                            {
                                l = ZeroShift;
                                break;
                            }

                            case One:
                            {
                                l = OneShift;
                                break;
                            }

                            case Two:
                            {
                                l = TwoShift;
                                break;
                            }

                            case Three:
                            {
                                l = ThreeShift;
                                break;
                            }

                            case Four:
                            {
                                l = FourShift;
                                break;
                            }

                            case Five:
                            {
                                l = FiveShift;
                                break;
                            }

                            case Six:
                            {
                                l = SixShift;
                                break;
                            }

                            case Seven:
                            {
                                l = SevenShift;
                                break;
                            }

                            case Eight:
                            {
                                l = EightShift;
                                break;
                            }

                            case Nine:
                            {
                                l = NineShift;
                                break;
                            }
                            }
                        }
                    }
                    #endregion

                    else if (l.StartsWith(NumPad))
                    {
                        l = l.Substring(6);
                    }
                    else
                    {
                        switch (l)
                        {
                        case OemCommaStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemCommaShift
                                    : OemComma;
                            break;
                        }

                        case OemPeriodStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemPeriodShift
                                    : OemPeriod;
                            break;
                        }

                        case OemQuestionStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemQuestionShift
                                    : OemQuestion;
                            break;
                        }

                        case OemSemicolonStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemSemicolonShift
                                    : OemSemicolon;
                            break;
                        }

                        case OemQuotesStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemQuotesShift
                                    : OemQuotes;
                            break;
                        }

                        case OemOpenBracketsStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemOpenBracketsShift
                                    : OemOpenBrackets;
                            break;
                        }

                        case OemCloseBracketsStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemCloseBracketsShift
                                    : OemCloseBrackets;
                            break;
                        }

                        case OemPipeStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemPipeShift
                                    : OemPipe;
                            break;
                        }

                        case OemPlusStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemPlusShift
                                    : OemPlus;
                            break;
                        }

                        case OemMinusStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemMinusShift
                                    : OemMinus;
                            break;
                        }

                        case TabStr:
                        {
                            l = Tab;
                            break;
                        }

                        case MultiplyStr:
                        {
                            l = Multiply;
                            break;
                        }

                        case DivideStr:
                        {
                            l = Divide;
                            break;
                        }

                        case SubtractStr:
                        {
                            l = Subtract;
                            break;
                        }

                        case AddStr:
                        {
                            l = Add;
                            break;
                        }

                        case DecimalStr:
                        {
                            l = Dot;
                            break;
                        }

                        default:
                        {
                            break;
                        }
                        }
                    }
                }
                Typed.Add(l);
                CurrentLine += l;
            }

            // Check input for spacebar
            if (TypedKey(Keys.Space) && CurrentLine != string.Empty &&
                CurrentLine[CurrentLine.Length - 1].ToString() != Space)
            {
                CurrentLine += Space;
            }


            // Check input for backspace
            if (TypedKey(Keys.Back) && CurrentLine != string.Empty)
            {
                CurrentLine = CurrentLine.Remove(CurrentLine.Length - 1, 1);
            }

            // Check input for enter
            if (TypedKey(Keys.Enter))
            {
                PreviousLine = CurrentLine;
                CurrentLine  = string.Empty;
            }
            if (Any())
            {
                Game.UnifiedInput.Hidden = true;
            }
            if (_oskCurrentState == _oskPreviousState)
            {
                return;
            }

            var remove = new List <Procedure <KeyboardInput> >();
            foreach (var keyboardListener in _keyboardListeners)
            {
                try
                {
                    keyboardListener(this);
                }
                catch
                {
                    remove.Add(keyboardListener);
                }
            }
            _keyboardListeners.RemoveAll(remove.Contains);
        }
        public void Update()
        {
            #region reset states

            _oskPreviousState.Clear();
            _oskPreviousState.AddRange(_oskCurrentState);
            _oskCurrentState.Clear();
            foreach (var k in Enum.GetValues(typeof(Keys)))
            {
                if ((Keys)k == Keys.None)
                {
                    continue;
                }
                if (Keyboard.GetState().IsKeyDown((Keys)k) && !_oskCurrentState.Contains((Keys)k))
                {
                    _oskCurrentState.Add((Keys)k);
                }
            }

            #endregion

            Typed.Clear();
            foreach (var t in _keys)
            {
                if (!TypedKey(t))
                {
                    continue;
                }
                var l = t.ToString();
                if (l == "Tab")
                {
                    l = "\t";
                }
                else if (l.Length == 1)
                {
                    //if (Released(Keys.LeftShift) && Released(Keys.RightShift))
                    //    l = l.ToLower();
                    if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift) && IsCapsLock)
                    {
                        l = l.ToUpper();
                    }
                    else if (IsCapsLock)
                    {
                        l = l.ToUpper();
                    }
                    else
                    {
                        l = l.ToLower();
                    }
                }
                else
                {
                    #region Name Numbers

                    if (l.StartsWith(D) & !l.Equals(DecimalStr) &
                        !l.Equals(Divide))
                    {
                        l = l.Substring(1);
                        if (Pressed(Keys.LeftShift) || Pressed(Keys.RightShift))
                        {
                            switch (l)
                            {
                            case Zero:
                            {
                                l = ZeroShift;
                                break;
                            }

                            case One:
                            {
                                l = OneShift;
                                break;
                            }

                            case Two:
                            {
                                l = TwoShift;
                                break;
                            }

                            case Three:
                            {
                                l = ThreeShift;
                                break;
                            }

                            case Four:
                            {
                                l = FourShift;
                                break;
                            }

                            case Five:
                            {
                                l = FiveShift;
                                break;
                            }

                            case Six:
                            {
                                l = SixShift;
                                break;
                            }

                            case Seven:
                            {
                                l = SevenShift;
                                break;
                            }

                            case Eight:
                            {
                                l = EightShift;
                                break;
                            }

                            case Nine:
                            {
                                l = NineShift;
                                break;
                            }
                            }
                        }
                    }

                    #endregion

                    else if (l.StartsWith(NumPad))
                    {
                        l = l.Substring(6);
                    }
                    else
                    {
                        switch (l)
                        {
                        case OemCommaStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemCommaShift
                                    : OemComma;
                            break;
                        }

                        case OemPeriodStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemPeriodShift
                                    : OemPeriod;
                            break;
                        }

                        case OemQuestionStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemQuestionShift
                                    : OemQuestion;
                            break;
                        }

                        case OemSemicolonStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemSemicolonShift
                                    : OemSemicolon;
                            break;
                        }

                        case OemQuotesStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemQuotesShift
                                    : OemQuotes;
                            break;
                        }

                        case OemOpenBracketsStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemOpenBracketsShift
                                    : OemOpenBrackets;
                            break;
                        }

                        case OemCloseBracketsStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemCloseBracketsShift
                                    : OemCloseBrackets;
                            break;
                        }

                        case OemPipeStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemPipeShift
                                    : OemPipe;
                            break;
                        }

                        case OemPlusStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemPlusShift
                                    : OemPlus;
                            break;
                        }

                        case OemMinusStr:
                        {
                            l = Pressed(Keys.LeftShift) || Pressed(Keys.RightShift)
                                    ? OemMinusShift
                                    : OemMinus;
                            break;
                        }

                        case TabStr:
                        {
                            l = Tab;
                            break;
                        }

                        case MultiplyStr:
                        {
                            l = Multiply;
                            break;
                        }

                        case DivideStr:
                        {
                            l = Divide;
                            break;
                        }

                        case SubtractStr:
                        {
                            l = Subtract;
                            break;
                        }

                        case AddStr:
                        {
                            l = Add;
                            break;
                        }

                        case DecimalStr:
                        {
                            l = Dot;
                            break;
                        }
                        }
                    }
                }
                Typed.Add(l);
                CurrentLine += l;
            }

            // Check input for spacebar
            if (TypedKey(Keys.Space) && CurrentLine != string.Empty &&
                CurrentLine[CurrentLine.Length - 1].ToString() != Space)
            {
                CurrentLine += Space;
            }


            // Check input for backspace
            if (TypedKey(Keys.Back) && CurrentLine != string.Empty)
            {
                CurrentLine = CurrentLine.Remove(CurrentLine.Length - 1, 1);
            }

            // Check input for enter
            if (TypedKey(Keys.Enter))
            {
                PreviousLine = CurrentLine;
                CurrentLine  = string.Empty;
                Typed.Add("\n");
            }
            if (_oskCurrentState == _oskPreviousState)
            {
                return;
            }

            var remove = new List <Action <KeyboardInput> >();
            foreach (var keyboardListener in _keyboardListeners)
            {
                try
                {
                    keyboardListener(this);
                }
                catch
                {
                    remove.Add(keyboardListener);
                }
            }
            _keyboardListeners.RemoveAll(remove.Contains);
        }