|
|
@ -26,98 +26,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
using namespace osgQt;
|
|
|
|
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<unsigned int, int> KeyMap;
|
|
|
|
|
|
|
|
KeyMap mKeyMap;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static QtKeyboardMap s_QtKeyboardMap;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// The object responsible for the scene re-rendering.
|
|
|
|
/// The object responsible for the scene re-rendering.
|
|
|
|
class HeartBeat : public QObject {
|
|
|
|
class HeartBeat : public QObject {
|
|
|
|
public:
|
|
|
|
public:
|
|
|
@ -126,7 +34,7 @@ public:
|
|
|
|
osg::observer_ptr< osgViewer::ViewerBase > _viewer;
|
|
|
|
osg::observer_ptr< osgViewer::ViewerBase > _viewer;
|
|
|
|
|
|
|
|
|
|
|
|
virtual ~HeartBeat();
|
|
|
|
virtual ~HeartBeat();
|
|
|
|
|
|
|
|
|
|
|
|
void init( osgViewer::ViewerBase *viewer );
|
|
|
|
void init( osgViewer::ViewerBase *viewer );
|
|
|
|
void stopTimer();
|
|
|
|
void stopTimer();
|
|
|
|
void timerEvent( QTimerEvent *event );
|
|
|
|
void timerEvent( QTimerEvent *event );
|
|
|
@ -146,31 +54,20 @@ QPointer<HeartBeat> HeartBeat::heartBeat;
|
|
|
|
#define GETDEVICEPIXELRATIO() devicePixelRatio()
|
|
|
|
#define GETDEVICEPIXELRATIO() devicePixelRatio()
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
GLWidget::GLWidget( QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f, bool forwardKeyEvents )
|
|
|
|
GLWidget::GLWidget( QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f)
|
|
|
|
: QGLWidget(parent, shareWidget, f),
|
|
|
|
: QGLWidget(parent, shareWidget, f), _gw( NULL )
|
|
|
|
_gw( NULL ),
|
|
|
|
|
|
|
|
_touchEventsEnabled( false ),
|
|
|
|
|
|
|
|
_forwardKeyEvents( forwardKeyEvents )
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_devicePixelRatio = GETDEVICEPIXELRATIO();
|
|
|
|
_devicePixelRatio = GETDEVICEPIXELRATIO();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
GLWidget::GLWidget( QGLContext* context, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f,
|
|
|
|
GLWidget::GLWidget( QGLContext* context, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f)
|
|
|
|
bool forwardKeyEvents )
|
|
|
|
: QGLWidget(context, parent, shareWidget, f), _gw( NULL )
|
|
|
|
: QGLWidget(context, parent, shareWidget, f),
|
|
|
|
|
|
|
|
_gw( NULL ),
|
|
|
|
|
|
|
|
_touchEventsEnabled( false ),
|
|
|
|
|
|
|
|
_forwardKeyEvents( forwardKeyEvents )
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_devicePixelRatio = GETDEVICEPIXELRATIO();
|
|
|
|
_devicePixelRatio = GETDEVICEPIXELRATIO();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
GLWidget::GLWidget( const QGLFormat& format, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f,
|
|
|
|
GLWidget::GLWidget( const QGLFormat& format, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f)
|
|
|
|
bool forwardKeyEvents )
|
|
|
|
: QGLWidget(format, parent, shareWidget, f), _gw( NULL )
|
|
|
|
: QGLWidget(format, parent, shareWidget, f),
|
|
|
|
|
|
|
|
_gw( NULL ),
|
|
|
|
|
|
|
|
_touchEventsEnabled( false ),
|
|
|
|
|
|
|
|
_forwardKeyEvents( forwardKeyEvents )
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_devicePixelRatio = GETDEVICEPIXELRATIO();
|
|
|
|
_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()
|
|
|
|
void GLWidget::processDeferredEvents()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
QQueue<QEvent::Type> deferredEventQueueCopy;
|
|
|
|
QQueue<QEvent::Type> deferredEventQueueCopy;
|
|
|
@ -224,10 +102,6 @@ void GLWidget::processDeferredEvents()
|
|
|
|
|
|
|
|
|
|
|
|
bool GLWidget::event( QEvent* event )
|
|
|
|
bool GLWidget::event( QEvent* event )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
#ifdef USE_GESTURES
|
|
|
|
|
|
|
|
if ( event->type()==QEvent::Gesture )
|
|
|
|
|
|
|
|
return gestureEvent(static_cast<QGestureEvent*>(event));
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// QEvent::Hide
|
|
|
|
// QEvent::Hide
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -274,16 +148,6 @@ bool GLWidget::event( QEvent* event )
|
|
|
|
return QGLWidget::event( 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 )
|
|
|
|
void GLWidget::resizeEvent( QResizeEvent* event )
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const QSize& size = event->size();
|
|
|
|
const QSize& size = event->size();
|
|
|
@ -309,178 +173,6 @@ void GLWidget::glDraw()
|
|
|
|
_gw->requestRedraw();
|
|
|
|
_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<QPinchGesture *>(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<osgGA::GUIEventAdapter> 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 )
|
|
|
|
GraphicsWindowQt::GraphicsWindowQt( osg::GraphicsContext::Traits* traits, QWidget* parent, const QGLWidget* shareWidget, Qt::WindowFlags f )
|
|
|
|
: _realized(false)
|
|
|
|
: _realized(false)
|
|
|
|
{
|
|
|
|
{
|
|
|
|