public static bool OnRightMouseDoubleClick() { if (MouseOverControl != null && IsMouseOverAControl) return MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButtonType.Right); return false; }
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; } } } } }
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; }
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; }
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); }
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; }
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); }
public static void OnMouseWheel(bool isup) { if (MouseOverControl != null && MouseOverControl.AcceptMouseInput) { MouseOverControl.InvokeMouseWheel(isup ? MouseEventType.WheelScrollUp : MouseEventType.WheelScrollDown); } }
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; }
public static bool OnMiddleMouseDoubleClick() { if (MouseOverControl != null && IsMouseOverAControl) { return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButtonType.Middle)); } return(false); }
public static bool OnRightMouseDoubleClick() { if (MouseOverControl != null && IsMouseOverAControl) { return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Right)); } return(false); }
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); } } }
public static bool OnLeftMouseDoubleClick() { HandleMouseInput(); if (MouseOverControl != null && IsMouseOverAControl) { return(MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButton.Left)); } return(false); }
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); } } }
public static bool OnLeftMouseDoubleClick() { HandleMouseInput(); if (MouseOverControl != null && IsMouseOverAControl) { if (MouseOverControl.InvokeMouseDoubleClick(Mouse.Position, MouseButtonType.Left)) { DelayedObjectClickManager.Clear(); return(true); } } return(false); }
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); } } }
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; }
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); } }
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); }; }
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; } } }
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); }; }
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; } } }