From e85bc5033396eea52ea92ea9aba40493f2fd974e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 4 Dec 2016 15:14:47 +1300 Subject: [PATCH] Tidying --- interface/src/Application.cpp | 6 ++-- interface/src/Application.h | 2 +- interface/src/ui/overlays/Overlays.cpp | 11 ------ interface/src/ui/overlays/Overlays.h | 18 +++++----- interface/src/ui/overlays/Web3DOverlay.cpp | 36 ++++++++++++++++--- interface/src/ui/overlays/Web3DOverlay.h | 2 ++ .../src/RenderableWebEntityItem.cpp | 2 -- .../src/RenderableWebEntityItem.h | 2 -- 8 files changed, 47 insertions(+), 32 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ebab9c0c3c..e49d9de831 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -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); diff --git a/interface/src/Application.h b/interface/src/Application.h index 8ac446aa80..c9a5b267ab 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -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(); diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index cd5cb26e65..759353f7d3 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -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; } } diff --git a/interface/src/ui/overlays/Overlays.h b/interface/src/ui/overlays/Overlays.h index 6e7240d9a5..47607aa7a3 100644 --- a/interface/src/ui/overlays/Overlays.h +++ b/interface/src/ui/overlays/Overlays.h @@ -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 diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 014d02de6c..5bdc429b75 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -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 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); } diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 16c5f41929..474f6bf1da 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -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 diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index a29d2c0b8e..7e51249830 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -350,8 +350,6 @@ void RenderableWebEntityItem::handlePointerEvent(const PointerEvent& event) { touchEvent->setTouchPoints(touchPoints); touchEvent->setTouchPointStates(touchPointState); - _lastTouchEvent = *touchEvent; - QCoreApplication::postEvent(_webSurface->getWindow(), touchEvent); } } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 2178c24397..e47e6bdfd3 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -65,9 +65,7 @@ private: QSharedPointer _webSurface; QMetaObject::Connection _connection; gpu::TexturePointer _texture; - ivec2 _lastPress { INT_MIN }; bool _pressed{ false }; - QTouchEvent _lastTouchEvent { QEvent::TouchUpdate }; uint64_t _lastRenderTime{ 0 }; QTouchDevice _touchDevice;