Keep track of keys pressed, synthesize release events when focus is lost.

Closes #2375.
This commit is contained in:
Andrzej Kapolka 2014-03-20 11:17:36 -07:00
parent 418fc9f69c
commit f92f45df63
5 changed files with 66 additions and 45 deletions

View file

@ -4,22 +4,22 @@
<context> <context>
<name>Application</name> <name>Application</name>
<message> <message>
<location filename="src/Application.cpp" line="1354"/> <location filename="src/Application.cpp" line="1364"/>
<source>Export Voxels</source> <source>Export Voxels</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/Application.cpp" line="1355"/> <location filename="src/Application.cpp" line="1365"/>
<source>Sparse Voxel Octree Files (*.svo)</source> <source>Sparse Voxel Octree Files (*.svo)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/Application.cpp" line="3565"/> <location filename="src/Application.cpp" line="3575"/>
<source>Open Script</source> <source>Open Script</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/Application.cpp" line="3566"/> <location filename="src/Application.cpp" line="3576"/>
<source>JavaScript Files (*.js)</source> <source>JavaScript Files (*.js)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View file

@ -692,6 +692,8 @@ bool Application::event(QEvent* event) {
void Application::keyPressEvent(QKeyEvent* event) { void Application::keyPressEvent(QKeyEvent* event) {
_keysPressed.insert(event->key());
_controllerScriptingInterface.emitKeyPressEvent(event); // send events to any registered scripts _controllerScriptingInterface.emitKeyPressEvent(event); // send events to any registered scripts
// if one of our scripts have asked to capture this event, then stop processing it // if one of our scripts have asked to capture this event, then stop processing it
@ -914,6 +916,8 @@ void Application::keyPressEvent(QKeyEvent* event) {
void Application::keyReleaseEvent(QKeyEvent* event) { void Application::keyReleaseEvent(QKeyEvent* event) {
_keysPressed.remove(event->key());
_controllerScriptingInterface.emitKeyReleaseEvent(event); // send events to any registered scripts _controllerScriptingInterface.emitKeyReleaseEvent(event); // send events to any registered scripts
// if one of our scripts have asked to capture this event, then stop processing it // if one of our scripts have asked to capture this event, then stop processing it
@ -921,8 +925,6 @@ void Application::keyReleaseEvent(QKeyEvent* event) {
return; return;
} }
if (activeWindow() == _window) {
switch (event->key()) { switch (event->key()) {
case Qt::Key_E: case Qt::Key_E:
_myAvatar->setDriveKeys(UP, 0.f); _myAvatar->setDriveKeys(UP, 0.f);
@ -972,7 +974,15 @@ void Application::keyReleaseEvent(QKeyEvent* event) {
event->ignore(); event->ignore();
break; break;
} }
}
void Application::focusOutEvent(QFocusEvent* event) {
// synthesize events for keys currently pressed, since we may not get their release events
foreach (int key, _keysPressed) {
QKeyEvent event(QEvent::KeyRelease, key, Qt::NoModifier);
keyReleaseEvent(&event);
} }
_keysPressed.clear();
} }
void Application::mouseMoveEvent(QMouseEvent* event) { void Application::mouseMoveEvent(QMouseEvent* event) {

View file

@ -18,6 +18,7 @@
#include <QSettings> #include <QSettings>
#include <QTouchEvent> #include <QTouchEvent>
#include <QList> #include <QList>
#include <QSet>
#include <QStringList> #include <QStringList>
#include <QPointer> #include <QPointer>
@ -122,6 +123,8 @@ public:
void keyPressEvent(QKeyEvent* event); void keyPressEvent(QKeyEvent* event);
void keyReleaseEvent(QKeyEvent* event); void keyReleaseEvent(QKeyEvent* event);
void focusOutEvent(QFocusEvent* event);
void mouseMoveEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event);
@ -432,6 +435,8 @@ private:
bool _mousePressed; // true if mouse has been pressed (clear when finished) bool _mousePressed; // true if mouse has been pressed (clear when finished)
QSet<int> _keysPressed;
GeometryCache _geometryCache; GeometryCache _geometryCache;
TextureCache _textureCache; TextureCache _textureCache;

View file

@ -55,6 +55,10 @@ void GLCanvas::keyReleaseEvent(QKeyEvent* event) {
Application::getInstance()->keyReleaseEvent(event); Application::getInstance()->keyReleaseEvent(event);
} }
void GLCanvas::focusOutEvent(QFocusEvent* event) {
Application::getInstance()->focusOutEvent(event);
}
void GLCanvas::mouseMoveEvent(QMouseEvent* event) { void GLCanvas::mouseMoveEvent(QMouseEvent* event) {
Application::getInstance()->mouseMoveEvent(event); Application::getInstance()->mouseMoveEvent(event);
} }

View file

@ -31,6 +31,8 @@ protected:
virtual void keyPressEvent(QKeyEvent* event); virtual void keyPressEvent(QKeyEvent* event);
virtual void keyReleaseEvent(QKeyEvent* event); virtual void keyReleaseEvent(QKeyEvent* event);
virtual void focusOutEvent(QFocusEvent* event);
virtual void mouseMoveEvent(QMouseEvent* event); virtual void mouseMoveEvent(QMouseEvent* event);
virtual void mousePressEvent(QMouseEvent* event); virtual void mousePressEvent(QMouseEvent* event);
virtual void mouseReleaseEvent(QMouseEvent* event); virtual void mouseReleaseEvent(QMouseEvent* event);