From a2db06b2982453cea02ef73b9377514324588a5c Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Thu, 11 Apr 2024 16:20:29 +0200 Subject: [PATCH 1/2] fix #84: Use sprite dragging API --- src/renderedtarget.cpp | 12 ++++++++---- test/renderedtarget/renderedtarget_test.cpp | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/renderedtarget.cpp b/src/renderedtarget.cpp index 9bad239..3ea3035 100644 --- a/src/renderedtarget.cpp +++ b/src/renderedtarget.cpp @@ -486,9 +486,11 @@ void RenderedTarget::mouseReleaseEvent(QMouseEvent *event) Q_ASSERT(m_mouseArea); // Stop dragging - if (m_mouseArea->draggedSprite() == this) + if (m_mouseArea->draggedSprite() == this) { + Sprite *sprite = m_spriteModel->sprite(); + sprite->stopDragging(); m_mouseArea->setDraggedSprite(nullptr); - else if (m_engine && m_spriteModel && m_spriteModel->sprite()->draggable()) { + } else if (m_engine && m_spriteModel && m_spriteModel->sprite()->draggable()) { // Notify libscratchcpp about the click m_engine->clickTarget(scratchTarget()); } @@ -503,6 +505,7 @@ void RenderedTarget::mouseMoveEvent(QMouseEvent *event) if (m_clicked && !m_mouseArea->draggedSprite() && m_spriteModel && m_spriteModel->sprite()->draggable()) { Q_ASSERT(m_engine); Sprite *sprite = m_spriteModel->sprite(); + sprite->startDragging(); m_dragDeltaX = m_engine->mouseX() - sprite->x(); m_dragDeltaY = m_engine->mouseY() - sprite->y(); m_mouseArea->setDraggedSprite(this); @@ -758,8 +761,9 @@ void RenderedTarget::handleSceneMouseMove(qreal x, qreal y) Q_ASSERT(m_spriteModel && m_spriteModel->sprite()); Q_ASSERT(m_engine); Sprite *sprite = m_spriteModel->sprite(); - sprite->setX(x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX); - sprite->setY(-y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY); + const double dragX = x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX; + const double dragY = -y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY; + sprite->dragToPosition(dragX, dragY); } } diff --git a/test/renderedtarget/renderedtarget_test.cpp b/test/renderedtarget/renderedtarget_test.cpp index dd9feb9..696268e 100644 --- a/test/renderedtarget/renderedtarget_test.cpp +++ b/test/renderedtarget/renderedtarget_test.cpp @@ -443,6 +443,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); // Try right mouse button (should not work) QMouseEvent moveEventRightButton(QEvent::MouseMove, QPointF(), QPointF(), Qt::RightButton, Qt::RightButton, Qt::NoModifier); @@ -454,14 +455,17 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); EXPECT_CALL(engine, clickTarget).Times(0); QCoreApplication::sendEvent(&target, &releaseEventRightButton); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); emit mouseArea.mouseMoved(1064, 651); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); // Try right mouse button with "draggable" set to true (should not work) sprite.setDraggable(true); @@ -471,14 +475,17 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); EXPECT_CALL(engine, clickTarget(&sprite)); QCoreApplication::sendEvent(&target, &releaseEventRightButton); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); emit mouseArea.mouseMoved(1064, 651); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); // Try left mouse button (should not work with "draggable" set to false) sprite.setDraggable(false); @@ -491,11 +498,13 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); emit mouseArea.mouseMoved(1064, 651); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); EXPECT_CALL(engine, clickTarget).Times(0); QCoreApplication::sendEvent(&target, &releaseEvent); @@ -510,6 +519,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), &target); + ASSERT_TRUE(sprite.dragging()); // Drag EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); @@ -518,6 +528,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(std::round(sprite.x() * 100) / 100, 61.22); ASSERT_EQ(std::round(sprite.y() * 100) / 100, -14.41); ASSERT_EQ(mouseArea.draggedSprite(), &target); + ASSERT_TRUE(sprite.dragging()); EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); @@ -525,6 +536,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26); ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95); ASSERT_EQ(mouseArea.draggedSprite(), &target); + ASSERT_TRUE(sprite.dragging()); // Create another sprite RenderedTarget anotherTarget; @@ -540,12 +552,16 @@ TEST_F(RenderedTargetTest, SpriteDragging) anotherTarget.setStageScale(3.5); anotherTarget.setMouseArea(&mouseArea); + ASSERT_FALSE(anotherSprite.dragging()); + // Try to drag the second sprite while the first is being dragged sprite.setDraggable(true); EXPECT_CALL(engine, clickTarget).Times(0); QCoreApplication::sendEvent(&anotherTarget, &pressEvent); QCoreApplication::sendEvent(&anotherTarget, &moveEvent); ASSERT_EQ(mouseArea.draggedSprite(), &target); + ASSERT_TRUE(sprite.dragging()); + ASSERT_FALSE(anotherSprite.dragging()); EXPECT_CALL(engine, clickTarget(&sprite)); QCoreApplication::sendEvent(&anotherTarget, &releaseEvent); @@ -555,6 +571,8 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26); ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); + ASSERT_FALSE(sprite.dragging()); + ASSERT_FALSE(anotherSprite.dragging()); } TEST_F(RenderedTargetTest, Engine) From 85f7a56767a319ff176971a50b2813316477da16 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Thu, 11 Apr 2024 17:54:17 +0200 Subject: [PATCH 2/2] fix #85: Update drag position in beforeRedraw() --- src/renderedtarget.cpp | 16 +++++++++++----- src/renderedtarget.h | 2 ++ test/renderedtarget/renderedtarget_test.cpp | 10 ++++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/renderedtarget.cpp b/src/renderedtarget.cpp index 3ea3035..38c7147 100644 --- a/src/renderedtarget.cpp +++ b/src/renderedtarget.cpp @@ -180,6 +180,15 @@ void RenderedTarget::beforeRedraw() m_oldTexture = m_texture; update(); } + + // Update drag position + if (m_spriteModel) { + Sprite *sprite = m_spriteModel->sprite(); + Q_ASSERT(sprite); + + if (sprite->dragging()) + sprite->dragToPosition(m_dragX, m_dragY); + } } void RenderedTarget::deinitClone() @@ -758,12 +767,9 @@ void RenderedTarget::handleSceneMouseMove(qreal x, qreal y) Q_ASSERT(m_mouseArea); if (m_mouseArea->draggedSprite() == this) { - Q_ASSERT(m_spriteModel && m_spriteModel->sprite()); Q_ASSERT(m_engine); - Sprite *sprite = m_spriteModel->sprite(); - const double dragX = x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX; - const double dragY = -y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY; - sprite->dragToPosition(dragX, dragY); + m_dragX = x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX; + m_dragY = -y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY; } } diff --git a/src/renderedtarget.h b/src/renderedtarget.h index 7c5ed0e..7d5d1c8 100644 --- a/src/renderedtarget.h +++ b/src/renderedtarget.h @@ -168,6 +168,8 @@ class RenderedTarget : public IRenderedTarget bool m_convexHullDirty = true; std::vector m_hullPoints; bool m_clicked = false; // left mouse button only! + double m_dragX = 0; + double m_dragY = 0; double m_dragDeltaX = 0; double m_dragDeltaY = 0; }; diff --git a/test/renderedtarget/renderedtarget_test.cpp b/test/renderedtarget/renderedtarget_test.cpp index 696268e..77018c8 100644 --- a/test/renderedtarget/renderedtarget_test.cpp +++ b/test/renderedtarget/renderedtarget_test.cpp @@ -440,6 +440,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) target.setMouseArea(&mouseArea); emit mouseArea.mouseMoved(1064, 651); + target.beforeRedraw(); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); @@ -462,6 +463,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_FALSE(sprite.dragging()); emit mouseArea.mouseMoved(1064, 651); + target.beforeRedraw(); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); @@ -482,6 +484,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_FALSE(sprite.dragging()); emit mouseArea.mouseMoved(1064, 651); + target.beforeRedraw(); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); @@ -501,6 +504,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_FALSE(sprite.dragging()); emit mouseArea.mouseMoved(1064, 651); + target.beforeRedraw(); ASSERT_EQ(sprite.x(), 64.08); ASSERT_EQ(sprite.y(), -6.86); ASSERT_EQ(mouseArea.draggedSprite(), nullptr); @@ -525,6 +529,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); emit mouseArea.mouseMoved(1067.8, 649.06); + target.beforeRedraw(); ASSERT_EQ(std::round(sprite.x() * 100) / 100, 61.22); ASSERT_EQ(std::round(sprite.y() * 100) / 100, -14.41); ASSERT_EQ(mouseArea.draggedSprite(), &target); @@ -533,6 +538,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480)); EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360)); emit mouseArea.mouseMoved(1092.47, 605.46); + target.beforeRedraw(); ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26); ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95); ASSERT_EQ(mouseArea.draggedSprite(), &target); @@ -548,7 +554,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) anotherSprite.setY(-6.86); anotherSprite.setDraggable(true); anotherModel.init(&anotherSprite); - anotherTarget.setSpriteModel(&model); + anotherTarget.setSpriteModel(&anotherModel); anotherTarget.setStageScale(3.5); anotherTarget.setMouseArea(&mouseArea); @@ -562,7 +568,7 @@ TEST_F(RenderedTargetTest, SpriteDragging) ASSERT_EQ(mouseArea.draggedSprite(), &target); ASSERT_TRUE(sprite.dragging()); ASSERT_FALSE(anotherSprite.dragging()); - EXPECT_CALL(engine, clickTarget(&sprite)); + EXPECT_CALL(engine, clickTarget(&anotherSprite)); QCoreApplication::sendEvent(&anotherTarget, &releaseEvent); // Stop dragging