Skip to content

Commit f39a4a1

Browse files
authored
Merge pull request #45 from scratchcpp/mouse_events
Handle mouse events
2 parents 4a1a084 + f5f4610 commit f39a4a1

File tree

6 files changed

+139
-0
lines changed

6 files changed

+139
-0
lines changed

ScratchCPPGui/ProjectPlayer.qml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ ProjectScene {
2020

2121
id: root
2222
clip: true
23+
engine: loader.engine
2324
onFileNameChanged: priv.loading = true;
2425

2526
QtObject {
@@ -109,4 +110,13 @@ ProjectScene {
109110
Item { Layout.fillHeight: true }
110111
}
111112
}
113+
114+
MouseArea {
115+
id: mouseArea
116+
anchors.fill: parent
117+
hoverEnabled: true
118+
onPositionChanged: root.handleMouseMove(mouseX, mouseY)
119+
onPressed: root.handleMousePress()
120+
onReleased: root.handleMouseRelease()
121+
}
112122
}

ScratchCPPGui/projectscene.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// SPDX-License-Identifier: LGPL-3.0-or-later
22

3+
#include <scratchcpp/iengine.h>
4+
35
#include "projectscene.h"
46

57
namespace scratchcppgui
@@ -9,4 +11,38 @@ ProjectScene::ProjectScene(QQuickItem *parent)
911
{
1012
}
1113

14+
libscratchcpp::IEngine *ProjectScene::engine() const
15+
{
16+
return m_engine;
17+
}
18+
19+
void ProjectScene::setEngine(libscratchcpp::IEngine *newEngine)
20+
{
21+
if (m_engine == newEngine)
22+
return;
23+
24+
m_engine = newEngine;
25+
emit engineChanged();
26+
}
27+
28+
void ProjectScene::handleMouseMove(qreal x, qreal y)
29+
{
30+
if (m_engine) {
31+
m_engine->setMouseX(x - m_engine->stageWidth() / 2.0);
32+
m_engine->setMouseY(-y + m_engine->stageHeight() / 2.0);
33+
}
34+
}
35+
36+
void ProjectScene::handleMousePress()
37+
{
38+
if (m_engine)
39+
m_engine->setMousePressed(true);
40+
}
41+
42+
void ProjectScene::handleMouseRelease()
43+
{
44+
if (m_engine)
45+
m_engine->setMousePressed(false);
46+
}
47+
1248
} // namespace scratchcppgui

ScratchCPPGui/projectscene.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,35 @@
44

55
#include <QQuickPaintedItem>
66

7+
namespace libscratchcpp
8+
{
9+
class IEngine;
10+
}
11+
712
namespace scratchcppgui
813
{
914

1015
class ProjectScene : public QQuickItem
1116
{
1217
Q_OBJECT
1318
QML_ELEMENT
19+
Q_PROPERTY(libscratchcpp::IEngine *engine READ engine WRITE setEngine NOTIFY engineChanged)
1420

1521
public:
1622
ProjectScene(QQuickItem *parent = nullptr);
23+
24+
libscratchcpp::IEngine *engine() const;
25+
void setEngine(libscratchcpp::IEngine *newEngine);
26+
27+
Q_INVOKABLE void handleMouseMove(qreal x, qreal y);
28+
Q_INVOKABLE void handleMousePress();
29+
Q_INVOKABLE void handleMouseRelease();
30+
31+
signals:
32+
void engineChanged();
33+
34+
private:
35+
libscratchcpp::IEngine *m_engine = nullptr;
1736
};
1837

1938
} // namespace scratchcppgui

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,4 @@ add_subdirectory(projectloader)
2424
add_subdirectory(renderedtarget)
2525
add_subdirectory(targetpainter)
2626
add_subdirectory(target_models)
27+
add_subdirectory(projectscene)

test/projectscene/CMakeLists.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
add_executable(
2+
projectscene_test
3+
projectscene_test.cpp
4+
)
5+
6+
target_link_libraries(
7+
projectscene_test
8+
GTest::gtest_main
9+
GTest::gmock_main
10+
libscratchcpp-gui
11+
scratchcppgui_mocks
12+
${QT_LIBS}
13+
)
14+
15+
add_test(projectscene_test)
16+
gtest_discover_tests(projectscene_test)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include <projectscene.h>
2+
#include <enginemock.h>
3+
4+
#include "../common.h"
5+
6+
using namespace scratchcppgui;
7+
8+
using ::testing::Return;
9+
10+
TEST(ProjectScene, Engine)
11+
{
12+
ProjectScene scene;
13+
ASSERT_EQ(scene.engine(), nullptr);
14+
15+
EngineMock engine;
16+
scene.setEngine(&engine);
17+
ASSERT_EQ(scene.engine(), &engine);
18+
}
19+
20+
TEST(ProjectScene, HandleMouseMove)
21+
{
22+
ProjectScene scene;
23+
EngineMock engine;
24+
scene.setEngine(&engine);
25+
26+
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(600));
27+
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(400));
28+
EXPECT_CALL(engine, setMouseX(-253.1));
29+
EXPECT_CALL(engine, setMouseY(216.7));
30+
scene.handleMouseMove(46.9, -16.7);
31+
}
32+
33+
TEST(ProjectScene, HandleMousePress)
34+
{
35+
ProjectScene scene;
36+
EngineMock engine;
37+
scene.setEngine(&engine);
38+
39+
EXPECT_CALL(engine, setMousePressed(true));
40+
scene.handleMousePress();
41+
42+
EXPECT_CALL(engine, setMousePressed(true));
43+
scene.handleMousePress();
44+
}
45+
46+
TEST(ProjectScene, HandleMouseRelease)
47+
{
48+
ProjectScene scene;
49+
EngineMock engine;
50+
scene.setEngine(&engine);
51+
52+
EXPECT_CALL(engine, setMousePressed(false));
53+
scene.handleMouseRelease();
54+
55+
EXPECT_CALL(engine, setMousePressed(false));
56+
scene.handleMouseRelease();
57+
}

0 commit comments

Comments
 (0)