Skip to content

Commit 6ab5408

Browse files
committed
Make sure all targets receive the mouse release event
1 parent 080d9fe commit 6ab5408

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

ScratchCPPGui/mouseeventhandler.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,13 @@ bool MouseEventHandler::eventFilter(QObject *obj, QEvent *event)
5757

5858
case QEvent::MouseButtonRelease:
5959
emit mouseReleased();
60-
forwardPointEvent(static_cast<QSinglePointEvent *>(event));
60+
61+
if (m_clickedItem) {
62+
sendPointEventToItem(static_cast<QSinglePointEvent *>(event), m_clickedItem);
63+
m_clickedItem = nullptr;
64+
} else
65+
forwardPointEvent(static_cast<QSinglePointEvent *>(event));
66+
6167
return true;
6268

6369
default:
@@ -137,6 +143,9 @@ void MouseEventHandler::sendPointEventToItem(QSinglePointEvent *event, QQuickIte
137143
case QEvent::MouseButtonPress:
138144
case QEvent::MouseButtonRelease:
139145
case QEvent::MouseMove: {
146+
if (event->type() == QEvent::MouseButtonPress)
147+
m_clickedItem = item;
148+
140149
QMouseEvent itemEvent(
141150
event->type(),
142151
item->mapFromScene(event->scenePosition()),

ScratchCPPGui/mouseeventhandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class MouseEventHandler : public QObject
4040

4141
IRenderedTarget *m_stage = nullptr;
4242
QQuickItem *m_hoveredItem = nullptr;
43+
QQuickItem *m_clickedItem = nullptr;
4344
QQuickItem *m_spriteRepeater = nullptr;
4445
};
4546

test/mouseeventhandler/mouseeventhandler_test.cpp

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,17 +303,32 @@ TEST(MouseEventHandlerTest, MousePressReleaseEvent)
303303
pressedSpy.clear();
304304
releasedSpy.clear();
305305

306-
// Send to stage (press)
306+
// Send release (should be sent to sprite 1)
307+
EXPECT_CALL(renderedTarget1, mouseReleaseEvent(_)).WillOnce(WithArgs<0>(Invoke(checkReleaseEvent)));
308+
ASSERT_TRUE(handler.eventFilter(nullptr, &releaseEvent));
309+
ASSERT_EQ(pressedSpy.count(), 0);
310+
ASSERT_EQ(releasedSpy.count(), 1);
311+
pressedSpy.clear();
312+
releasedSpy.clear();
313+
314+
// Send to sprite 1 (press)
307315
EXPECT_CALL(renderedTarget3, contains(localPos)).WillOnce(Return(false));
308-
EXPECT_CALL(renderedTarget1, contains(localPos)).WillOnce(Return(false));
309-
EXPECT_CALL(renderedTarget2, contains(localPos)).WillOnce(Return(false));
310-
EXPECT_CALL(stage, mousePressEvent(_)).WillOnce(WithArgs<0>(Invoke(checkPressEvent)));
316+
EXPECT_CALL(renderedTarget1, contains(localPos)).WillOnce(Return(true));
317+
EXPECT_CALL(renderedTarget1, mousePressEvent(_)).WillOnce(WithArgs<0>(Invoke(checkPressEvent)));
311318
ASSERT_TRUE(handler.eventFilter(nullptr, &pressEvent));
312319
ASSERT_EQ(pressedSpy.count(), 1);
313320
ASSERT_EQ(releasedSpy.count(), 0);
314321
pressedSpy.clear();
315322
releasedSpy.clear();
316323

324+
// Send release (should be sent to sprite 1)
325+
EXPECT_CALL(renderedTarget1, mouseReleaseEvent(_)).WillOnce(WithArgs<0>(Invoke(checkReleaseEvent)));
326+
ASSERT_TRUE(handler.eventFilter(nullptr, &releaseEvent));
327+
ASSERT_EQ(pressedSpy.count(), 0);
328+
ASSERT_EQ(releasedSpy.count(), 1);
329+
pressedSpy.clear();
330+
releasedSpy.clear();
331+
317332
// Send to sprite 1 (release)
318333
EXPECT_CALL(renderedTarget3, contains(localPos)).WillOnce(Return(false));
319334
EXPECT_CALL(renderedTarget1, contains(localPos)).WillOnce(Return(true));
@@ -324,10 +339,18 @@ TEST(MouseEventHandlerTest, MousePressReleaseEvent)
324339
pressedSpy.clear();
325340
releasedSpy.clear();
326341

327-
// Send to stage (release)
342+
// Send to stage (press)
328343
EXPECT_CALL(renderedTarget3, contains(localPos)).WillOnce(Return(false));
329344
EXPECT_CALL(renderedTarget1, contains(localPos)).WillOnce(Return(false));
330345
EXPECT_CALL(renderedTarget2, contains(localPos)).WillOnce(Return(false));
346+
EXPECT_CALL(stage, mousePressEvent(_)).WillOnce(WithArgs<0>(Invoke(checkPressEvent)));
347+
ASSERT_TRUE(handler.eventFilter(nullptr, &pressEvent));
348+
ASSERT_EQ(pressedSpy.count(), 1);
349+
ASSERT_EQ(releasedSpy.count(), 0);
350+
pressedSpy.clear();
351+
releasedSpy.clear();
352+
353+
// Send release (should be sent to stage)
331354
EXPECT_CALL(stage, mouseReleaseEvent(_)).WillOnce(WithArgs<0>(Invoke(checkReleaseEvent)));
332355
ASSERT_TRUE(handler.eventFilter(nullptr, &releaseEvent));
333356
ASSERT_EQ(pressedSpy.count(), 0);

0 commit comments

Comments
 (0)