void Gui::handleMousePressed(const MouseInput& mouseInput) { WidgetPtr sourceWidget = GetMouseEventSource(mouseInput.getX(), mouseInput.getY()); if (mFocusHandler->GetDraggedWidget()) { sourceWidget = mFocusHandler->GetDraggedWidget(); } int sourceWidgetX, sourceWidgetY; sourceWidget->getAbsolutePosition(sourceWidgetX, sourceWidgetY); if ((mFocusHandler->GetModalFocused() != NULL && sourceWidget->isModalFocused()) || mFocusHandler->GetModalFocused() == NULL) { sourceWidget->requestFocus(); } if (mouseInput.getTimeStamp() - mLastMousePressTimeStamp < 250 && mLastMousePressButton == mouseInput.getButton()) { mClickCount++; } else { mClickCount = 1; } distributeMouseEvent(sourceWidget, MouseEvent::PRESSED, mouseInput.getButton(), mouseInput.getX(), mouseInput.getY()); mFocusHandler->SetLastWidgetPressed(sourceWidget); mFocusHandler->SetDraggedWidget(sourceWidget); mLastMouseDragButton = mouseInput.getButton(); mLastMousePressButton = mouseInput.getButton(); mLastMousePressTimeStamp = mouseInput.getTimeStamp(); }
void Widget::_mouseInputMessage(const MouseInput& mouseInput) { if (mFocusHandler == NULL) { //throw GCN_EXCEPTION("No focushandler set (did you add the widget to the gui?)."); assert(!"No focushandler set (did you add the widget to the gui?)."); } if (!mEnabled || (mFocusHandler->getModalFocused() != NULL && !hasModalFocus())) { return; } int x = mouseInput.x; int y = mouseInput.y; int b = mouseInput.getButton(); int ts = mouseInput.getTimeStamp(); MouseListenerIterator iter; switch(mouseInput.getType()) { case MouseInput::MOTION: for (iter = mMouseListeners.begin(); iter != mMouseListeners.end(); ++iter) { (*iter)->mouseMotion(x, y); } break; case MouseInput::PRESS: if (hasMouse()) { requestFocus(); mFocusHandler->requestDrag(this); } if (b != MouseInput::WHEEL_UP && b != MouseInput::WHEEL_DOWN) { for (iter = mMouseListeners.begin(); iter != mMouseListeners.end(); ++iter) { (*iter)->mousePress(x, y, b); } if (hasMouse()) { if (ts - mClickTimeStamp < 300 && mClickButton == b) { mClickCount++; } else { mClickCount = 0; } mClickButton = b; mClickTimeStamp = ts; } else { mClickButton = 0; } } else if (b == MouseInput::WHEEL_UP) { for (iter = mMouseListeners.begin(); iter != mMouseListeners.end(); ++iter) { (*iter)->mouseWheelUp(x, y); } } else { for (iter = mMouseListeners.begin(); iter != mMouseListeners.end(); ++iter) { (*iter)->mouseWheelDown(x, y); } } setDirty(true); break; case MouseInput::RELEASE: if (isDragged()) { mFocusHandler->dragNone(); } if (b != MouseInput::WHEEL_UP && b != MouseInput::WHEEL_DOWN) { for (iter = mMouseListeners.begin(); iter != mMouseListeners.end(); ++iter) { (*iter)->mouseRelease(x, y, b); } } if (mHasMouse) { if (b == mClickButton) { for (iter = mMouseListeners.begin(); iter != mMouseListeners.end(); ++iter) { (*iter)->mouseClick(x, y, b, mClickCount + 1); } } else { mClickButton = 0; mClickCount = 0; } } else { mClickCount = 0; mClickTimeStamp = 0; } setDirty(true); break; } }