Skip to content

Commit 7759191

Browse files
authored
Merge pull request #123 from scratchcpp/fix_dragging
Fix dragging bugs
2 parents f49fa1b + 85f7a56 commit 7759191

File tree

3 files changed

+44
-8
lines changed

3 files changed

+44
-8
lines changed

src/renderedtarget.cpp

+16-6
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,15 @@ void RenderedTarget::beforeRedraw()
180180
m_oldTexture = m_texture;
181181
update();
182182
}
183+
184+
// Update drag position
185+
if (m_spriteModel) {
186+
Sprite *sprite = m_spriteModel->sprite();
187+
Q_ASSERT(sprite);
188+
189+
if (sprite->dragging())
190+
sprite->dragToPosition(m_dragX, m_dragY);
191+
}
183192
}
184193

185194
void RenderedTarget::deinitClone()
@@ -486,9 +495,11 @@ void RenderedTarget::mouseReleaseEvent(QMouseEvent *event)
486495
Q_ASSERT(m_mouseArea);
487496

488497
// Stop dragging
489-
if (m_mouseArea->draggedSprite() == this)
498+
if (m_mouseArea->draggedSprite() == this) {
499+
Sprite *sprite = m_spriteModel->sprite();
500+
sprite->stopDragging();
490501
m_mouseArea->setDraggedSprite(nullptr);
491-
else if (m_engine && m_spriteModel && m_spriteModel->sprite()->draggable()) {
502+
} else if (m_engine && m_spriteModel && m_spriteModel->sprite()->draggable()) {
492503
// Notify libscratchcpp about the click
493504
m_engine->clickTarget(scratchTarget());
494505
}
@@ -503,6 +514,7 @@ void RenderedTarget::mouseMoveEvent(QMouseEvent *event)
503514
if (m_clicked && !m_mouseArea->draggedSprite() && m_spriteModel && m_spriteModel->sprite()->draggable()) {
504515
Q_ASSERT(m_engine);
505516
Sprite *sprite = m_spriteModel->sprite();
517+
sprite->startDragging();
506518
m_dragDeltaX = m_engine->mouseX() - sprite->x();
507519
m_dragDeltaY = m_engine->mouseY() - sprite->y();
508520
m_mouseArea->setDraggedSprite(this);
@@ -755,11 +767,9 @@ void RenderedTarget::handleSceneMouseMove(qreal x, qreal y)
755767
Q_ASSERT(m_mouseArea);
756768

757769
if (m_mouseArea->draggedSprite() == this) {
758-
Q_ASSERT(m_spriteModel && m_spriteModel->sprite());
759770
Q_ASSERT(m_engine);
760-
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);
771+
m_dragX = x / m_stageScale - m_engine->stageWidth() / 2.0 - m_dragDeltaX;
772+
m_dragY = -y / m_stageScale + m_engine->stageHeight() / 2.0 - m_dragDeltaY;
763773
}
764774
}
765775

src/renderedtarget.h

+2
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ class RenderedTarget : public IRenderedTarget
168168
bool m_convexHullDirty = true;
169169
std::vector<QPoint> m_hullPoints;
170170
bool m_clicked = false; // left mouse button only!
171+
double m_dragX = 0;
172+
double m_dragY = 0;
171173
double m_dragDeltaX = 0;
172174
double m_dragDeltaY = 0;
173175
};

test/renderedtarget/renderedtarget_test.cpp

+26-2
Original file line numberDiff line numberDiff line change
@@ -440,9 +440,11 @@ TEST_F(RenderedTargetTest, SpriteDragging)
440440
target.setMouseArea(&mouseArea);
441441

442442
emit mouseArea.mouseMoved(1064, 651);
443+
target.beforeRedraw();
443444
ASSERT_EQ(sprite.x(), 64.08);
444445
ASSERT_EQ(sprite.y(), -6.86);
445446
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
447+
ASSERT_FALSE(sprite.dragging());
446448

447449
// Try right mouse button (should not work)
448450
QMouseEvent moveEventRightButton(QEvent::MouseMove, QPointF(), QPointF(), Qt::RightButton, Qt::RightButton, Qt::NoModifier);
@@ -454,14 +456,18 @@ TEST_F(RenderedTargetTest, SpriteDragging)
454456
ASSERT_EQ(sprite.x(), 64.08);
455457
ASSERT_EQ(sprite.y(), -6.86);
456458
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
459+
ASSERT_FALSE(sprite.dragging());
457460
EXPECT_CALL(engine, clickTarget).Times(0);
458461
QCoreApplication::sendEvent(&target, &releaseEventRightButton);
459462
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
463+
ASSERT_FALSE(sprite.dragging());
460464

461465
emit mouseArea.mouseMoved(1064, 651);
466+
target.beforeRedraw();
462467
ASSERT_EQ(sprite.x(), 64.08);
463468
ASSERT_EQ(sprite.y(), -6.86);
464469
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
470+
ASSERT_FALSE(sprite.dragging());
465471

466472
// Try right mouse button with "draggable" set to true (should not work)
467473
sprite.setDraggable(true);
@@ -471,14 +477,18 @@ TEST_F(RenderedTargetTest, SpriteDragging)
471477
ASSERT_EQ(sprite.x(), 64.08);
472478
ASSERT_EQ(sprite.y(), -6.86);
473479
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
480+
ASSERT_FALSE(sprite.dragging());
474481
EXPECT_CALL(engine, clickTarget(&sprite));
475482
QCoreApplication::sendEvent(&target, &releaseEventRightButton);
476483
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
484+
ASSERT_FALSE(sprite.dragging());
477485

478486
emit mouseArea.mouseMoved(1064, 651);
487+
target.beforeRedraw();
479488
ASSERT_EQ(sprite.x(), 64.08);
480489
ASSERT_EQ(sprite.y(), -6.86);
481490
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
491+
ASSERT_FALSE(sprite.dragging());
482492

483493
// Try left mouse button (should not work with "draggable" set to false)
484494
sprite.setDraggable(false);
@@ -491,11 +501,14 @@ TEST_F(RenderedTargetTest, SpriteDragging)
491501
ASSERT_EQ(sprite.x(), 64.08);
492502
ASSERT_EQ(sprite.y(), -6.86);
493503
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
504+
ASSERT_FALSE(sprite.dragging());
494505

495506
emit mouseArea.mouseMoved(1064, 651);
507+
target.beforeRedraw();
496508
ASSERT_EQ(sprite.x(), 64.08);
497509
ASSERT_EQ(sprite.y(), -6.86);
498510
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
511+
ASSERT_FALSE(sprite.dragging());
499512
EXPECT_CALL(engine, clickTarget).Times(0);
500513
QCoreApplication::sendEvent(&target, &releaseEvent);
501514

@@ -510,21 +523,26 @@ TEST_F(RenderedTargetTest, SpriteDragging)
510523
ASSERT_EQ(sprite.x(), 64.08);
511524
ASSERT_EQ(sprite.y(), -6.86);
512525
ASSERT_EQ(mouseArea.draggedSprite(), &target);
526+
ASSERT_TRUE(sprite.dragging());
513527

514528
// Drag
515529
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
516530
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
517531
emit mouseArea.mouseMoved(1067.8, 649.06);
532+
target.beforeRedraw();
518533
ASSERT_EQ(std::round(sprite.x() * 100) / 100, 61.22);
519534
ASSERT_EQ(std::round(sprite.y() * 100) / 100, -14.41);
520535
ASSERT_EQ(mouseArea.draggedSprite(), &target);
536+
ASSERT_TRUE(sprite.dragging());
521537

522538
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
523539
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
524540
emit mouseArea.mouseMoved(1092.47, 605.46);
541+
target.beforeRedraw();
525542
ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26);
526543
ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95);
527544
ASSERT_EQ(mouseArea.draggedSprite(), &target);
545+
ASSERT_TRUE(sprite.dragging());
528546

529547
// Create another sprite
530548
RenderedTarget anotherTarget;
@@ -536,17 +554,21 @@ TEST_F(RenderedTargetTest, SpriteDragging)
536554
anotherSprite.setY(-6.86);
537555
anotherSprite.setDraggable(true);
538556
anotherModel.init(&anotherSprite);
539-
anotherTarget.setSpriteModel(&model);
557+
anotherTarget.setSpriteModel(&anotherModel);
540558
anotherTarget.setStageScale(3.5);
541559
anotherTarget.setMouseArea(&mouseArea);
542560

561+
ASSERT_FALSE(anotherSprite.dragging());
562+
543563
// Try to drag the second sprite while the first is being dragged
544564
sprite.setDraggable(true);
545565
EXPECT_CALL(engine, clickTarget).Times(0);
546566
QCoreApplication::sendEvent(&anotherTarget, &pressEvent);
547567
QCoreApplication::sendEvent(&anotherTarget, &moveEvent);
548568
ASSERT_EQ(mouseArea.draggedSprite(), &target);
549-
EXPECT_CALL(engine, clickTarget(&sprite));
569+
ASSERT_TRUE(sprite.dragging());
570+
ASSERT_FALSE(anotherSprite.dragging());
571+
EXPECT_CALL(engine, clickTarget(&anotherSprite));
550572
QCoreApplication::sendEvent(&anotherTarget, &releaseEvent);
551573

552574
// Stop dragging
@@ -555,6 +577,8 @@ TEST_F(RenderedTargetTest, SpriteDragging)
555577
ASSERT_EQ(std::round(sprite.x() * 100) / 100, 68.26);
556578
ASSERT_EQ(std::round(sprite.y() * 100) / 100, -1.95);
557579
ASSERT_EQ(mouseArea.draggedSprite(), nullptr);
580+
ASSERT_FALSE(sprite.dragging());
581+
ASSERT_FALSE(anotherSprite.dragging());
558582
}
559583

560584
TEST_F(RenderedTargetTest, Engine)

0 commit comments

Comments
 (0)