/** \brief The GUI's mouse button release event handler. * * This function should be called from the SDL event loop. * It translates a mouse event to PUI syntax and passes it to the * PUI-internal mouse function. If there's no active widget which could * use the event the function will return false, giving the caller * the opportunity to use the event for other purposes. * \param btn Code of the button as reported by SDL * \param x Mouse x coordinate as reported by SDL * \param y Mouse y coordinate as reported by SDL * \return true if PUI was able to handle the event */ bool CGUIMain::mouseButtonUpHandler(int btn, int x, int y) { return puMouse(translateMouse(btn), PU_UP, x, y); }
void RendererWidget::mouseMoveEvent(QMouseEvent *event) { if(_leftMouse || _rightMouse) { event->accept(); QPoint p = event->pos() - _lastMousePos; if(_editMode == MESH_EDITOR && _leftMouse) { emit pressedMouseMoved(p.x() * _mouseSensivity, p.y() * _mouseSensivity); } else if(_editMode == MESH_EDITOR && _rightMouse) { float time = _renderer->elapsedTime(); _inMeshEditorCameraAngle.x() -= p.x() * time * 20 * _mouseSensivity; _inMeshEditorCameraAngle.y() += p.y() * time * 20 * _mouseSensivity; vec3 dir = {cosf(_inMeshEditorCameraAngle[1]*PI/180)*cosf(_inMeshEditorCameraAngle[0]*PI/180), cosf(_inMeshEditorCameraAngle[1]*PI/180)*sinf(_inMeshEditorCameraAngle[0]*PI/180), sinf(_inMeshEditorCameraAngle[1]*PI/180)}; _renderer->lock(); _renderer->getSceneView(0).camera.pos = dir.resized(_renderer->getSceneView(0).camera.pos.length()); _renderer->unlock(); } else if(_editMode == SCENE_EDITOR && _rightMouse && _stateReady == NO_INTERACTION) { float time = _renderer->elapsedTime(); _inSceneEditorCameraAngle.x() -= p.x() * time * 30 * _mouseSensivity; _inSceneEditorCameraAngle.y() -= p.y() * time * 30 * _mouseSensivity; _inSceneEditorCameraAngle.y() = std::max(-89.9f, std::min(89.9f, _inSceneEditorCameraAngle.y())); vec3 dir = {cosf(_inSceneEditorCameraAngle[1]*PI/180)*cosf(_inSceneEditorCameraAngle[0]*PI/180), cosf(_inSceneEditorCameraAngle[1]*PI/180)*sinf(_inSceneEditorCameraAngle[0]*PI/180), sinf(_inSceneEditorCameraAngle[1]*PI/180)}; _renderer->lock(); _renderer->getSceneView(_renderer->getCurSceneIndex()).camera.dir = _renderer->getSceneView(_renderer->getCurSceneIndex()).camera.pos + dir; _renderer->unlock(); } } if(_editMode == SCENE_EDITOR && (_stateReady >= TRANSLATE_MODE && _stateReady <= ROTATE_Z_MODE)) { event->accept(); QPoint p = event->pos() - _lastMousePos; float relX = float(p.x()) / this->size().width(); float relY = float(p.y()) / this->size().height(); if(_shiftPressed) { relX *= 0.1; relY *= 0.1; } emit translateMouse(relX,relY,_stateReady); } _lastMousePos = event->pos(); if(!hasFocus()) setFocus(); }
/** \brief The GUI's mouse button press event handler. * * This function should be called from the SDL event loop. * It translates a mouse event to PUI syntax and passes it to the * PUI-internal mouse function. If there's no active widget which could * use the event the function will return false, giving the caller * the opportunity to use the event for other purposes. * \param btn Code of the button as reported by SDL * \param x Mouse x coordinate as reported by SDL * \param y Mouse y coordinate as reported by SDL * \return true if PUI was able to handle the event */ bool CGUIMain::mouseButtonDownHandler(int btn, int x, int y) { return puMouse(translateMouse(btn), PU_DOWN, x, y); }
void X11Device::processEvent(const XEvent &event) { DeviceEvent deviceEvent(ENoEvent); X11Session *session = static_cast<X11Session *>(getSession()); if (m_callbacks.size() == 0) return; switch (event.type) { case ClientMessage: /* The window close button pressed */ if ((event.xclient.format == 32) && ((unsigned) event.xclient.data.l[0] == m_deleteWindow)) { deviceEvent.setType(EQuitEvent); } break; case FocusIn: /* Deactivate auto-repeat */ XAutoRepeatOff(session->m_display); deviceEvent.setType(EGainFocusEvent); m_modifierState = 0; m_buttonState = 0; break; case FocusOut: /* Reactivate auto-repeat */ XAutoRepeatOn(session->m_display); deviceEvent.setType(ELoseFocusEvent); m_modifierState = 0; m_buttonState = 0; break; case ButtonPress: deviceEvent.setType(EMouseButtonDownEvent); translateMouse(event, deviceEvent); m_buttonState |= deviceEvent.getMouseButton(); break; case ButtonRelease: deviceEvent.setType(EMouseButtonUpEvent); translateMouse(event, deviceEvent); m_buttonState &= ~deviceEvent.getMouseButton(); break; case MotionNotify: { deviceEvent.setType(m_buttonState == 0 ? EMouseMotionEvent : EMouseDragEvent); translateMouse(event, deviceEvent); deviceEvent.setMouseButton(m_buttonState); if (m_grab) warpMouse(Point2i(getSize().x / 2, getSize().y/2)); int xpos = deviceEvent.getMousePosition().x; int ypos = deviceEvent.getMousePosition().y; if (xpos > m_size.x || xpos < 0 || ypos > m_size.y || ypos < 0) return; } break; case KeyPress: if (translateKeyboard(event, deviceEvent)) { deviceEvent.setType(EKeyDownEvent); int special = deviceEvent.getKeyboardSpecial(); /* Update the current modifier state */ if (special == EKeyLShift || special == EKeyRShift) { m_modifierState |= EShiftModifier; } else if (special == EKeyLAlt || special == EKeyRAlt) { m_modifierState |= EAltModifier; } else if (special == EKeyLControl || special == EKeyRControl) { m_modifierState |= EControlModifier; } deviceEvent.setKeyboardModifiers(m_modifierState); } break; case KeyRelease: if (translateKeyboard(event, deviceEvent)) { deviceEvent.setType(EKeyUpEvent); int special = deviceEvent.getKeyboardSpecial(); /* Update the current modifier state */ if (special == EKeyLShift || special == EKeyRShift) { m_modifierState = m_modifierState & (~EShiftModifier); } else if (special == EKeyLAlt || special == EKeyRAlt) { m_modifierState = m_modifierState & (~EAltModifier); } else if (special == EKeyLControl || special == EKeyRControl) { m_modifierState = m_modifierState & (~EControlModifier); } deviceEvent.setKeyboardModifiers(m_modifierState); } break; case MapNotify: case UnmapNotify: m_modifierState = 0; break; case ConfigureNotify: { Vector2i size(event.xconfigure.width, event.xconfigure.height); if (m_size != size) { m_size = size; deviceEvent.setType(EResizeEvent); } } break; case ReparentNotify: case Expose: break; default: Log(EWarn, "Unknown event %i received", event.type); } if (deviceEvent.getType() != ENoEvent) fireDeviceEvent(deviceEvent); }