diff --git a/src/ProjectPlayer.qml b/src/ProjectPlayer.qml index 702d02e..4765be9 100644 --- a/src/ProjectPlayer.qml +++ b/src/ProjectPlayer.qml @@ -191,6 +191,8 @@ ProjectScene { onMouseMoved: (x, y)=> root.handleMouseMove(x, y) onMousePressed: root.handleMousePress() onMouseReleased: root.handleMouseRelease() + onMouseWheelUp: root.handleMouseWheelUp() + onMouseWheelDown: root.handleMouseWheelDown() } Component { diff --git a/src/mouseeventhandler.cpp b/src/mouseeventhandler.cpp index 571771d..a8db22e 100644 --- a/src/mouseeventhandler.cpp +++ b/src/mouseeventhandler.cpp @@ -77,6 +77,18 @@ bool MouseEventHandler::eventFilter(QObject *obj, QEvent *event) return true; } + case QEvent::Wheel: { + QWheelEvent *wheelEvent = static_cast(event); + const int delta = wheelEvent->angleDelta().y(); + + if (delta > 0) + emit mouseWheelUp(); + else if (delta < 0) + emit mouseWheelDown(); + + break; + } + default: break; } diff --git a/src/mouseeventhandler.h b/src/mouseeventhandler.h index 407a0e5..6b05846 100644 --- a/src/mouseeventhandler.h +++ b/src/mouseeventhandler.h @@ -34,6 +34,8 @@ class MouseEventHandler : public QObject void mouseMoved(qreal x, qreal y); void mousePressed(); void mouseReleased(); + void mouseWheelUp(); + void mouseWheelDown(); private: void getSprites(); diff --git a/src/projectscene.cpp b/src/projectscene.cpp index 58b1f39..625b5ba 100644 --- a/src/projectscene.cpp +++ b/src/projectscene.cpp @@ -71,6 +71,19 @@ void ProjectScene::handleMouseRelease() m_engine->setMousePressed(false); } +void ProjectScene::handleMouseWheelUp() +{ + if (m_engine) + m_engine->mouseWheelUp(); +} + +void ProjectScene::handleMouseWheelDown() +{ + + if (m_engine) + m_engine->mouseWheelDown(); +} + void ProjectScene::handleKeyPress(Qt::Key key, const QString &text) { m_pressedKeys.insert(key); diff --git a/src/projectscene.h b/src/projectscene.h index 96eda3a..7916c2f 100644 --- a/src/projectscene.h +++ b/src/projectscene.h @@ -34,6 +34,8 @@ class ProjectScene : public QQuickItem Q_INVOKABLE void handleMouseMove(qreal x, qreal y); Q_INVOKABLE void handleMousePress(); Q_INVOKABLE void handleMouseRelease(); + Q_INVOKABLE void handleMouseWheelUp(); + Q_INVOKABLE void handleMouseWheelDown(); void handleKeyPress(Qt::Key key, const QString &text); void handleKeyRelease(Qt::Key key, const QString &text); diff --git a/src/scenemousearea.cpp b/src/scenemousearea.cpp index 1632695..7095c5c 100644 --- a/src/scenemousearea.cpp +++ b/src/scenemousearea.cpp @@ -15,6 +15,8 @@ SceneMouseArea::SceneMouseArea(QQuickItem *parent) : connect(m_mouseHandler, &MouseEventHandler::mouseMoved, this, &SceneMouseArea::mouseMoved); connect(m_mouseHandler, &MouseEventHandler::mousePressed, this, &SceneMouseArea::mousePressed); connect(m_mouseHandler, &MouseEventHandler::mouseReleased, this, &SceneMouseArea::mouseReleased); + connect(m_mouseHandler, &MouseEventHandler::mouseWheelUp, this, &SceneMouseArea::mouseWheelUp); + connect(m_mouseHandler, &MouseEventHandler::mouseWheelDown, this, &SceneMouseArea::mouseWheelDown); setAcceptHoverEvents(true); setAcceptTouchEvents(true); diff --git a/src/scenemousearea.h b/src/scenemousearea.h index e9e2262..d687c0b 100644 --- a/src/scenemousearea.h +++ b/src/scenemousearea.h @@ -34,6 +34,8 @@ class SceneMouseArea : public QQuickItem void mouseMoved(qreal x, qreal y); void mousePressed(); void mouseReleased(); + void mouseWheelUp(); + void mouseWheelDown(); void stageChanged(); void projectLoaderChanged(); diff --git a/test/mouseeventhandler/mouseeventhandler_test.cpp b/test/mouseeventhandler/mouseeventhandler_test.cpp index ab0134a..c034158 100644 --- a/test/mouseeventhandler/mouseeventhandler_test.cpp +++ b/test/mouseeventhandler/mouseeventhandler_test.cpp @@ -405,3 +405,25 @@ TEST(MouseEventHandlerTest, MousePressReleaseEvent) pressedSpy.clear(); releasedSpy.clear(); } + +TEST(MouseEventHandlerTest, WheelEvent) +{ + MouseEventHandler handler; + QSignalSpy upSpy(&handler, &MouseEventHandler::mouseWheelUp); + QSignalSpy downSpy(&handler, &MouseEventHandler::mouseWheelDown); + QWheelEvent event1(QPointF(), QPointF(), QPoint(2, 3), QPoint(10, 15), Qt::LeftButton, Qt::NoModifier, Qt::NoScrollPhase, false); // up + QWheelEvent event2(QPointF(), QPointF(), QPoint(1, -5), QPoint(10, -50), Qt::LeftButton, Qt::NoModifier, Qt::NoScrollPhase, false); // down + QWheelEvent event3(QPointF(), QPointF(), QPoint(-10, 0), QPoint(-100, 0), Qt::LeftButton, Qt::NoModifier, Qt::NoScrollPhase, false); // none + + handler.eventFilter(nullptr, &event1); + ASSERT_EQ(upSpy.count(), 1); + ASSERT_EQ(downSpy.count(), 0); + + handler.eventFilter(nullptr, &event2); + ASSERT_EQ(upSpy.count(), 1); + ASSERT_EQ(downSpy.count(), 1); + + handler.eventFilter(nullptr, &event3); + ASSERT_EQ(upSpy.count(), 1); + ASSERT_EQ(downSpy.count(), 1); +} diff --git a/test/projectscene/projectscene_test.cpp b/test/projectscene/projectscene_test.cpp index 4c88ed7..5920b39 100644 --- a/test/projectscene/projectscene_test.cpp +++ b/test/projectscene/projectscene_test.cpp @@ -67,6 +67,19 @@ TEST(ProjectSceneTest, HandleMouseRelease) scene.handleMouseRelease(); } +TEST(ProjectSceneTest, HandleMouseWheel) +{ + ProjectScene scene; + EngineMock engine; + scene.setEngine(&engine); + + EXPECT_CALL(engine, mouseWheelUp()); + scene.handleMouseWheelUp(); + + EXPECT_CALL(engine, mouseWheelDown()); + scene.handleMouseWheelDown(); +} + TEST(ProjectSceneTest, HandleKeyPressAndRelease) { static const std::unordered_map SPECIAL_KEY_MAP = {