Skip to content

Commit a2db06b

Browse files
committed
fix #84: Use sprite dragging API
1 parent f49fa1b commit a2db06b

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/renderedtarget.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -486,9 +486,11 @@ void RenderedTarget::mouseReleaseEvent(QMouseEvent *event)
486486
Q_ASSERT(m_mouseArea);
487487

488488
// Stop dragging
489-
if (m_mouseArea->draggedSprite() == this)
489+
if (m_mouseArea->draggedSprite() == this) {
490+
Sprite *sprite = m_spriteModel->sprite();
491+
sprite->stopDragging();
490492
m_mouseArea->setDraggedSprite(nullptr);
491-
else if (m_engine && m_spriteModel && m_spriteModel->sprite()->draggable()) {
493+
} else if (m_engine && m_spriteModel && m_spriteModel->sprite()->draggable()) {
492494
// Notify libscratchcpp about the click
493495
m_engine->clickTarget(scratchTarget());
494496
}
@@ -503,6 +505,7 @@ void RenderedTarget::mouseMoveEvent(QMouseEvent *event)
503505
if (m_clicked && !m_mouseArea->draggedSprite() && m_spriteModel && m_spriteModel->sprite()->draggable()) {
504506
Q_ASSERT(m_engine);
505507
Sprite *sprite = m_spriteModel->sprite();
508+
sprite->startDragging();
506509
m_dragDeltaX = m_engine->mouseX() - sprite->x();
507510
m_dragDeltaY = m_engine->mouseY() - sprite->y();
508511
m_mouseArea->setDraggedSprite(this);
@@ -758,8 +761,9 @@ void RenderedTarget::handleSceneMouseMove(qreal x, qreal y)
758761
Q_ASSERT(m_spriteModel && m_spriteModel->sprite());
759762
Q_ASSERT(m_engine);
760763
Sprite *sprite = m_spriteModel->sprite();
761-
sprite->setX(x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX);
762-
sprite->setY(-y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY);
764+
const double dragX = x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX;
765+
const double dragY = -y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY;
766+
sprite->dragToPosition(dragX, dragY);
763767
}
764768
}
765769

test/renderedtarget/renderedtarget_test.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ TEST_F(RenderedTargetTest, SpriteDragging)
443443
ASSERT_EQ(sprite.x(), 64.08);
444444
ASSERT_EQ(sprite.y(), -6.86);
445445
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
446+
ASSERT_FALSE(sprite.dragging());
446447

447448
// Try right mouse button (should not work)
448449
QMouseEvent moveEventRightButton(QEvent::MouseMove, QPointF(), QPointF(), Qt::RightButton, Qt::RightButton, Qt::NoModifier);
@@ -454,14 +455,17 @@ TEST_F(RenderedTargetTest, SpriteDragging)
454455
ASSERT_EQ(sprite.x(), 64.08);
455456
ASSERT_EQ(sprite.y(), -6.86);
456457
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
458+
ASSERT_FALSE(sprite.dragging());
457459
EXPECT_CALL(engine, clickTarget).Times(0);
458460
QCoreApplication::sendEvent(&target, &releaseEventRightButton);
459461
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
462+
ASSERT_FALSE(sprite.dragging());
460463

461464
emit mouseArea.mouseMoved(1064, 651);
462465
ASSERT_EQ(sprite.x(), 64.08);
463466
ASSERT_EQ(sprite.y(), -6.86);
464467
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
468+
ASSERT_FALSE(sprite.dragging());
465469

466470
// Try right mouse button with "draggable" set to true (should not work)
467471
sprite.setDraggable(true);
@@ -471,14 +475,17 @@ TEST_F(RenderedTargetTest, SpriteDragging)
471475
ASSERT_EQ(sprite.x(), 64.08);
472476
ASSERT_EQ(sprite.y(), -6.86);
473477
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
478+
ASSERT_FALSE(sprite.dragging());
474479
EXPECT_CALL(engine, clickTarget(&sprite));
475480
QCoreApplication::sendEvent(&target, &releaseEventRightButton);
476481
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
482+
ASSERT_FALSE(sprite.dragging());
477483

478484
emit mouseArea.mouseMoved(1064, 651);
479485
ASSERT_EQ(sprite.x(), 64.08);
480486
ASSERT_EQ(sprite.y(), -6.86);
481487
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
488+
ASSERT_FALSE(sprite.dragging());
482489

483490
// Try left mouse button (should not work with "draggable" set to false)
484491
sprite.setDraggable(false);
@@ -491,11 +498,13 @@ TEST_F(RenderedTargetTest, SpriteDragging)
491498
ASSERT_EQ(sprite.x(), 64.08);
492499
ASSERT_EQ(sprite.y(), -6.86);
493500
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
501+
ASSERT_FALSE(sprite.dragging());
494502

495503
emit mouseArea.mouseMoved(1064, 651);
496504
ASSERT_EQ(sprite.x(), 64.08);
497505
ASSERT_EQ(sprite.y(), -6.86);
498506
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
507+
ASSERT_FALSE(sprite.dragging());
499508
EXPECT_CALL(engine, clickTarget).Times(0);
500509
QCoreApplication::sendEvent(&target, &releaseEvent);
501510

@@ -510,6 +519,7 @@ TEST_F(RenderedTargetTest, SpriteDragging)
510519
ASSERT_EQ(sprite.x(), 64.08);
511520
ASSERT_EQ(sprite.y(), -6.86);
512521
ASSERT_EQ(mouseArea.draggedSprite(), &target);
522+
ASSERT_TRUE(sprite.dragging());
513523

514524
// Drag
515525
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
@@ -518,13 +528,15 @@ TEST_F(RenderedTargetTest, SpriteDragging)
518528
ASSERT_EQ(std::round(sprite.x() * 100) / 100, 61.22);
519529
ASSERT_EQ(std::round(sprite.y() * 100) / 100, -14.41);
520530
ASSERT_EQ(mouseArea.draggedSprite(), &target);
531+
ASSERT_TRUE(sprite.dragging());
521532

522533
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
523534
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
524535
emit mouseArea.mouseMoved(1092.47, 605.46);
525536
ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26);
526537
ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95);
527538
ASSERT_EQ(mouseArea.draggedSprite(), &target);
539+
ASSERT_TRUE(sprite.dragging());
528540

529541
// Create another sprite
530542
RenderedTarget anotherTarget;
@@ -540,12 +552,16 @@ TEST_F(RenderedTargetTest, SpriteDragging)
540552
anotherTarget.setStageScale(3.5);
541553
anotherTarget.setMouseArea(&mouseArea);
542554

555+
ASSERT_FALSE(anotherSprite.dragging());
556+
543557
// Try to drag the second sprite while the first is being dragged
544558
sprite.setDraggable(true);
545559
EXPECT_CALL(engine, clickTarget).Times(0);
546560
QCoreApplication::sendEvent(&anotherTarget, &pressEvent);
547561
QCoreApplication::sendEvent(&anotherTarget, &moveEvent);
548562
ASSERT_EQ(mouseArea.draggedSprite(), &target);
563+
ASSERT_TRUE(sprite.dragging());
564+
ASSERT_FALSE(anotherSprite.dragging());
549565
EXPECT_CALL(engine, clickTarget(&sprite));
550566
QCoreApplication::sendEvent(&anotherTarget, &releaseEvent);
551567

@@ -555,6 +571,8 @@ TEST_F(RenderedTargetTest, SpriteDragging)
555571
ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26);
556572
ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95);
557573
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
574+
ASSERT_FALSE(sprite.dragging());
575+
ASSERT_FALSE(anotherSprite.dragging());
558576
}
559577

560578
TEST_F(RenderedTargetTest, Engine)

0 commit comments

Comments
 (0)