Skip to content

Commit c6d92ed

Browse files
committed
Add SceneMouseArea class
1 parent 2527f4f commit c6d92ed

File tree

6 files changed

+141
-0
lines changed

6 files changed

+141
-0
lines changed

ScratchCPPGui/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ qt_add_qml_module(libscratchcpp-gui
2222
renderedtarget.h
2323
targetpainter.cpp
2424
targetpainter.h
25+
scenemousearea.cpp
26+
scenemousearea.h
2527
mouseeventhandler.cpp
2628
mouseeventhandler.h
2729
keyeventhandler.cpp

ScratchCPPGui/scenemousearea.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// SPDX-License-Identifier: LGPL-3.0-or-later
2+
3+
#include "scenemousearea.h"
4+
#include "mouseeventhandler.h"
5+
6+
using namespace scratchcppgui;
7+
8+
SceneMouseArea::SceneMouseArea(QQuickItem *parent) :
9+
QQuickItem(parent)
10+
{
11+
m_mouseHandler = new MouseEventHandler(this);
12+
installEventFilter(m_mouseHandler);
13+
connect(m_mouseHandler, &MouseEventHandler::mouseMoved, this, &SceneMouseArea::mouseMoved);
14+
connect(m_mouseHandler, &MouseEventHandler::mousePressed, this, &SceneMouseArea::mousePressed);
15+
connect(m_mouseHandler, &MouseEventHandler::mouseReleased, this, &SceneMouseArea::mouseReleased);
16+
17+
setAcceptHoverEvents(true);
18+
setAcceptTouchEvents(true);
19+
setAcceptedMouseButtons(Qt::AllButtons);
20+
}
21+
22+
IRenderedTarget *SceneMouseArea::stage() const
23+
{
24+
return m_mouseHandler->stage();
25+
}
26+
27+
void SceneMouseArea::setStage(IRenderedTarget *newStage)
28+
{
29+
m_mouseHandler->setStage(newStage);
30+
emit stageChanged();
31+
}
32+
33+
QQuickItem *SceneMouseArea::spriteRepeater() const
34+
{
35+
return m_mouseHandler->spriteRepeater();
36+
}
37+
38+
void SceneMouseArea::setSpriteRepeater(QQuickItem *newSpriteRepeater)
39+
{
40+
m_mouseHandler->setSpriteRepeater(newSpriteRepeater);
41+
emit spriteRepeaterChanged();
42+
}

ScratchCPPGui/scenemousearea.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// SPDX-License-Identifier: LGPL-3.0-or-later
2+
3+
#pragma once
4+
5+
#include <QQuickItem>
6+
7+
namespace scratchcppgui
8+
{
9+
10+
class IRenderedTarget;
11+
class MouseEventHandler;
12+
13+
class SceneMouseArea : public QQuickItem
14+
{
15+
Q_OBJECT
16+
QML_ELEMENT
17+
Q_PROPERTY(IRenderedTarget *stage WRITE setStage NOTIFY stageChanged)
18+
Q_PROPERTY(QQuickItem *spriteRepeater READ spriteRepeater WRITE setSpriteRepeater NOTIFY spriteRepeaterChanged)
19+
20+
public:
21+
explicit SceneMouseArea(QQuickItem *parent = nullptr);
22+
23+
IRenderedTarget *stage() const;
24+
void setStage(IRenderedTarget *newStage);
25+
26+
QQuickItem *spriteRepeater() const;
27+
void setSpriteRepeater(QQuickItem *newSpriteRepeater);
28+
29+
signals:
30+
void mouseMoved(qreal x, qreal y);
31+
void mousePressed();
32+
void mouseReleased();
33+
void stageChanged();
34+
void spriteRepeaterChanged();
35+
36+
private:
37+
MouseEventHandler *m_mouseHandler = nullptr;
38+
};
39+
40+
} // namespace scratchcppgui

test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@ add_subdirectory(target_models)
2727
add_subdirectory(projectscene)
2828
add_subdirectory(keyeventhandler)
2929
add_subdirectory(mouseeventhandler)
30+
add_subdirectory(scenemousearea)

test/scenemousearea/CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
add_executable(
2+
scenemousearea_test
3+
scenemousearea_test.cpp
4+
)
5+
6+
target_link_libraries(
7+
scenemousearea_test
8+
GTest::gtest_main
9+
GTest::gmock_main
10+
libscratchcpp-gui
11+
scratchcppgui_mocks
12+
${QT_LIBS}
13+
Qt6::Test
14+
)
15+
16+
add_test(scenemousearea_test)
17+
gtest_discover_tests(scenemousearea_test)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <QtTest/QSignalSpy>
2+
#include <scenemousearea.h>
3+
#include <renderedtargetmock.h>
4+
5+
#include "../common.h"
6+
7+
using namespace scratchcppgui;
8+
9+
TEST(SceneMouseAreaTest, Constructors)
10+
{
11+
SceneMouseArea area1;
12+
SceneMouseArea area2(&area1);
13+
ASSERT_EQ(area2.parent(), &area1);
14+
ASSERT_EQ(area2.parentItem(), &area1);
15+
}
16+
17+
TEST(SceneMouseAreaTest, Stage)
18+
{
19+
SceneMouseArea mouseArea;
20+
QSignalSpy spy(&mouseArea, &SceneMouseArea::stageChanged);
21+
ASSERT_EQ(mouseArea.stage(), nullptr);
22+
23+
RenderedTargetMock stage;
24+
mouseArea.setStage(&stage);
25+
ASSERT_EQ(spy.count(), 1);
26+
ASSERT_EQ(mouseArea.stage(), &stage);
27+
}
28+
29+
TEST(SceneMouseAreaTest, SpriteRepeater)
30+
{
31+
SceneMouseArea mouseArea;
32+
QSignalSpy spy(&mouseArea, &SceneMouseArea::spriteRepeaterChanged);
33+
ASSERT_EQ(mouseArea.spriteRepeater(), nullptr);
34+
35+
QQuickItem item;
36+
mouseArea.setSpriteRepeater(&item);
37+
ASSERT_EQ(spy.count(), 1);
38+
ASSERT_EQ(mouseArea.spriteRepeater(), &item);
39+
}

0 commit comments

Comments
 (0)