diff --git a/extern/osgQt/GraphicsWindowQt b/extern/osgQt/GraphicsWindowQt index 54d069176b..ad456ef445 100644 --- a/extern/osgQt/GraphicsWindowQt +++ b/extern/osgQt/GraphicsWindowQt @@ -56,32 +56,15 @@ class GLWidget : public QGLWidget public: - GLWidget( QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0, bool forwardKeyEvents = false ); - GLWidget( QGLContext* context, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0, bool forwardKeyEvents = false ); - GLWidget( const QGLFormat& format, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0, bool forwardKeyEvents = false ); + GLWidget( QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0); + GLWidget( QGLContext* context, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0); + GLWidget( const QGLFormat& format, QWidget* parent = NULL, const QGLWidget* shareWidget = NULL, Qt::WindowFlags f = 0); virtual ~GLWidget(); inline void setGraphicsWindow( GraphicsWindowQt* gw ) { _gw = gw; } inline GraphicsWindowQt* getGraphicsWindow() { return _gw; } inline const GraphicsWindowQt* getGraphicsWindow() const { return _gw; } - inline bool getForwardKeyEvents() const { return _forwardKeyEvents; } - virtual void setForwardKeyEvents( bool f ) { _forwardKeyEvents = f; } - - inline bool getTouchEventsEnabled() const { return _touchEventsEnabled; } - void setTouchEventsEnabled( bool e ); - - void setKeyboardModifiers( QInputEvent* event ); - - virtual void keyPressEvent( QKeyEvent* event ); - virtual void keyReleaseEvent( QKeyEvent* event ); - virtual void mousePressEvent( QMouseEvent* event ); - virtual void mouseReleaseEvent( QMouseEvent* event ); - virtual void mouseDoubleClickEvent( QMouseEvent* event ); - virtual void mouseMoveEvent( QMouseEvent* event ); - virtual void wheelEvent( QWheelEvent* event ); - virtual bool gestureEvent( QGestureEvent* event ); - protected: int getNumDeferredEvents() @@ -114,9 +97,6 @@ protected: QQueue _deferredEventQueue; QSet _eventCompressor; - bool _touchEventsEnabled; - - bool _forwardKeyEvents; qreal _devicePixelRatio; virtual void resizeEvent( QResizeEvent* event ); @@ -164,9 +144,6 @@ public: virtual std::string getWindowName(); virtual void useCursor( bool cursorOn ); virtual void setCursor( MouseCursor cursor ); - inline bool getTouchEventsEnabled() const { return _widget->getTouchEventsEnabled(); } - virtual void setTouchEventsEnabled( bool e ) { _widget->setTouchEventsEnabled(e); } - virtual bool valid() const; virtual bool realizeImplementation(); diff --git a/extern/osgQt/GraphicsWindowQt.cpp b/extern/osgQt/GraphicsWindowQt.cpp index 2001c8b315..770ac9ada0 100644 --- a/extern/osgQt/GraphicsWindowQt.cpp +++ b/extern/osgQt/GraphicsWindowQt.cpp @@ -26,98 +26,6 @@ using namespace osgQt; - -class QtKeyboardMap -{ - -public: - QtKeyboardMap() - { - mKeyMap[Qt::Key_Escape ] = osgGA::GUIEventAdapter::KEY_Escape; - mKeyMap[Qt::Key_Delete ] = osgGA::GUIEventAdapter::KEY_Delete; - mKeyMap[Qt::Key_Home ] = osgGA::GUIEventAdapter::KEY_Home; - mKeyMap[Qt::Key_Enter ] = osgGA::GUIEventAdapter::KEY_KP_Enter; - mKeyMap[Qt::Key_End ] = osgGA::GUIEventAdapter::KEY_End; - mKeyMap[Qt::Key_Return ] = osgGA::GUIEventAdapter::KEY_Return; - mKeyMap[Qt::Key_PageUp ] = osgGA::GUIEventAdapter::KEY_Page_Up; - mKeyMap[Qt::Key_PageDown ] = osgGA::GUIEventAdapter::KEY_Page_Down; - mKeyMap[Qt::Key_Left ] = osgGA::GUIEventAdapter::KEY_Left; - mKeyMap[Qt::Key_Right ] = osgGA::GUIEventAdapter::KEY_Right; - mKeyMap[Qt::Key_Up ] = osgGA::GUIEventAdapter::KEY_Up; - mKeyMap[Qt::Key_Down ] = osgGA::GUIEventAdapter::KEY_Down; - mKeyMap[Qt::Key_Backspace ] = osgGA::GUIEventAdapter::KEY_BackSpace; - mKeyMap[Qt::Key_Tab ] = osgGA::GUIEventAdapter::KEY_Tab; - mKeyMap[Qt::Key_Space ] = osgGA::GUIEventAdapter::KEY_Space; - mKeyMap[Qt::Key_Delete ] = osgGA::GUIEventAdapter::KEY_Delete; - mKeyMap[Qt::Key_Alt ] = osgGA::GUIEventAdapter::KEY_Alt_L; - mKeyMap[Qt::Key_Shift ] = osgGA::GUIEventAdapter::KEY_Shift_L; - mKeyMap[Qt::Key_Control ] = osgGA::GUIEventAdapter::KEY_Control_L; - mKeyMap[Qt::Key_Meta ] = osgGA::GUIEventAdapter::KEY_Meta_L; - - mKeyMap[Qt::Key_F1 ] = osgGA::GUIEventAdapter::KEY_F1; - mKeyMap[Qt::Key_F2 ] = osgGA::GUIEventAdapter::KEY_F2; - mKeyMap[Qt::Key_F3 ] = osgGA::GUIEventAdapter::KEY_F3; - mKeyMap[Qt::Key_F4 ] = osgGA::GUIEventAdapter::KEY_F4; - mKeyMap[Qt::Key_F5 ] = osgGA::GUIEventAdapter::KEY_F5; - mKeyMap[Qt::Key_F6 ] = osgGA::GUIEventAdapter::KEY_F6; - mKeyMap[Qt::Key_F7 ] = osgGA::GUIEventAdapter::KEY_F7; - mKeyMap[Qt::Key_F8 ] = osgGA::GUIEventAdapter::KEY_F8; - mKeyMap[Qt::Key_F9 ] = osgGA::GUIEventAdapter::KEY_F9; - mKeyMap[Qt::Key_F10 ] = osgGA::GUIEventAdapter::KEY_F10; - mKeyMap[Qt::Key_F11 ] = osgGA::GUIEventAdapter::KEY_F11; - mKeyMap[Qt::Key_F12 ] = osgGA::GUIEventAdapter::KEY_F12; - mKeyMap[Qt::Key_F13 ] = osgGA::GUIEventAdapter::KEY_F13; - mKeyMap[Qt::Key_F14 ] = osgGA::GUIEventAdapter::KEY_F14; - mKeyMap[Qt::Key_F15 ] = osgGA::GUIEventAdapter::KEY_F15; - mKeyMap[Qt::Key_F16 ] = osgGA::GUIEventAdapter::KEY_F16; - mKeyMap[Qt::Key_F17 ] = osgGA::GUIEventAdapter::KEY_F17; - mKeyMap[Qt::Key_F18 ] = osgGA::GUIEventAdapter::KEY_F18; - mKeyMap[Qt::Key_F19 ] = osgGA::GUIEventAdapter::KEY_F19; - mKeyMap[Qt::Key_F20 ] = osgGA::GUIEventAdapter::KEY_F20; - - mKeyMap[Qt::Key_hyphen ] = '-'; - mKeyMap[Qt::Key_Equal ] = '='; - - mKeyMap[Qt::Key_division ] = osgGA::GUIEventAdapter::KEY_KP_Divide; - mKeyMap[Qt::Key_multiply ] = osgGA::GUIEventAdapter::KEY_KP_Multiply; - mKeyMap[Qt::Key_Minus ] = '-'; - mKeyMap[Qt::Key_Plus ] = '+'; - //mKeyMap[Qt::Key_H ] = osgGA::GUIEventAdapter::KEY_KP_Home; - //mKeyMap[Qt::Key_ ] = osgGA::GUIEventAdapter::KEY_KP_Up; - //mKeyMap[92 ] = osgGA::GUIEventAdapter::KEY_KP_Page_Up; - //mKeyMap[86 ] = osgGA::GUIEventAdapter::KEY_KP_Left; - //mKeyMap[87 ] = osgGA::GUIEventAdapter::KEY_KP_Begin; - //mKeyMap[88 ] = osgGA::GUIEventAdapter::KEY_KP_Right; - //mKeyMap[83 ] = osgGA::GUIEventAdapter::KEY_KP_End; - //mKeyMap[84 ] = osgGA::GUIEventAdapter::KEY_KP_Down; - //mKeyMap[85 ] = osgGA::GUIEventAdapter::KEY_KP_Page_Down; - mKeyMap[Qt::Key_Insert ] = osgGA::GUIEventAdapter::KEY_KP_Insert; - //mKeyMap[Qt::Key_Delete ] = osgGA::GUIEventAdapter::KEY_KP_Delete; - } - - ~QtKeyboardMap() - { - } - - int remapKey(QKeyEvent* event) - { - KeyMap::iterator itr = mKeyMap.find(event->key()); - if (itr == mKeyMap.end()) - { - return int(*(event->text().toLatin1().data())); - } - else - return itr->second; - } - - private: - typedef std::map KeyMap; - KeyMap mKeyMap; -}; - -static QtKeyboardMap s_QtKeyboardMap; - - /// The object responsible for the scene re-rendering. class HeartBeat : public QObject { public: @@ -126,7 +34,7 @@ public: osg::observer_ptr< osgViewer::ViewerBase > _viewer; virtual ~HeartBeat(); - + void init( osgViewer::ViewerBase *viewer ); void stopTimer(); void timerEvent( QTimerEvent *event ); @@ -146,31 +54,20 @@ QPointer HeartBeat::heartBeat; #define GETDEVICEPIXELRATIO() devicePixelRatio() #endif -GLWidget::GLWidget( QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f, bool forwardKeyEvents ) -: QGLWidget(parent, shareWidget, f), -_gw( NULL ), -_touchEventsEnabled( false ), -_forwardKeyEvents( forwardKeyEvents ) +GLWidget::GLWidget( QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f) +: QGLWidget(parent, shareWidget, f), _gw( NULL ) { _devicePixelRatio = GETDEVICEPIXELRATIO(); } -GLWidget::GLWidget( QGLContext* context, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f, - bool forwardKeyEvents ) -: QGLWidget(context, parent, shareWidget, f), -_gw( NULL ), -_touchEventsEnabled( false ), -_forwardKeyEvents( forwardKeyEvents ) +GLWidget::GLWidget( QGLContext* context, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f) +: QGLWidget(context, parent, shareWidget, f), _gw( NULL ) { _devicePixelRatio = GETDEVICEPIXELRATIO(); } -GLWidget::GLWidget( const QGLFormat& format, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f, - bool forwardKeyEvents ) -: QGLWidget(format, parent, shareWidget, f), -_gw( NULL ), -_touchEventsEnabled( false ), -_forwardKeyEvents( forwardKeyEvents ) +GLWidget::GLWidget( const QGLFormat& format, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f) +: QGLWidget(format, parent, shareWidget, f), _gw( NULL ) { _devicePixelRatio = GETDEVICEPIXELRATIO(); } @@ -186,25 +83,6 @@ GLWidget::~GLWidget() } } -void GLWidget::setTouchEventsEnabled(bool e) -{ -#ifdef USE_GESTURES - if (e==_touchEventsEnabled) - return; - - _touchEventsEnabled = e; - - if (_touchEventsEnabled) - { - grabGesture(Qt::PinchGesture); - } - else - { - ungrabGesture(Qt::PinchGesture); - } -#endif -} - void GLWidget::processDeferredEvents() { QQueue deferredEventQueueCopy; @@ -224,10 +102,6 @@ void GLWidget::processDeferredEvents() bool GLWidget::event( QEvent* event ) { -#ifdef USE_GESTURES - if ( event->type()==QEvent::Gesture ) - return gestureEvent(static_cast(event)); -#endif // QEvent::Hide // @@ -274,16 +148,6 @@ bool GLWidget::event( QEvent* event ) return QGLWidget::event( event ); } -void GLWidget::setKeyboardModifiers( QInputEvent* event ) -{ - int modkey = event->modifiers() & (Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier); - unsigned int mask = 0; - if ( modkey & Qt::ShiftModifier ) mask |= osgGA::GUIEventAdapter::MODKEY_SHIFT; - if ( modkey & Qt::ControlModifier ) mask |= osgGA::GUIEventAdapter::MODKEY_CTRL; - if ( modkey & Qt::AltModifier ) mask |= osgGA::GUIEventAdapter::MODKEY_ALT; - _gw->getEventQueue()->getCurrentEventState()->setModKeyMask( mask ); -} - void GLWidget::resizeEvent( QResizeEvent* event ) { const QSize& size = event->size(); @@ -309,178 +173,6 @@ void GLWidget::glDraw() _gw->requestRedraw(); } -void GLWidget::keyPressEvent( QKeyEvent* event ) -{ - setKeyboardModifiers( event ); - int value = s_QtKeyboardMap.remapKey( event ); - _gw->getEventQueue()->keyPress( value ); - - // this passes the event to the regular Qt key event processing, - // among others, it closes popup windows on ESC and forwards the event to the parent widgets - if( _forwardKeyEvents ) - inherited::keyPressEvent( event ); -} - -void GLWidget::keyReleaseEvent( QKeyEvent* event ) -{ - if( event->isAutoRepeat() ) - { - event->ignore(); - } - else - { - setKeyboardModifiers( event ); - int value = s_QtKeyboardMap.remapKey( event ); - _gw->getEventQueue()->keyRelease( value ); - } - - // this passes the event to the regular Qt key event processing, - // among others, it closes popup windows on ESC and forwards the event to the parent widgets - if( _forwardKeyEvents ) - inherited::keyReleaseEvent( event ); -} - -void GLWidget::mousePressEvent( QMouseEvent* event ) -{ - int button = 0; - switch ( event->button() ) - { - case Qt::LeftButton: button = 1; break; - case Qt::MidButton: button = 2; break; - case Qt::RightButton: button = 3; break; - case Qt::NoButton: button = 0; break; - default: button = 0; break; - } - setKeyboardModifiers( event ); - _gw->getEventQueue()->mouseButtonPress( event->x()*_devicePixelRatio, event->y()*_devicePixelRatio, button ); -} - -void GLWidget::mouseReleaseEvent( QMouseEvent* event ) -{ - int button = 0; - switch ( event->button() ) - { - case Qt::LeftButton: button = 1; break; - case Qt::MidButton: button = 2; break; - case Qt::RightButton: button = 3; break; - case Qt::NoButton: button = 0; break; - default: button = 0; break; - } - setKeyboardModifiers( event ); - _gw->getEventQueue()->mouseButtonRelease( event->x()*_devicePixelRatio, event->y()*_devicePixelRatio, button ); -} - -void GLWidget::mouseDoubleClickEvent( QMouseEvent* event ) -{ - int button = 0; - switch ( event->button() ) - { - case Qt::LeftButton: button = 1; break; - case Qt::MidButton: button = 2; break; - case Qt::RightButton: button = 3; break; - case Qt::NoButton: button = 0; break; - default: button = 0; break; - } - setKeyboardModifiers( event ); - _gw->getEventQueue()->mouseDoubleButtonPress( event->x()*_devicePixelRatio, event->y()*_devicePixelRatio, button ); -} - -void GLWidget::mouseMoveEvent( QMouseEvent* event ) -{ - setKeyboardModifiers( event ); - _gw->getEventQueue()->mouseMotion( event->x()*_devicePixelRatio, event->y()*_devicePixelRatio ); -} - -void GLWidget::wheelEvent( QWheelEvent* event ) -{ - setKeyboardModifiers( event ); - _gw->getEventQueue()->mouseScroll( - event->orientation() == Qt::Vertical ? - (event->delta()>0 ? osgGA::GUIEventAdapter::SCROLL_UP : osgGA::GUIEventAdapter::SCROLL_DOWN) : - (event->delta()>0 ? osgGA::GUIEventAdapter::SCROLL_LEFT : osgGA::GUIEventAdapter::SCROLL_RIGHT) ); -} - -#ifdef USE_GESTURES -static osgGA::GUIEventAdapter::TouchPhase translateQtGestureState( Qt::GestureState state ) -{ - osgGA::GUIEventAdapter::TouchPhase touchPhase; - switch ( state ) - { - case Qt::GestureStarted: - touchPhase = osgGA::GUIEventAdapter::TOUCH_BEGAN; - break; - case Qt::GestureUpdated: - touchPhase = osgGA::GUIEventAdapter::TOUCH_MOVED; - break; - case Qt::GestureFinished: - case Qt::GestureCanceled: - touchPhase = osgGA::GUIEventAdapter::TOUCH_ENDED; - break; - default: - touchPhase = osgGA::GUIEventAdapter::TOUCH_UNKNOWN; - }; - - return touchPhase; -} -#endif - - -bool GLWidget::gestureEvent( QGestureEvent* qevent ) -{ -#ifndef USE_GESTURES - return false; -#else - - bool accept = false; - - if ( QPinchGesture* pinch = static_cast(qevent->gesture(Qt::PinchGesture) ) ) - { - const QPointF qcenterf = pinch->centerPoint(); - const float angle = pinch->totalRotationAngle(); - const float scale = pinch->totalScaleFactor(); - - const QPoint pinchCenterQt = mapFromGlobal(qcenterf.toPoint()); - const osg::Vec2 pinchCenter( pinchCenterQt.x(), pinchCenterQt.y() ); - - //We don't have absolute positions of the two touches, only a scale and rotation - //Hence we create pseudo-coordinates which are reasonable, and centered around the - //real position - const float radius = (width()+height())/4; - const osg::Vec2 vector( scale*cos(angle)*radius, scale*sin(angle)*radius); - const osg::Vec2 p0 = pinchCenter+vector; - const osg::Vec2 p1 = pinchCenter-vector; - - osg::ref_ptr event = 0; - const osgGA::GUIEventAdapter::TouchPhase touchPhase = translateQtGestureState( pinch->state() ); - if ( touchPhase==osgGA::GUIEventAdapter::TOUCH_BEGAN ) - { - event = _gw->getEventQueue()->touchBegan(0 , touchPhase, p0[0], p0[1] ); - } - else if ( touchPhase==osgGA::GUIEventAdapter::TOUCH_MOVED ) - { - event = _gw->getEventQueue()->touchMoved( 0, touchPhase, p0[0], p0[1] ); - } - else - { - event = _gw->getEventQueue()->touchEnded( 0, touchPhase, p0[0], p0[1], 1 ); - } - - if ( event ) - { - event->addTouchPoint( 1, touchPhase, p1[0], p1[1] ); - accept = true; - } - } - - if ( accept ) - qevent->accept(); - - return accept; -#endif -} - - - GraphicsWindowQt::GraphicsWindowQt( osg::GraphicsContext::Traits* traits, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f ) : _realized(false) {