Пример #1
0
        public static bool OnRightMouseDoubleClick()
        {
            if (MouseOverControl != null && IsMouseOverAControl)
                return MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButtonType.Right);

            return false;
        }
Пример #2
0
        public static void OnLeftMouseButtonDown()
        {
            HandleMouseInput();
            _validForDClick = null;
            if (MouseOverControl != null)
            {
                MakeTopMostGump(MouseOverControl);
                MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButton.Left);

                if (MouseOverControl.AcceptKeyboardInput)
                {
                    _keyboardFocusControl = MouseOverControl;
                }
                _mouseDownControls[(int)MouseButton.Left] = MouseOverControl;
            }
            else
            {
                if (IsModalControlOpen)
                {
                    foreach (Control s in Gumps)
                    {
                        if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                        {
                            s.Dispose();
                            Mouse.CancelDoubleClick = true;
                        }
                    }
                }
            }
        }
Пример #3
0
        public static void OnLeftMouseButtonUp()
        {
            HandleMouseInput();

            const int btn = (int)MouseButton.Left;

            EndDragControl(Mouse.Position);

            if (MouseOverControl != null)
            {
                if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                {
                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButton.Left);
                }

                if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                {
                    _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButton.Left);
                }
            }
            else
            {
                _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, MouseButton.Left);
            }

            CloseIfClickOutGumps();
            _mouseDownControls[btn] = null;
            _validForDClick         = MouseOverControl;
        }
Пример #4
0
        public static void OnRightMouseButtonUp()
        {
            HandleMouseInput();

            const int btn = (int)MouseButtonType.Right;

            EndDragControl(Mouse.Position);

            if (MouseOverControl != null)
            {
                if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                {
                    MouseOverControl.InvokeMouseCloseGumpWithRClick();
                }

                MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButtonType.Right);

                if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                {
                    _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButtonType.Right);
                    _mouseDownControls[btn].InvokeMouseCloseGumpWithRClick();
                }
            }
            else if (_mouseDownControls[btn] != null)
            {
                _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButtonType.Right);
                _mouseDownControls[btn].InvokeMouseCloseGumpWithRClick();
            }

            _mouseDownControls[btn] = null;
        }
Пример #5
0
        public static void OnRightMouseButtonDown()
        {
            HandleMouseInput();

            if (MouseOverControl != null)
            {
                MakeTopMostGump(MouseOverControl);
                MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButtonType.Right);

                if (MouseOverControl.AcceptKeyboardInput)
                {
                    _keyboardFocusControl = MouseOverControl;
                }
                _mouseDownControls[(int)MouseButtonType.Right] = MouseOverControl;
            }
            else
            {
                foreach (Control s in Gumps)
                {
                    if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                    {
                        s.Dispose();
                        Mouse.CancelDoubleClick = true;
                    }
                }
            }

            ShowGamePopup(null);
        }
Пример #6
0
        public static void OnMiddleMouseButtonUp()
        {
            HandleMouseInput();

            const int btn = (int)MouseButtonType.Middle;

            EndDragControl(Mouse.Position);

            if (MouseOverControl != null)
            {
                if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                {
                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButtonType.Middle);
                }

                if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                {
                    _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButtonType.Middle);
                }
            }
            else
            {
                _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, MouseButtonType.Middle);
            }

            _mouseDownControls[btn] = null;
            _validForDClick         = MouseOverControl;
        }
Пример #7
0
        public static void OnExtraMouseButtonDown(int btn)
        {
            HandleMouseInput();
            if (MouseOverControl != null)
            {
                MakeTopMostGump(MouseOverControl);
                MouseOverControl.InvokeMouseDown(Mouse.Position, (MouseButtonType)btn);

                if (MouseOverControl.IsEnabled && MouseOverControl.IsVisible)
                {
                    if (_lastFocus != MouseOverControl)
                    {
                        _lastFocus?.OnFocusLeft();
                        MouseOverControl.OnFocusEnter();
                        _lastFocus = MouseOverControl;
                    }
                }

                _mouseDownControls[btn] = MouseOverControl;
            }
            else
            {
                foreach (Control s in Gumps)
                {
                    if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                    {
                        s.Dispose();
                        Mouse.CancelDoubleClick = true;
                    }
                }
            }

            ShowGamePopup(null);
        }
Пример #8
0
 public static void OnMouseWheel(bool isup)
 {
     if (MouseOverControl != null && MouseOverControl.AcceptMouseInput)
     {
         MouseOverControl.InvokeMouseWheel(isup ? MouseEventType.WheelScrollUp : MouseEventType.WheelScrollDown);
     }
 }
Пример #9
0
        public static void OnLeftMouseButtonUp()
        {
            HandleMouseInput();

            const int btn = (int)MouseButtonType.Left;

            EndDragControl(Mouse.Position);

            if (MouseOverControl != null)
            {
                if ((_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn]) || ItemHold.Enabled)
                {
                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButtonType.Left);
                }
                else if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                {
                    _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButtonType.Left);
                }
            }
            else
            {
                _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, MouseButtonType.Left);
            }

            _mouseDownControls[btn] = null;
            _validForDClick         = MouseOverControl;
        }
Пример #10
0
        public static bool OnMiddleMouseDoubleClick()
        {
            if (MouseOverControl != null && IsMouseOverAControl)
            {
                return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButtonType.Middle));
            }

            return(false);
        }
Пример #11
0
        public static bool OnRightMouseDoubleClick()
        {
            if (MouseOverControl != null && IsMouseOverAControl)
            {
                return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Right));
            }

            return(false);
        }
Пример #12
0
        private void HandleMouseInput()
        {
            Point   position = Mouse.Position;
            Control gump     = GetMouseOverControl(position);

            if (MouseOverControl != null && gump != MouseOverControl)
            {
                MouseOverControl.InvokeMouseExit(position);

                if (MouseOverControl.RootParent != null)
                {
                    if (gump == null || gump.RootParent != MouseOverControl.RootParent)
                    {
                        MouseOverControl.RootParent.InvokeMouseExit(position);
                    }
                }
            }

            if (gump != null)
            {
                if (gump != MouseOverControl)
                {
                    gump.InvokeMouseEnter(position);

                    if (gump?.RootParent != null)
                    {
                        if (MouseOverControl == null || gump.RootParent != MouseOverControl.RootParent)
                        {
                            gump.RootParent.InvokeMouseEnter(position);
                        }
                    }
                }

                gump.InvokeMouseOver(position);


                if (_mouseDownControls[0] == gump)
                {
                    AttemptDragControl(gump, position);
                }

                //if (_isDraggingControl)
                //    DoDragControl(position);
            }

            MouseOverControl = gump;

            for (int i = 0; i < 5; i++)
            {
                if (_mouseDownControls[i] != null && _mouseDownControls[i] != gump)
                {
                    _mouseDownControls[i].InvokeMouseOver(position);
                }
            }
        }
Пример #13
0
        public static bool OnLeftMouseDoubleClick()
        {
            HandleMouseInput();

            if (MouseOverControl != null && IsMouseOverAControl)
            {
                return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Left));
            }

            return(false);
        }
Пример #14
0
        private static void HandleMouseInput()
        {
            Control gump = GetMouseOverControl(Mouse.Position);

            if (MouseOverControl != null && gump != MouseOverControl)
            {
                MouseOverControl.InvokeMouseExit(Mouse.Position);

                if (MouseOverControl.RootParent != null)
                {
                    if (gump == null || gump.RootParent != MouseOverControl.RootParent)
                    {
                        MouseOverControl.RootParent.InvokeMouseExit(Mouse.Position);
                    }
                }
            }

            if (gump != null)
            {
                if (gump != MouseOverControl)
                {
                    gump.InvokeMouseEnter(Mouse.Position);

                    if (gump.RootParent != null)
                    {
                        if (MouseOverControl == null || gump.RootParent != MouseOverControl.RootParent)
                        {
                            gump.RootParent.InvokeMouseEnter(Mouse.Position);
                        }
                    }
                }

                gump.InvokeMouseOver(Mouse.Position);

                //if (_mouseDownControls[0] == gump)
                //{
                //    if (ProfileManager.Current == null || !ProfileManager.Current.HoldAltToMoveGumps || Keyboard.Alt)
                //    {
                //        AttemptDragControl(gump, Mouse.Position);
                //    }
                //}
            }

            MouseOverControl = gump;

            for (int i = 0; i < 5; i++)
            {
                if (_mouseDownControls[i] != null && _mouseDownControls[i] != gump)
                {
                    _mouseDownControls[i].InvokeMouseOver(Mouse.Position);
                }
            }
        }
Пример #15
0
        public static bool OnLeftMouseDoubleClick()
        {
            HandleMouseInput();

            if (MouseOverControl != null && IsMouseOverAControl)
            {
                if (MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButtonType.Left))
                {
                    DelayedObjectClickManager.Clear();
                    return(true);
                }
            }

            return(false);
        }
Пример #16
0
        private static void HandleMouseInput()
        {
            Control gump = GetMouseOverControl(Mouse.Position);

            if (MouseOverControl != null && gump != MouseOverControl)
            {
                MouseOverControl.InvokeMouseExit(Mouse.Position);

                if (MouseOverControl.RootParent != null)
                {
                    if (gump == null || gump.RootParent != MouseOverControl.RootParent)
                    {
                        MouseOverControl.RootParent.InvokeMouseExit(Mouse.Position);
                    }
                }
            }

            if (gump != null)
            {
                if (gump != MouseOverControl)
                {
                    gump.InvokeMouseEnter(Mouse.Position);

                    if (gump.RootParent != null)
                    {
                        if (MouseOverControl == null || gump.RootParent != MouseOverControl.RootParent)
                        {
                            gump.RootParent.InvokeMouseEnter(Mouse.Position);
                        }
                    }
                }

                gump.InvokeMouseOver(Mouse.Position);
            }

            MouseOverControl = gump;

            for (int i = 0; i < 5; i++)
            {
                if (_mouseDownControls[i] != null && _mouseDownControls[i] != gump)
                {
                    _mouseDownControls[i].InvokeMouseOver(Mouse.Position);
                }
            }
        }
Пример #17
0
        public static void OnExtraMouseButtonUp(int btn)
        {
            HandleMouseInput();
            EndDragControl(Mouse.Position);

            if (MouseOverControl != null)
            {
                if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                    MouseOverControl.InvokeMouseUp(Mouse.Position, (MouseButtonType)btn);

                if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                    _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, (MouseButtonType)btn);
            }
            else
                _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, (MouseButtonType)btn);

            _mouseDownControls[btn] = null;
            _validForDClick = MouseOverControl;
        }
Пример #18
0
        public static void OnLeftMouseButtonDown()
        {
            HandleMouseInput();
            _validForDClick = null;
            if (MouseOverControl != null)
            {
                MakeTopMostGump(MouseOverControl);
                MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButtonType.Left);

                if (MouseOverControl.AcceptKeyboardInput)
                {
                    _keyboardFocusControl = MouseOverControl;
                }

                if (MouseOverControl.IsEnabled && MouseOverControl.IsVisible)
                {
                    if (_lastFocus != MouseOverControl)
                    {
                        _lastFocus?.OnFocusLeft();
                        MouseOverControl.OnFocusEnter();
                        _lastFocus = MouseOverControl;
                    }
                }

                _mouseDownControls[(int)MouseButtonType.Left] = MouseOverControl;
            }
            else
            {
                foreach (Control s in Gumps)
                {
                    if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                    {
                        s.Dispose();
                        Mouse.CancelDoubleClick = true;
                    }
                }
            }

            if (PopupMenu != null && !PopupMenu.Bounds.Contains(Mouse.Position.X, Mouse.Position.Y))
            {
                ShowGamePopup(null);
            }
        }
Пример #19
0
        public UIManager()
        {
            GameCursor   = new GameCursor(this);
            _sbUI        = Service.Get <SpriteBatchUI>();
            InputManager = Service.Get <InputManager>();

            InputManager.MouseDragging += (sender, e) =>
            {
                if (_isDraggingControl)
                {
                    DoDragControl(Mouse.Position);
                }
            };

            InputManager.LeftMouseButtonDown += (sender, e) =>
            {
                if (!IsModalControlOpen && ObjectsBlockingInputExists)
                {
                    return;
                }

                if (MouseOverControl != null)
                {
                    MakeTopMostGump(MouseOverControl);
                    MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButton.Left);

                    if (MouseOverControl.AcceptKeyboardInput)
                    {
                        _keyboardFocusControl = MouseOverControl;
                    }
                    _mouseDownControls[(int)MouseButton.Left] = MouseOverControl;
                }
                else
                {
                    if (IsModalControlOpen)
                    {
                        _gumps.ForEach(s =>
                        {
                            if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                            {
                                s.Dispose();
                            }
                        });
                    }
                }
            };

            InputManager.LeftMouseButtonUp += (sender, e) =>
            {
                if (!IsModalControlOpen && ObjectsBlockingInputExists)
                {
                    return;
                }

                //if (MouseOverControl == null)
                //    return;
                const int btn = (int)MouseButton.Left;
                EndDragControl(Mouse.Position);

                if (MouseOverControl != null)
                {
                    if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                    {
                        MouseOverControl.InvokeMouseClick(Mouse.Position, MouseButton.Left);
                    }
                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButton.Left);

                    if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                    {
                        _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButton.Left);
                    }
                }
                else
                {
                    _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, MouseButton.Left);
                }

                _mouseDownControls[btn] = null;
            };

            InputManager.LeftMouseDoubleClick += () =>
            {
                if (!IsModalControlOpen && ObjectsBlockingInputExists)
                {
                    return(false);
                }
                if (MouseOverControl != null && IsMouseOverUI)
                {
                    return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Left));
                }

                return(false);
            };

            InputManager.RightMouseButtonDown += (sender, e) =>
            {
                if (!IsModalControlOpen && ObjectsBlockingInputExists)
                {
                    return;
                }

                if (MouseOverControl != null)
                {
                    MakeTopMostGump(MouseOverControl);
                    MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButton.Right);

                    if (MouseOverControl.AcceptKeyboardInput)
                    {
                        _keyboardFocusControl = MouseOverControl;
                    }
                    _mouseDownControls[(int)MouseButton.Right] = MouseOverControl;
                }
                else
                {
                    if (IsModalControlOpen)
                    {
                        _gumps.ForEach(s =>
                        {
                            if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                            {
                                s.Dispose();
                            }
                        });
                    }
                }
            };

            InputManager.RightMouseButtonUp += (sender, e) =>
            {
                if (!IsModalControlOpen && ObjectsBlockingInputExists)
                {
                    return;
                }

                //if (MouseOverControl == null)
                //    return;
                const int btn = (int)MouseButton.Right;
                EndDragControl(Mouse.Position);

                if (MouseOverControl != null)
                {
                    if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                    {
                        MouseOverControl.InvokeMouseClick(Mouse.Position, MouseButton.Right);
                    }
                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButton.Right);

                    if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                    {
                        _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButton.Right);
                    }
                }
                else
                {
                    _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, MouseButton.Right);
                }

                _mouseDownControls[btn] = null;
            };

            InputManager.MouseWheel += (sender, isup) =>
            {
                if (!IsModalControlOpen && ObjectsBlockingInputExists)
                {
                    return;
                }

                if (MouseOverControl != null && MouseOverControl.AcceptMouseInput)
                {
                    MouseOverControl.InvokeMouseWheel(isup ? MouseEvent.WheelScrollUp : MouseEvent.WheelScrollDown);
                }
            };
            InputManager.KeyDown   += (sender, e) => { _keyboardFocusControl?.InvokeKeyDown(e.keysym.sym, e.keysym.mod); };
            InputManager.KeyUp     += (sender, e) => { _keyboardFocusControl?.InvokeKeyUp(e.keysym.sym, e.keysym.mod); };
            InputManager.TextInput += (sender, e) => { _keyboardFocusControl?.InvokeTextInput(e); };
        }
Пример #20
0
        private void InternalHandleMouseInput()
        {
            // Get the topmost control that is under the mouse and handles mouse input.
            // If this control is different from the previously focused control,
            // send that previous control a MouseOut event.
            AControl focusedControl = InternalGetMouseOverControl();

            if ((MouseOverControl != null) && (focusedControl != MouseOverControl))
            {
                MouseOverControl.MouseOut(Engine.Input.MousePosition);
            }
            if (focusedControl != null)
            {
                focusedControl.MouseOver(Engine.Input.MousePosition);
            }

            // Set the new MouseOverControl.
            m_MouseOverControl = focusedControl;

            // Send a MouseOver event to any control that was previously the target of a MouseDown event.
            for (int iButton = 0; iButton < 5; iButton++)
            {
                if ((m_MouseDownControl[iButton] != null) && (m_MouseDownControl[iButton] != focusedControl))
                {
                    m_MouseDownControl[iButton].MouseOver(Engine.Input.MousePosition);
                }
            }

            // The cursor and world input objects occasionally must block input events from reaching the UI:
            // e.g. when the cursor is carrying an object.
            if (!IsModalControlOpen && ObjectsBlockingInput)
            {
                return;
            }

            List <InputEventMouse> events = Engine.Input.GetMouseEvents();

            foreach (InputEventMouse e in events)
            {
                // MouseDown event: the currently focused control gets a MouseDown event, and if
                // it handles Keyboard input, gets Keyboard focus as well.
                if (e.EventType == MouseEvent.Down)
                {
                    if (focusedControl != null)
                    {
                        focusedControl.MouseDown(Engine.Input.MousePosition, e.Button);
                        if (focusedControl.HandlesKeyboardFocus)
                        {
                            m_keyboardFocusControl = focusedControl;
                        }
                        m_MouseDownControl[(int)e.Button] = focusedControl;
                    }
                }

                // MouseUp and MouseClick events
                if (e.EventType == MouseEvent.Up)
                {
                    int btn = (int)e.Button;

                    // If there is a currently focused control:
                    // 1.   If the currently focused control is the same control that was MouseDowned on with this button,
                    //      then send that control a MouseClick event.
                    // 2.   Send the currently focused control a MouseUp event.
                    // 3.   If the currently focused control is NOT the same control that was MouseDowned on with this button,
                    //      send that MouseDowned control a MouseUp event (but it does not receive MouseClick).
                    // If there is NOT a currently focused control, then simply inform the control that was MouseDowned on
                    // with this button that the button has been released, by sending it a MouseUp event.

                    if (focusedControl != null)
                    {
                        if (m_MouseDownControl[btn] != null && focusedControl == m_MouseDownControl[btn])
                        {
                            focusedControl.MouseClick(Engine.Input.MousePosition, e.Button);
                        }
                        focusedControl.MouseUp(Engine.Input.MousePosition, e.Button);
                        if (m_MouseDownControl[btn] != null && focusedControl != m_MouseDownControl[btn])
                        {
                            m_MouseDownControl[btn].MouseUp(Engine.Input.MousePosition, e.Button);
                        }
                    }
                    else
                    {
                        if (m_MouseDownControl[btn] != null)
                        {
                            m_MouseDownControl[btn].MouseUp(Engine.Input.MousePosition, e.Button);
                        }
                    }

                    m_MouseDownControl[btn] = null;
                }
            }
        }
Пример #21
0
        public UIManager()
        {
            AnchorManager = new AnchorManager();

            Engine.Input.MouseDragging += (sender, e) =>
            {
                HandleMouseInput();

                if (_mouseDownControls[0] == MouseOverControl && MouseOverControl != null)
                {
                    AttemptDragControl(MouseOverControl, Mouse.Position, true);
                }

                if (_isDraggingControl)
                {
                    DoDragControl(Mouse.Position);
                }
            };

            Engine.Input.LeftMouseButtonDown += (sender, e) =>
            {
                //if (!IsModalControlOpen /*&& ObjectsBlockingInputExists*/)
                //    return;

                HandleMouseInput();

                if (MouseOverControl != null)
                {
                    MakeTopMostGump(MouseOverControl);
                    MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButton.Left);

                    if (MouseOverControl.AcceptKeyboardInput)
                    {
                        _keyboardFocusControl = MouseOverControl;
                    }
                    _mouseDownControls[(int)MouseButton.Left] = MouseOverControl;
                }
                else
                {
                    if (IsModalControlOpen)
                    {
                        foreach (Control s in Gumps)
                        {
                            if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                            {
                                s.Dispose();
                            }
                        }
                    }
                }
            };

            Control lastLeftUp = null, lastRightUp = null;

            Engine.Input.LeftMouseButtonUp += (sender, e) =>
            {
                //if (!IsModalControlOpen && ObjectsBlockingInputExists)
                //    return;

                //if (MouseOverControl == null)
                //    return;

                const int btn = (int)MouseButton.Left;
                EndDragControl(Mouse.Position);

                if (MouseOverControl != null)
                {
                    //if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                    //    MouseOverControl.InvokeMouseClick(Mouse.Position, MouseButton.Left);

                    //if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButton.Left);

                    if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                    {
                        _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButton.Left);
                    }

                    lastLeftUp = MouseOverControl;
                }
                else
                {
                    _mouseDownControls[btn]?.InvokeMouseUp(Mouse.Position, MouseButton.Left);
                }

                CloseIfClickOutGumps();
                _mouseDownControls[btn] = null;
            };

            Engine.Input.LeftMouseDoubleClick += (sender, e) =>
            {
                if (MouseOverControl != null && IsMouseOverAControl && MouseOverControl == lastLeftUp)
                {
                    e.Result = MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Left);
                }
            };

            Engine.Input.RightMouseButtonDown += (sender, e) =>
            {
                //if (!IsModalControlOpen && ObjectsBlockingInputExists)
                //    return;

                if (MouseOverControl != null)
                {
                    MakeTopMostGump(MouseOverControl);
                    MouseOverControl.InvokeMouseDown(Mouse.Position, MouseButton.Right);

                    if (MouseOverControl.AcceptKeyboardInput)
                    {
                        _keyboardFocusControl = MouseOverControl;
                    }
                    _mouseDownControls[(int)MouseButton.Right] = MouseOverControl;
                }
                else
                {
                    if (IsModalControlOpen)
                    {
                        foreach (Control s in Gumps)
                        {
                            if (s.ControlInfo.IsModal && s.ControlInfo.ModalClickOutsideAreaClosesThisControl)
                            {
                                s.Dispose();
                            }
                        }
                    }
                }

                CloseIfClickOutGumps();
            };

            Engine.Input.RightMouseButtonUp += (sender, e) =>
            {
                //if (!IsModalControlOpen /*&& ObjectsBlockingInputExists*/)
                //    return;

                //if (MouseOverControl == null)
                //    return;
                const int btn = (int)MouseButton.Right;
                EndDragControl(Mouse.Position);

                if (MouseOverControl != null)
                {
                    if (_mouseDownControls[btn] != null && MouseOverControl == _mouseDownControls[btn])
                    {
                        //MouseOverControl.InvokeMouseClick(Mouse.Position, MouseButton.Right);
                        MouseOverControl.InvokeMouseCloseGumpWithRClick();
                    }

                    MouseOverControl.InvokeMouseUp(Mouse.Position, MouseButton.Right);

                    if (_mouseDownControls[btn] != null && MouseOverControl != _mouseDownControls[btn])
                    {
                        _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButton.Right);
                        _mouseDownControls[btn].InvokeMouseCloseGumpWithRClick();
                    }


                    lastRightUp = MouseOverControl;
                }
                else if (_mouseDownControls[btn] != null)
                {
                    _mouseDownControls[btn].InvokeMouseUp(Mouse.Position, MouseButton.Right);
                    _mouseDownControls[btn].InvokeMouseCloseGumpWithRClick();
                }

                CloseIfClickOutGumps();
                _mouseDownControls[btn] = null;
            };

            Engine.Input.RightMouseDoubleClick += (sender, e) =>
            {
                if (MouseOverControl != null && IsMouseOverAControl && MouseOverControl == lastRightUp)
                {
                    e.Result = MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Right);
                }
            };

            Engine.Input.MouseWheel += (sender, isup) =>
            {
                //if (!IsModalControlOpen /*&& ObjectsBlockingInputExists*/)
                //    return;

                if (MouseOverControl != null && MouseOverControl.AcceptMouseInput)
                {
                    MouseOverControl.InvokeMouseWheel(isup ? MouseEvent.WheelScrollUp : MouseEvent.WheelScrollDown);
                }
            };
            Engine.Input.KeyDown   += (sender, e) => { _keyboardFocusControl?.InvokeKeyDown(e.keysym.sym, e.keysym.mod); };
            Engine.Input.KeyUp     += (sender, e) => { _keyboardFocusControl?.InvokeKeyUp(e.keysym.sym, e.keysym.mod); };
            Engine.Input.TextInput += (sender, e) => { _keyboardFocusControl?.InvokeTextInput(e); };
        }
Пример #22
0
        private void InternalHandleMouseInput()
        {
            // clip the mouse position
            Point clippedPosition = m_Input.MousePosition;

            ClipMouse(ref clippedPosition);

            // Get the topmost control that is under the mouse and handles mouse input.
            // If this control is different from the previously focused control,
            // send that previous control a MouseOut event.
            AControl focusedControl = InternalGetMouseOverControl(clippedPosition);

            if ((MouseOverControl != null) && (focusedControl != MouseOverControl))
            {
                MouseOverControl.MouseOut(clippedPosition);
                // Also let the parent control know we've been moused out (for gumps).
                if (MouseOverControl.RootParent != null)
                {
                    if (focusedControl == null || MouseOverControl.RootParent != focusedControl.RootParent)
                    {
                        MouseOverControl.RootParent.MouseOut(clippedPosition);
                    }
                }
            }

            if (focusedControl != null)
            {
                focusedControl.MouseOver(clippedPosition);
                if (m_MouseDownControl[0] == focusedControl)
                {
                    AttemptDragControl(focusedControl, clippedPosition);
                }
                if (IsDraggingControl)
                {
                    DoDragControl(clippedPosition);
                }
            }

            // Set the new MouseOverControl.
            m_MouseOverControl = focusedControl;

            // Send a MouseOver event to any control that was previously the target of a MouseDown event.
            for (int iButton = 0; iButton < 5; iButton++)
            {
                if ((m_MouseDownControl[iButton] != null) && (m_MouseDownControl[iButton] != focusedControl))
                {
                    m_MouseDownControl[iButton].MouseOver(clippedPosition);
                }
            }

            // The cursor and world input objects occasionally must block input events from reaching the UI:
            // e.g. when the cursor is carrying an object.
            if ((IsModalControlOpen == false) && (ObjectsBlockingInput == true))
            {
                return;
            }

            List <InputEventMouse> events = m_Input.GetMouseEvents();

            foreach (InputEventMouse e in events)
            {
                // MouseDown event: the currently focused control gets a MouseDown event, and if
                // it handles Keyboard input, gets Keyboard focus as well.
                if (e.EventType == MouseEvent.Down)
                {
                    if (focusedControl != null)
                    {
                        MakeTopMostGump(focusedControl);
                        focusedControl.MouseDown(clippedPosition, e.Button);
                        if (focusedControl.HandlesKeyboardFocus)
                        {
                            m_keyboardFocusControl = focusedControl;
                        }
                        m_MouseDownControl[(int)e.Button] = focusedControl;
                    }
                    else
                    {
                        // close modal controls if they can be closed with a mouse down outside their drawn area
                        if (IsModalControlOpen)
                        {
                            foreach (AControl c in m_Controls)
                            {
                                if (c.MetaData.IsModal && c.MetaData.ModalClickOutsideAreaClosesThisControl)
                                {
                                    c.Dispose();
                                }
                            }
                        }
                    }
                }

                // MouseUp and MouseClick events
                if (e.EventType == MouseEvent.Up)
                {
                    int btn = (int)e.Button;

                    // If there is a currently focused control:
                    // 1.   If the currently focused control is the same control that was MouseDowned on with this button,
                    //      then send that control a MouseClick event.
                    // 2.   Send the currently focused control a MouseUp event.
                    // 3.   If the currently focused control is NOT the same control that was MouseDowned on with this button,
                    //      send that MouseDowned control a MouseUp event (but it does not receive MouseClick).
                    // If there is NOT a currently focused control, then simply inform the control that was MouseDowned on
                    // with this button that the button has been released, by sending it a MouseUp event.

                    EndDragControl(e.Position);

                    if (focusedControl != null)
                    {
                        if (m_MouseDownControl[btn] != null && focusedControl == m_MouseDownControl[btn])
                        {
                            focusedControl.MouseClick(clippedPosition, e.Button);
                        }
                        focusedControl.MouseUp(clippedPosition, e.Button);
                        if (m_MouseDownControl[btn] != null && focusedControl != m_MouseDownControl[btn])
                        {
                            m_MouseDownControl[btn].MouseUp(clippedPosition, e.Button);
                        }
                    }
                    else
                    {
                        if (m_MouseDownControl[btn] != null)
                        {
                            m_MouseDownControl[btn].MouseUp(clippedPosition, e.Button);
                        }
                    }

                    m_MouseDownControl[btn] = null;
                }
            }
        }