Skip to content

Commit cbffa76

Browse files
authored
Merge pull request #554 from scratchcpp/clear_things_on_stop
Clear questions, text bubbles and graphic effects when project/thread stops
2 parents e5ba513 + ba283bc commit cbffa76

File tree

7 files changed

+37
-0
lines changed

7 files changed

+37
-0
lines changed

include/scratchcpp/iengine.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,9 @@ class LIBSCRATCHCPP_EXPORT IEngine
370370
/*! Emits when a question is asked, for example using the 'ask and wait' block. */
371371
virtual sigslot::signal<const std::string &> &questionAsked() = 0;
372372

373+
/*! Emits when the current question is aborted. */
374+
virtual sigslot::signal<> &questionAborted() = 0;
375+
373376
/*! Emits when a question is answered. */
374377
virtual sigslot::signal<const std::string &> &questionAnswered() = 0;
375378

src/blocks/looksblocks.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,15 @@ void LooksBlocks::onInit(IEngine *engine)
103103
m_timeMap.erase(vm);
104104
erase_if(m_waitingBubbles, [vm](const std::pair<Target *, VirtualMachine *> &pair) { return pair.second == vm; });
105105
});
106+
107+
engine->stopped().connect([engine]() {
108+
const auto &targets = engine->targets();
109+
110+
for (auto target : targets) {
111+
target->setBubbleText("");
112+
target->clearGraphicsEffects();
113+
}
114+
});
106115
}
107116

108117
void LooksBlocks::compileSayForSecs(Compiler *compiler)

src/blocks/sensingblocks.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,22 @@ void SensingBlocks::registerBlocks(IEngine *engine)
9595
engine->questionAnswered().connect(&onAnswer);
9696
}
9797

98+
void SensingBlocks::onInit(IEngine *engine)
99+
{
100+
engine->threadAboutToStop().connect([engine](VirtualMachine *thread) {
101+
if (!m_questionList.empty()) {
102+
// Abort the question of this thread if it's currently being displayed
103+
if (m_questionList.front()->vm == thread) {
104+
thread->target()->setBubbleText("");
105+
engine->questionAborted()();
106+
}
107+
108+
m_questionList
109+
.erase(std::remove_if(m_questionList.begin(), m_questionList.end(), [thread](const std::unique_ptr<Question> &question) { return question->vm == thread; }), m_questionList.end());
110+
}
111+
});
112+
}
113+
98114
void SensingBlocks::compileTouchingObject(Compiler *compiler)
99115
{
100116
Input *input = compiler->input(TOUCHINGOBJECTMENU);

src/blocks/sensingblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class SensingBlocks : public IBlockSection
6060
std::string name() const override;
6161

6262
void registerBlocks(IEngine *engine) override;
63+
void onInit(IEngine *engine) override;
6364

6465
static void compileTouchingObject(Compiler *compiler);
6566
static void compileTouchingColor(Compiler *compiler);

src/engine/internal/engine.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1349,6 +1349,11 @@ sigslot::signal<const std::string &> &Engine::questionAsked()
13491349
return m_questionAsked;
13501350
}
13511351

1352+
sigslot::signal<> &Engine::questionAborted()
1353+
{
1354+
return m_questionAborted;
1355+
}
1356+
13521357
sigslot::signal<const std::string &> &Engine::questionAnswered()
13531358
{
13541359
return m_questionAnswered;

src/engine/internal/engine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ class Engine : public IEngine
154154
sigslot::signal<Monitor *, IMonitorHandler *> &monitorRemoved() override;
155155

156156
sigslot::signal<const std::string &> &questionAsked() override;
157+
sigslot::signal<> &questionAborted() override;
157158
sigslot::signal<const std::string &> &questionAnswered() override;
158159

159160
const std::vector<std::string> &extensions() const override;
@@ -284,6 +285,7 @@ class Engine : public IEngine
284285
sigslot::signal<Monitor *> m_monitorAdded;
285286
sigslot::signal<Monitor *, IMonitorHandler *> m_monitorRemoved;
286287
sigslot::signal<const std::string &> m_questionAsked;
288+
sigslot::signal<> m_questionAborted;
287289
sigslot::signal<const std::string &> m_questionAnswered;
288290
};
289291

test/mocks/enginemock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ class EngineMock : public IEngine
134134
MOCK_METHOD((sigslot::signal<Monitor *, IMonitorHandler *> &), monitorRemoved, (), (override));
135135

136136
MOCK_METHOD(sigslot::signal<const std::string &> &, questionAsked, (), (override));
137+
MOCK_METHOD(sigslot::signal<> &, questionAborted, (), (override));
137138
MOCK_METHOD(sigslot::signal<const std::string &> &, questionAnswered, (), (override));
138139

139140
MOCK_METHOD(std::vector<std::string> &, extensions, (), (const, override));

0 commit comments

Comments
 (0)