示例#1
0
/** \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();
}
示例#3
0
/** \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);
}