示例#1
0
文件: Desktop.cs 项目: NimbusFox/Myra
        public void UpdateInput()
        {
            if (MouseInfoGetter != null)
            {
                var mouseInfo = MouseInfoGetter();
                MousePosition = mouseInfo.Position;

                if (SpriteBatchBeginParams.TransformMatrix != null)
                {
                    // Apply transform
                    var t = Vector2.Transform(
                        new Vector2(MousePosition.X, MousePosition.Y),
                        SpriteBatchBeginParams.InverseTransform);

                    MousePosition = new Point((int)t.X, (int)t.Y);
                }

                if (MousePosition.X != LastMousePosition.X ||
                    MousePosition.Y != LastMousePosition.Y)
                {
                    var ev = MouseMoved;
                    if (ev != null)
                    {
                        ev(this, EventArgs.Empty);
                    }

                    for (var i = ChildrenCopy.Count - 1; i >= 0; --i)
                    {
                        var w = ChildrenCopy[i];
                        if (w.Visible && w.Enabled)
                        {
                            var asWindow = w as Window;
                            if (w.HandleMouseMovement() || (asWindow != null && asWindow.IsModal))
                            {
                                break;
                            }
                        }
                    }
                }

                HandleButton(mouseInfo.IsLeftButtonDown, _lastMouseInfo.IsLeftButtonDown, MouseButtons.Left);
                HandleButton(mouseInfo.IsMiddleButtonDown, _lastMouseInfo.IsMiddleButtonDown, MouseButtons.Middle);
                HandleButton(mouseInfo.IsRightButtonDown, _lastMouseInfo.IsRightButtonDown, MouseButtons.Right);

#if XENKO
                var handleWheel = mouseInfo.Wheel != 0;
#else
                var handleWheel = mouseInfo.Wheel != _lastMouseInfo.Wheel;
#endif

                if (handleWheel)
                {
                    var delta = mouseInfo.Wheel;
#if !XENKO
                    delta -= _lastMouseInfo.Wheel;
#endif

                    var ev = MouseWheelChanged;
                    if (ev != null)
                    {
                        ev(null, new GenericEventArgs <float>(delta));
                    }

                    if (_focusedWidget != null)
                    {
                        _focusedWidget.IterateFocusable(w => w.OnMouseWheel(delta));
                    }
                }

                _lastMouseInfo = mouseInfo;
            }

            if (DownKeysGetter != null)
            {
                _downKeys = DownKeysGetter();

                if (_downKeys != null)
                {
                    MyraEnvironment.ShowUnderscores = (MenuBar != null && MenuBar.OpenMenuItem != null) ||
                                                      _downKeys.Contains(Keys.LeftAlt) ||
                                                      _downKeys.Contains(Keys.RightAlt);

                    if (_lastDownKeys != null)
                    {
                        foreach (var key in _downKeys)
                        {
                            if (!_lastDownKeys.Contains(key))
                            {
                                if (KeyDownHandler != null)
                                {
                                    KeyDownHandler(key);
                                }
                            }
                        }

                        foreach (var key in _lastDownKeys)
                        {
                            if (!_downKeys.Contains(key))
                            {
                                // Key had been released
                                var ev = KeyUp;
                                if (ev != null)
                                {
                                    ev(this, new GenericEventArgs <Keys>(key));
                                }

                                if (_focusedWidget != null)
                                {
                                    _focusedWidget.IterateFocusable(w => w.OnKeyUp(key));
                                }
                            }
                        }
                    }
                }

                _lastDownKeys = _downKeys.ToArray();
            }
        }
示例#2
0
        public void UpdateInput()
        {
            if (MouseInfoGetter != null)
            {
                var mouseInfo     = MouseInfoGetter();
                var mousePosition = mouseInfo.Position;

                if (SpriteBatchBeginParams.TransformMatrix != null)
                {
                    // Apply transform
                    var t = Vector2.Transform(
                        new Vector2(mousePosition.X, mousePosition.Y),
                        SpriteBatchBeginParams.InverseTransform);

                    mousePosition = new Point((int)t.X, (int)t.Y);
                }

                MousePosition = mousePosition;

                HandleButton(mouseInfo.IsLeftButtonDown, _lastMouseInfo.IsLeftButtonDown, MouseButtons.Left);
                HandleButton(mouseInfo.IsMiddleButtonDown, _lastMouseInfo.IsMiddleButtonDown, MouseButtons.Middle);
                HandleButton(mouseInfo.IsRightButtonDown, _lastMouseInfo.IsRightButtonDown, MouseButtons.Right);
#if XENKO
                var handleWheel = mouseInfo.Wheel != 0;
#else
                var handleWheel = mouseInfo.Wheel != _lastMouseInfo.Wheel;
#endif

                if (handleWheel)
                {
                    var delta = mouseInfo.Wheel;
#if !XENKO
                    delta -= _lastMouseInfo.Wheel;
#endif
                    MouseWheelChanged.Invoke(this, delta);

                    if (FocusedMouseWheelWidget != null)
                    {
                        FocusedMouseWheelWidget.OnMouseWheel(delta);
                    }
                }

                _lastMouseInfo = mouseInfo;
            }

            if (DownKeysGetter != null)
            {
                _downKeys = DownKeysGetter();

                if (_downKeys != null && _lastDownKeys != null)
                {
                    var now = DateTime.Now;
                    foreach (var key in _downKeys)
                    {
                        if (!_lastDownKeys.Contains(key))
                        {
                            KeyDownHandler?.Invoke(key);

                            _lastKeyDown  = now;
                            _keyDownCount = 0;
                        }
                    }

                    foreach (var key in _lastDownKeys)
                    {
                        if (!_downKeys.Contains(key))
                        {
                            // Key had been released
                            KeyUp.Invoke(this, key);
                            if (_focusedKeyboardWidget != null && _focusedKeyboardWidget.Active)
                            {
                                _focusedKeyboardWidget.OnKeyUp(key);
                            }

                            _lastKeyDown  = null;
                            _keyDownCount = 0;
                        }
                        else if (_lastKeyDown != null &&
                                 ((_keyDownCount == 0 && (now - _lastKeyDown.Value).TotalMilliseconds > RepeatKeyDownStartInMs) ||
                                  (_keyDownCount > 0 && (now - _lastKeyDown.Value).TotalMilliseconds > RepeatKeyDownInternalInMs)))
                        {
                            KeyDownHandler?.Invoke(key);

                            _lastKeyDown = now;
                            ++_keyDownCount;
                        }
                    }
                }

                _lastDownKeys = _downKeys.ToArray();
            }

#if !XENKO
            try
            {
                UpdateTouch();
            }
            catch (Exception)
            {
            }
#endif
        }