void Gui::handleMouseInput() { while (!mInput->isMouseQueueEmpty()) { MouseInput mouseInput = mInput->dequeueMouseInput(); // Save the current mouse state. It will be needed if modal focus // changes or modal mouse input focus changes. mLastMouseX = mouseInput.getX(); mLastMouseY = mouseInput.getY(); switch (mouseInput.getType()) { case MouseInput::PRESSED: handleMousePressed(mouseInput); break; case MouseInput::RELEASED: handleMouseReleased(mouseInput); break; case MouseInput::MOVED: handleMouseMoved(mouseInput); break; case MouseInput::WHEEL_MOVED_DOWN: handleMouseWheelMovedDown(mouseInput); break; case MouseInput::WHEEL_MOVED_UP: handleMouseWheelMovedUp(mouseInput); break; default: throw GCN_EXCEPTION("Unknown mouse input type."); break; } } }
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; } }