/// <summary> /// Mouse click handler. /// </summary> /// <param name="canvas">Canvas.</param> /// <param name="mouseButton">Mouse button number.</param> /// <param name="down">Specifies if the button is down.</param> /// <returns>True if handled.</returns> public bool OnMouseClicked(Base canvas, int mouseButton, bool down) { // If we click on a control that isn't a menu we want to close // all the open menus. Menus are children of the canvas. if (down && (null == HoveredControl || !HoveredControl.IsMenuComponent)) { canvas.CloseMenus(); } if (null == HoveredControl) return false; if (HoveredControl.GetCanvas() != canvas) return false; if (!HoveredControl.IsVisible) return false; if (HoveredControl == canvas) return false; if (mouseButton > MaxMouseButtons) return false; if (mouseButton == 0) m_KeyData.LeftMouseDown = down; else if (mouseButton == 1) m_KeyData.RightMouseDown = down; // Double click. // Todo: Shouldn't double click if mouse has moved significantly bool isDoubleClick = false; if (down && m_LastClickPos.X == MousePosition.X && m_LastClickPos.Y == MousePosition.Y && (Platform.Neutral.GetTimeInSeconds() - m_LastClickTime[mouseButton]) < DoubleClickSpeed) { isDoubleClick = true; } if (down && !isDoubleClick) { m_LastClickTime[mouseButton] = Platform.Neutral.GetTimeInSeconds(); m_LastClickPos = MousePosition; } if (down) { FindKeyboardFocus(HoveredControl); } HoveredControl.UpdateCursor(); // This tells the child it has been touched, which // in turn tells its parents, who tell their parents. // This is basically so that Windows can pop themselves // to the top when one of their children have been clicked. if (down) HoveredControl.Touch(); if (MouseClicked!=null) MouseClicked.Invoke(this, new EventArgs()); #if GWEN_HOOKSYSTEM if (bDown) { if (Hook::CallHook(&Hook::BaseHook::OnControlClicked, HoveredControl, MousePosition.x, MousePosition.y)) return true; } #endif switch (mouseButton) { case 0: { if (DragAndDrop.OnMouseButton(HoveredControl, MousePosition.X, MousePosition.Y, down)) return true; if (isDoubleClick) HoveredControl.InputMouseDoubleClickedLeft(MousePosition.X, MousePosition.Y); else HoveredControl.InputMouseClickedLeft(MousePosition.X, MousePosition.Y, down); return true; } case 1: { if (isDoubleClick) HoveredControl.InputMouseDoubleClickedRight(MousePosition.X, MousePosition.Y); else HoveredControl.InputMouseClickedRight(MousePosition.X, MousePosition.Y, down); return true; } } return false; }