This commit is contained in:
David Rowe 2016-12-04 15:14:47 +13:00 committed by Seth Alves
parent 44f36a9dae
commit e85bc50333
8 changed files with 47 additions and 32 deletions

View file

@ -1200,11 +1200,11 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
// Keyboard focus handling for Web overlays.
auto overlays = &(qApp->getOverlays());
connect(overlays, &Overlays::mousePressOnOverlay, [=](const int overlayID, const PointerEvent& event) {
connect(overlays, &Overlays::mousePressOnOverlay, [=](unsigned int overlayID, const PointerEvent& event) {
setKeyboardFocusOverlay(overlayID);
});
connect(overlays, &Overlays::overlayDeleted, [=](const int overlayID) {
connect(overlays, &Overlays::overlayDeleted, [=](unsigned int overlayID) {
if (overlayID == _keyboardFocusedOverlay.get()) {
setKeyboardFocusOverlay(UNKNOWN_OVERLAY_ID);
}
@ -3974,7 +3974,7 @@ void Application::setKeyboardFocusEntity(EntityItemID entityItemID) {
}
}
void Application::setKeyboardFocusOverlay(int overlayID) {
void Application::setKeyboardFocusOverlay(unsigned int overlayID) {
if (overlayID != _keyboardFocusedOverlay.get()) {
_keyboardFocusedOverlay.set(overlayID);

View file

@ -366,7 +366,7 @@ public slots:
void setKeyboardFocusEntity(QUuid id);
void setKeyboardFocusEntity(EntityItemID entityItemID);
void setKeyboardFocusOverlay(int id);
void setKeyboardFocusOverlay(unsigned int overlayID);
private slots:
void showDesktop();

View file

@ -671,9 +671,6 @@ PointerEvent Overlays::calculatePointerEvent(Overlay::Pointer overlay, PickRay r
}
void Overlays::mousePressEvent(QMouseEvent* event) {
qDebug() << "####### Overlays::mousePressEvent()";
PerformanceTimer perfTimer("Overlays::mousePressEvent");
PickRay ray = qApp->computePickRay(event->x(), event->y());
@ -686,10 +683,6 @@ void Overlays::mousePressEvent(QMouseEvent* event) {
if (thisOverlay) {
auto pointerEvent = calculatePointerEvent(thisOverlay, ray, rayPickResult, event, PointerEvent::Press);
emit mousePressOnOverlay(_currentClickingOnOverlayID, pointerEvent);
// ####### TODO: From EntityTreeRendered ... needed?
//_lastPointerEvent = pointerEvent;
//_lastPointerEventValid = true;
} else {
emit mousePressOffOverlay();
}
@ -710,10 +703,6 @@ void Overlays::mouseReleaseEvent(QMouseEvent* event) {
if (thisOverlay) {
auto pointerEvent = calculatePointerEvent(thisOverlay, ray, rayPickResult, event, PointerEvent::Release);
emit mouseReleaseOnOverlay(rayPickResult.overlayID, pointerEvent);
// ####### TODO: From EntityTreeRendered ... needed?
//_lastPointerEvent = pointerEvent;
//_lastPointerEventValid = true;
}
}

View file

@ -77,7 +77,7 @@ void RayToOverlayIntersectionResultFromScriptValue(const QScriptValue& object, R
* @namespace Overlays
*/
const int UNKNOWN_OVERLAY_ID = -1;
const unsigned int UNKNOWN_OVERLAY_ID = 0;
class Overlays : public QObject {
Q_OBJECT
@ -257,14 +257,14 @@ signals:
void overlayDeleted(unsigned int id);
void panelDeleted(unsigned int id);
void mousePressOnOverlay(const int overlayID, const PointerEvent& event);
void mouseReleaseOnOverlay(const int overlayID, const PointerEvent& event);
void mouseMoveOnOverlay(const int overlayID, const PointerEvent& event);
void mousePressOnOverlay(unsigned int overlayID, const PointerEvent& event);
void mouseReleaseOnOverlay(unsigned int overlayID, const PointerEvent& event);
void mouseMoveOnOverlay(unsigned int overlayID, const PointerEvent& event);
void mousePressOffOverlay();
void hoverEnterOverlay(const int overlayID, const PointerEvent& event);
void hoverOverOverlay(const int overlayID, const PointerEvent& event);
void hoverLeaveOverlay(const int overlayID, const PointerEvent& event);
void hoverEnterOverlay(unsigned int overlayID, const PointerEvent& event);
void hoverOverOverlay(unsigned int overlayID, const PointerEvent& event);
void hoverLeaveOverlay(unsigned int overlayID, const PointerEvent& event);
private:
void cleanupOverlaysToDelete();
@ -283,8 +283,8 @@ private:
PointerEvent calculatePointerEvent(Overlay::Pointer overlay, PickRay ray, RayToOverlayIntersectionResult rayPickResult,
QMouseEvent* event, PointerEvent::EventType eventType);
int _currentClickingOnOverlayID = UNKNOWN_OVERLAY_ID;
int _currentHoverOverOverlayID = UNKNOWN_OVERLAY_ID;
unsigned int _currentClickingOnOverlayID = UNKNOWN_OVERLAY_ID;
unsigned int _currentHoverOverOverlayID = UNKNOWN_OVERLAY_ID;
};
#endif // hifi_Overlays_h

View file

@ -30,7 +30,8 @@
static const float DPI = 30.47f;
static const float INCHES_TO_METERS = 1.0f / 39.3701f;
static float OPAQUE_ALPHA_THRESHOLD = 0.99f;
static const float METERS_TO_INCHES = 39.3701f;
static const float OPAQUE_ALPHA_THRESHOLD = 0.99f;
QString const Web3DOverlay::TYPE = "web3d";
@ -63,6 +64,8 @@ Web3DOverlay::~Web3DOverlay() {
_mouseReleaseConnection = QMetaObject::Connection();
QObject::disconnect(_mouseMoveConnection);
_mouseMoveConnection = QMetaObject::Connection();
QObject::disconnect(_hoverLeaveConnection);
_hoverLeaveConnection = QMetaObject::Connection();
// The lifetime of the QML surface MUST be managed by the main thread
// Additionally, we MUST use local variables copied by value, rather than
@ -112,7 +115,7 @@ void Web3DOverlay::render(RenderArgs* args) {
_webSurface->resize(QSize(_resolution.x, _resolution.y));
currentContext->makeCurrent(currentSurface);
auto forwardPointerEvent = [=](const int overlayID, const PointerEvent& event) {
auto forwardPointerEvent = [=](unsigned int overlayID, const PointerEvent& event) {
if (overlayID == getOverlayID()) {
handlePointerEvent(event);
}
@ -121,6 +124,27 @@ void Web3DOverlay::render(RenderArgs* args) {
_mousePressConnection = connect(&(qApp->getOverlays()), &Overlays::mousePressOnOverlay, forwardPointerEvent);
_mouseReleaseConnection = connect(&(qApp->getOverlays()), &Overlays::mouseReleaseOnOverlay, forwardPointerEvent);
_mouseMoveConnection = connect(&(qApp->getOverlays()), &Overlays::mouseMoveOnOverlay, forwardPointerEvent);
_hoverLeaveConnection = connect(&(qApp->getOverlays()), &Overlays::hoverLeaveOverlay,
[=](unsigned int overlayID, const PointerEvent& event) {
if (this->_pressed && this->getOverlayID() == overlayID) {
// If the user mouses off the overlay while the button is down, simulate a touch end.
QTouchEvent::TouchPoint point;
point.setId(event.getID());
point.setState(Qt::TouchPointReleased);
glm::vec2 windowPos = event.getPos2D() * (METERS_TO_INCHES * _dpi);
QPointF windowPoint(windowPos.x, windowPos.y);
point.setScenePos(windowPoint);
point.setPos(windowPoint);
QList<QTouchEvent::TouchPoint> touchPoints;
touchPoints.push_back(point);
QTouchEvent* touchEvent = new QTouchEvent(QEvent::TouchEnd, nullptr, Qt::NoModifier, Qt::TouchPointReleased,
touchPoints);
touchEvent->setWindow(_webSurface->getWindow());
touchEvent->setDevice(&_touchDevice);
touchEvent->setTarget(_webSurface->getRootItem());
QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent);
}
});
}
vec2 halfSize = getSize() / 2.0f;
@ -186,7 +210,6 @@ void Web3DOverlay::handlePointerEvent(const PointerEvent& event) {
return;
}
const float METERS_TO_INCHES = 39.3701f;
glm::vec2 windowPos = event.getPos2D() * (METERS_TO_INCHES * _dpi);
QPointF windowPoint(windowPos.x, windowPos.y);
@ -197,6 +220,12 @@ void Web3DOverlay::handlePointerEvent(const PointerEvent& event) {
QCoreApplication::postEvent(_webSurface->getWindow(), mouseEvent);
}
if (event.getType() == PointerEvent::Press) {
this->_pressed = true;
} else if (event.getType() == PointerEvent::Release) {
this->_pressed = false;
}
QEvent::Type type;
Qt::TouchPointState touchPointState;
switch (event.getType()) {
@ -230,7 +259,6 @@ void Web3DOverlay::handlePointerEvent(const PointerEvent& event) {
touchEvent->setTouchPoints(touchPoints);
touchEvent->setTouchPointStates(touchPointState);
QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent);
}

View file

@ -59,11 +59,13 @@ private:
vec2 _resolution{ 640, 480 };
int _geometryId { 0 };
bool _pressed{ false };
QTouchDevice _touchDevice;
QMetaObject::Connection _mousePressConnection;
QMetaObject::Connection _mouseReleaseConnection;
QMetaObject::Connection _mouseMoveConnection;
QMetaObject::Connection _hoverLeaveConnection;
};
#endif // hifi_Web3DOverlay_h

View file

@ -350,8 +350,6 @@ void RenderableWebEntityItem::handlePointerEvent(const PointerEvent& event) {
touchEvent->setTouchPoints(touchPoints);
touchEvent->setTouchPointStates(touchPointState);
_lastTouchEvent = *touchEvent;
QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent);
}
}

View file

@ -65,9 +65,7 @@ private:
QSharedPointer<OffscreenQmlSurface> _webSurface;
QMetaObject::Connection _connection;
gpu::TexturePointer _texture;
ivec2 _lastPress { INT_MIN };
bool _pressed{ false };
QTouchEvent _lastTouchEvent { QEvent::TouchUpdate };
uint64_t _lastRenderTime{ 0 };
QTouchDevice _touchDevice;