From 8b4d19b2f6658548564167b6d850b1347e4e65e2 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:40:12 +0100 Subject: [PATCH 1/3] Implement costume changes in target interfaces --- include/scratchcpp/ispritehandler.h | 2 +- include/scratchcpp/istagehandler.h | 2 +- include/scratchcpp/stage.h | 3 +++ src/scratch/sprite.cpp | 3 +++ src/scratch/sprite_p.cpp | 6 ------ src/scratch/sprite_p.h | 1 - src/scratch/stage.cpp | 10 ++++++++++ src/scratch/stage_p.cpp | 6 ------ src/scratch/stage_p.h | 2 -- test/mocks/spritehandlermock.h | 2 +- test/mocks/stagehandlermock.h | 2 +- test/target_interfaces/ispritehandler_test.cpp | 17 ++++++++++++++--- test/target_interfaces/istagehandler_test.cpp | 15 ++++++++++++--- 13 files changed, 46 insertions(+), 25 deletions(-) diff --git a/include/scratchcpp/ispritehandler.h b/include/scratchcpp/ispritehandler.h index 310abba8..593e25d9 100644 --- a/include/scratchcpp/ispritehandler.h +++ b/include/scratchcpp/ispritehandler.h @@ -18,7 +18,7 @@ class LIBSCRATCHCPP_EXPORT ISpriteHandler virtual void onCloned(Sprite *clone) = 0; - virtual void onCostumeChanged(const char *data) = 0; + virtual void onCostumeChanged(Costume *costume) = 0; virtual void onVisibleChanged(bool visible) = 0; virtual void onXChanged(double x) = 0; diff --git a/include/scratchcpp/istagehandler.h b/include/scratchcpp/istagehandler.h index 03e7e8aa..d46b210d 100644 --- a/include/scratchcpp/istagehandler.h +++ b/include/scratchcpp/istagehandler.h @@ -16,7 +16,7 @@ class LIBSCRATCHCPP_EXPORT IStageHandler virtual void onStageChanged(Stage *stage) = 0; - virtual void onCostumeChanged(const char *data) = 0; + virtual void onCostumeChanged(Costume *costume) = 0; virtual void onTempoChanged(int tempo) = 0; virtual void onVideoStateChanged(Stage::VideoState videoState) = 0; diff --git a/include/scratchcpp/stage.h b/include/scratchcpp/stage.h index 0c11e681..fac3c207 100644 --- a/include/scratchcpp/stage.h +++ b/include/scratchcpp/stage.h @@ -29,6 +29,9 @@ class LIBSCRATCHCPP_EXPORT Stage : public Target void setInterface(IStageHandler *newInterface); bool isStage() const override; + + void setCostumeIndex(int newCostumeIndex); + int tempo() const; void setTempo(int newTempo); diff --git a/src/scratch/sprite.cpp b/src/scratch/sprite.cpp index 1579ee41..4509805d 100644 --- a/src/scratch/sprite.cpp +++ b/src/scratch/sprite.cpp @@ -246,6 +246,9 @@ void Sprite::setCostumeIndex(int newCostumeIndex) } Target::setCostumeIndex(newCostumeIndex); + + if (costume && impl->iface) + impl->iface->onCostumeChanged(costume.get()); } /*! Returns the direction. */ diff --git a/src/scratch/sprite_p.cpp b/src/scratch/sprite_p.cpp index 27ff0de4..a44509fd 100644 --- a/src/scratch/sprite_p.cpp +++ b/src/scratch/sprite_p.cpp @@ -31,12 +31,6 @@ void SpritePrivate::removeClone(Sprite *clone) } } -void SpritePrivate::setCostumeData(const char *data) -{ - if (iface) - iface->onCostumeChanged(data); -} - void SpritePrivate::getBoundingRect(Rect *out) const { assert(out); diff --git a/src/scratch/sprite_p.h b/src/scratch/sprite_p.h index 26a439ae..9dcff450 100644 --- a/src/scratch/sprite_p.h +++ b/src/scratch/sprite_p.h @@ -17,7 +17,6 @@ struct SpritePrivate void removeClone(Sprite *clone); - void setCostumeData(const char *data); void getBoundingRect(Rect *out) const; void getFencedPosition(double inX, double inY, double *outX, double *outY) const; diff --git a/src/scratch/stage.cpp b/src/scratch/stage.cpp index fdc1939e..9ed6518a 100644 --- a/src/scratch/stage.cpp +++ b/src/scratch/stage.cpp @@ -29,6 +29,16 @@ bool Stage::isStage() const return true; } +/*! Overrides Target#setCostumeIndex(). */ +void Stage::setCostumeIndex(int newCostumeIndex) +{ + Target::setCostumeIndex(newCostumeIndex); + auto costume = costumeAt(newCostumeIndex); + + if (impl->iface) + impl->iface->onCostumeChanged(costume.get()); +} + /*! Returns the tempo. */ int Stage::tempo() const { diff --git a/src/scratch/stage_p.cpp b/src/scratch/stage_p.cpp index a511822e..113053d4 100644 --- a/src/scratch/stage_p.cpp +++ b/src/scratch/stage_p.cpp @@ -9,9 +9,3 @@ using namespace libscratchcpp; StagePrivate::StagePrivate() { } - -void StagePrivate::setCostumeData(const char *data) -{ - if (iface) - iface->onCostumeChanged(data); -} diff --git a/src/scratch/stage_p.h b/src/scratch/stage_p.h index 2d152d5b..9f3f4089 100644 --- a/src/scratch/stage_p.h +++ b/src/scratch/stage_p.h @@ -12,8 +12,6 @@ struct StagePrivate StagePrivate(); StagePrivate(const StagePrivate &) = delete; - void setCostumeData(const char *data); - IStageHandler *iface = nullptr; int tempo = 60; Stage::VideoState videoState = Stage::VideoState::Off; diff --git a/test/mocks/spritehandlermock.h b/test/mocks/spritehandlermock.h index 72863305..d7ac1027 100644 --- a/test/mocks/spritehandlermock.h +++ b/test/mocks/spritehandlermock.h @@ -12,7 +12,7 @@ class SpriteHandlerMock : public ISpriteHandler MOCK_METHOD(void, onCloned, (Sprite *), (override)); - MOCK_METHOD(void, onCostumeChanged, (const char *), (override)); + MOCK_METHOD(void, onCostumeChanged, (Costume *), (override)); MOCK_METHOD(void, onVisibleChanged, (bool), (override)); MOCK_METHOD(void, onXChanged, (double), (override)); diff --git a/test/mocks/stagehandlermock.h b/test/mocks/stagehandlermock.h index ada61679..afb93de8 100644 --- a/test/mocks/stagehandlermock.h +++ b/test/mocks/stagehandlermock.h @@ -10,7 +10,7 @@ class StageHandlerMock : public IStageHandler public: MOCK_METHOD(void, onStageChanged, (Stage *), (override)); - MOCK_METHOD(void, onCostumeChanged, (const char *), (override)); + MOCK_METHOD(void, onCostumeChanged, (Costume *), (override)); MOCK_METHOD(void, onTempoChanged, (int), (override)); MOCK_METHOD(void, onVideoStateChanged, (Stage::VideoState), (override)); diff --git a/test/target_interfaces/ispritehandler_test.cpp b/test/target_interfaces/ispritehandler_test.cpp index d34c20d3..9d6b14f4 100644 --- a/test/target_interfaces/ispritehandler_test.cpp +++ b/test/target_interfaces/ispritehandler_test.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -110,8 +111,18 @@ TEST_F(ISpriteHandlerTest, RotationStyle) m_sprite.setRotationStyle(Sprite::RotationStyle::LeftRight); } -TEST_F(ISpriteHandlerTest, CostumeData) +TEST_F(ISpriteHandlerTest, Costume) { - // TODO: Add test for costume data - // EXPECT_CALL(m_handler, onCostumeChanged(...)).Times(1); + auto costume1 = std::make_shared("", "", ""); + auto costume2 = std::make_shared("", "", ""); + m_sprite.addCostume(costume1); + m_sprite.addCostume(costume2); + + EXPECT_CALL(m_handler, onCostumeChanged(costume1.get())); + EXPECT_CALL(m_engine, requestRedraw()); + m_sprite.setCostumeIndex(0); + + EXPECT_CALL(m_handler, onCostumeChanged(costume2.get())); + EXPECT_CALL(m_engine, requestRedraw()); + m_sprite.setCostumeIndex(1); } diff --git a/test/target_interfaces/istagehandler_test.cpp b/test/target_interfaces/istagehandler_test.cpp index 994183ff..2df959f5 100644 --- a/test/target_interfaces/istagehandler_test.cpp +++ b/test/target_interfaces/istagehandler_test.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "../common.h" @@ -33,8 +34,16 @@ TEST_F(IStageHandlerTest, VideoState) m_stage.setVideoState(Stage::VideoState::OnFlipped); } -TEST_F(IStageHandlerTest, CostumeData) +TEST_F(IStageHandlerTest, Costume) { - // TODO: Add test for costume data - // EXPECT_CALL(m_handler, onCostumeChanged(...)).Times(1); + auto costume1 = std::make_shared("", "", ""); + auto costume2 = std::make_shared("", "", ""); + m_stage.addCostume(costume1); + m_stage.addCostume(costume2); + + EXPECT_CALL(m_handler, onCostumeChanged(costume1.get())); + m_stage.setCostumeIndex(0); + + EXPECT_CALL(m_handler, onCostumeChanged(costume2.get())); + m_stage.setCostumeIndex(1); } From 2325f46fe2aaf22d2b8fb19805a2ff93ad903dff Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:42:41 +0100 Subject: [PATCH 2/3] Rename target interface init function --- include/scratchcpp/ispritehandler.h | 2 +- include/scratchcpp/istagehandler.h | 2 +- src/scratch/sprite.cpp | 2 +- src/scratch/stage.cpp | 2 +- test/mocks/spritehandlermock.h | 2 +- test/mocks/stagehandlermock.h | 2 +- test/target_interfaces/ispritehandler_test.cpp | 2 +- test/target_interfaces/istagehandler_test.cpp | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/scratchcpp/ispritehandler.h b/include/scratchcpp/ispritehandler.h index 593e25d9..ec6a3e85 100644 --- a/include/scratchcpp/ispritehandler.h +++ b/include/scratchcpp/ispritehandler.h @@ -14,7 +14,7 @@ class LIBSCRATCHCPP_EXPORT ISpriteHandler public: virtual ~ISpriteHandler() { } - virtual void onSpriteChanged(Sprite *sprite) = 0; + virtual void init(Sprite *sprite) = 0; virtual void onCloned(Sprite *clone) = 0; diff --git a/include/scratchcpp/istagehandler.h b/include/scratchcpp/istagehandler.h index d46b210d..d8eeeeeb 100644 --- a/include/scratchcpp/istagehandler.h +++ b/include/scratchcpp/istagehandler.h @@ -14,7 +14,7 @@ class LIBSCRATCHCPP_EXPORT IStageHandler public: virtual ~IStageHandler() { } - virtual void onStageChanged(Stage *stage) = 0; + virtual void init(Stage *stage) = 0; virtual void onCostumeChanged(Costume *costume) = 0; diff --git a/src/scratch/sprite.cpp b/src/scratch/sprite.cpp index 4509805d..f97f1dea 100644 --- a/src/scratch/sprite.cpp +++ b/src/scratch/sprite.cpp @@ -44,7 +44,7 @@ void Sprite::setInterface(ISpriteHandler *newInterface) { assert(newInterface); impl->iface = newInterface; - impl->iface->onSpriteChanged(this); + impl->iface->init(this); } /*! Creates a clone of the sprite. */ diff --git a/src/scratch/stage.cpp b/src/scratch/stage.cpp index 9ed6518a..1993f3cf 100644 --- a/src/scratch/stage.cpp +++ b/src/scratch/stage.cpp @@ -20,7 +20,7 @@ void Stage::setInterface(IStageHandler *newInterface) { assert(newInterface); impl->iface = newInterface; - impl->iface->onStageChanged(this); + impl->iface->init(this); } /*! Returns true. */ diff --git a/test/mocks/spritehandlermock.h b/test/mocks/spritehandlermock.h index d7ac1027..da1f4e66 100644 --- a/test/mocks/spritehandlermock.h +++ b/test/mocks/spritehandlermock.h @@ -8,7 +8,7 @@ using namespace libscratchcpp; class SpriteHandlerMock : public ISpriteHandler { public: - MOCK_METHOD(void, onSpriteChanged, (Sprite *), (override)); + MOCK_METHOD(void, init, (Sprite *), (override)); MOCK_METHOD(void, onCloned, (Sprite *), (override)); diff --git a/test/mocks/stagehandlermock.h b/test/mocks/stagehandlermock.h index afb93de8..d74071b6 100644 --- a/test/mocks/stagehandlermock.h +++ b/test/mocks/stagehandlermock.h @@ -8,7 +8,7 @@ using namespace libscratchcpp; class StageHandlerMock : public IStageHandler { public: - MOCK_METHOD(void, onStageChanged, (Stage *), (override)); + MOCK_METHOD(void, init, (Stage *), (override)); MOCK_METHOD(void, onCostumeChanged, (Costume *), (override)); diff --git a/test/target_interfaces/ispritehandler_test.cpp b/test/target_interfaces/ispritehandler_test.cpp index 9d6b14f4..d344727c 100644 --- a/test/target_interfaces/ispritehandler_test.cpp +++ b/test/target_interfaces/ispritehandler_test.cpp @@ -15,7 +15,7 @@ class ISpriteHandlerTest : public testing::Test public: void SetUp() override { - EXPECT_CALL(m_handler, onSpriteChanged(&m_sprite)).Times(1); + EXPECT_CALL(m_handler, init(&m_sprite)).Times(1); m_sprite.setInterface(&m_handler); m_sprite.setEngine(&m_engine); } diff --git a/test/target_interfaces/istagehandler_test.cpp b/test/target_interfaces/istagehandler_test.cpp index 2df959f5..76755eb2 100644 --- a/test/target_interfaces/istagehandler_test.cpp +++ b/test/target_interfaces/istagehandler_test.cpp @@ -11,7 +11,7 @@ class IStageHandlerTest : public testing::Test public: void SetUp() override { - EXPECT_CALL(m_handler, onStageChanged(&m_stage)).Times(1); + EXPECT_CALL(m_handler, init(&m_stage)).Times(1); m_stage.setInterface(&m_handler); } From b2d541f7a3f23bd9165a7c9fe057718375de9959 Mon Sep 17 00:00:00 2001 From: adazem009 <68537469+adazem009@users.noreply.github.com> Date: Sat, 25 Nov 2023 15:47:00 +0100 Subject: [PATCH 3/3] Document methods of target interfaces --- include/scratchcpp/ispritehandler.h | 14 ++++++++++++++ include/scratchcpp/istagehandler.h | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/include/scratchcpp/ispritehandler.h b/include/scratchcpp/ispritehandler.h index ec6a3e85..582c3387 100644 --- a/include/scratchcpp/ispritehandler.h +++ b/include/scratchcpp/ispritehandler.h @@ -14,17 +14,31 @@ class LIBSCRATCHCPP_EXPORT ISpriteHandler public: virtual ~ISpriteHandler() { } + /*! Called when the interface is set on a sprite. */ virtual void init(Sprite *sprite) = 0; + /*! Called when the sprite clones. */ virtual void onCloned(Sprite *clone) = 0; + /*! Called when the costume changes. */ virtual void onCostumeChanged(Costume *costume) = 0; + /*! Called when the visibility changes. */ virtual void onVisibleChanged(bool visible) = 0; + + /*! Called when the X-coordinate changes. */ virtual void onXChanged(double x) = 0; + + /*! Called when the Y-coordinate changes. */ virtual void onYChanged(double y) = 0; + + /*! Called when the size changes. */ virtual void onSizeChanged(double size) = 0; + + /*! Called when the direction changes. */ virtual void onDirectionChanged(double direction) = 0; + + /*! Called when the rotation style changes. */ virtual void onRotationStyleChanged(Sprite::RotationStyle rotationStyle) = 0; }; diff --git a/include/scratchcpp/istagehandler.h b/include/scratchcpp/istagehandler.h index d8eeeeeb..37441fb1 100644 --- a/include/scratchcpp/istagehandler.h +++ b/include/scratchcpp/istagehandler.h @@ -14,12 +14,19 @@ class LIBSCRATCHCPP_EXPORT IStageHandler public: virtual ~IStageHandler() { } + /*! Called when the interface is set on a stage. */ virtual void init(Stage *stage) = 0; + /*! Called when the costume changes. */ virtual void onCostumeChanged(Costume *costume) = 0; + /*! Called when the tempo changes. */ virtual void onTempoChanged(int tempo) = 0; + + /*! Called when the video state changes. */ virtual void onVideoStateChanged(Stage::VideoState videoState) = 0; + + /*! Called when the video transparency changes. */ virtual void onVideoTransparencyChanged(int videoTransparency) = 0; };