Skip to content

Commit 63dd35a

Browse files
authored
Merge pull request #143 from scratchcpp/running_api
Add project running API
2 parents 64ad83d + 5727bde commit 63dd35a

File tree

6 files changed

+45
-8
lines changed

6 files changed

+45
-8
lines changed

src/ProjectPlayer.qml

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ ProjectScene {
1111
readonly property string fileName: loader.fileName
1212
property int stageWidth: 480
1313
property int stageHeight: 360
14+
readonly property bool running: loader.running
1415
property alias fps: loader.fps
1516
property alias turboMode: loader.turboMode
1617
property alias cloneLimit: loader.cloneLimit

src/projectloader.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ bool ProjectLoader::loadStatus() const
128128
return m_loadStatus;
129129
}
130130

131+
bool ProjectLoader::running() const
132+
{
133+
return m_running;
134+
}
135+
131136
IEngine *ProjectLoader::engine() const
132137
{
133138
if (m_loadThread.isRunning())
@@ -216,9 +221,15 @@ void ProjectLoader::timerEvent(QTimerEvent *event)
216221
if (m_loadThread.isRunning())
217222
return;
218223

219-
if (m_engine)
224+
if (m_engine) {
220225
m_engine->step();
221226

227+
if (m_running != m_engine->isRunning()) {
228+
m_running = !m_running;
229+
emit runningChanged();
230+
}
231+
}
232+
222233
event->accept();
223234
}
224235

src/projectloader.h

+5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class ProjectLoader : public QObject
2424
QML_ELEMENT
2525
Q_PROPERTY(QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged)
2626
Q_PROPERTY(bool loadStatus READ loadStatus NOTIFY loadStatusChanged)
27+
Q_PROPERTY(bool running READ running NOTIFY runningChanged)
2728
Q_PROPERTY(libscratchcpp::IEngine *engine READ engine NOTIFY engineChanged)
2829
Q_PROPERTY(StageModel *stage READ stage NOTIFY stageChanged)
2930
Q_PROPERTY(QQmlListProperty<SpriteModel> sprites READ sprites NOTIFY spritesChanged)
@@ -48,6 +49,8 @@ class ProjectLoader : public QObject
4849

4950
bool loadStatus() const;
5051

52+
bool running() const;
53+
5154
libscratchcpp::IEngine *engine() const;
5255
void setEngine(libscratchcpp::IEngine *engine);
5356

@@ -96,6 +99,7 @@ class ProjectLoader : public QObject
9699
void fileNameChanged();
97100
void loadStatusChanged();
98101
void loadingFinished();
102+
void runningChanged();
99103
void engineChanged();
100104
void stageChanged();
101105
void spritesChanged();
@@ -135,6 +139,7 @@ class ProjectLoader : public QObject
135139
QString m_fileName;
136140
QFuture<void> m_loadThread;
137141
libscratchcpp::Project m_project;
142+
bool m_running = false;
138143
libscratchcpp::IEngine *m_engine = nullptr;
139144
QMutex m_engineMutex;
140145
bool m_loadStatus = false;

test/mocks/enginemock.h

+3-6
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ class EngineMock : public IEngine
1919
MOCK_METHOD(void, start, (), (override));
2020
MOCK_METHOD(void, stop, (), (override));
2121
MOCK_METHOD(VirtualMachine *, startScript, (std::shared_ptr<Block>, Target *), (override));
22-
MOCK_METHOD(void, broadcast, (int), (override));
23-
MOCK_METHOD(void, broadcastByPtr, (Broadcast *), (override));
24-
MOCK_METHOD(void, startBackdropScripts, (Broadcast *), (override));
22+
MOCK_METHOD(void, broadcast, (int, VirtualMachine *), (override));
23+
MOCK_METHOD(void, broadcastByPtr, (Broadcast *, VirtualMachine *), (override));
24+
MOCK_METHOD(void, startBackdropScripts, (Broadcast *, VirtualMachine *), (override));
2525
MOCK_METHOD(void, stopScript, (VirtualMachine *), (override));
2626
MOCK_METHOD(void, stopTarget, (Target *, VirtualMachine *), (override));
2727
MOCK_METHOD(void, initClone, (std::shared_ptr<Sprite>), (override));
@@ -82,9 +82,6 @@ class EngineMock : public IEngine
8282
MOCK_METHOD(bool, spriteFencingEnabled, (), (const, override));
8383
MOCK_METHOD(void, setSpriteFencingEnabled, (bool), (override));
8484

85-
MOCK_METHOD(bool, broadcastRunning, (unsigned int), (override));
86-
MOCK_METHOD(bool, broadcastByPtrRunning, (Broadcast *), (override));
87-
8885
MOCK_METHOD(void, requestRedraw, (), (override));
8986

9087
MOCK_METHOD(ITimer *, timer, (), (const, override));

test/projectloader/projectloader_test.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,35 @@ TEST_F(ProjectLoaderTest, StartStop)
163163
TEST_F(ProjectLoaderTest, TimerEvent)
164164
{
165165
ProjectLoader loader;
166+
ASSERT_FALSE(loader.running());
166167
EngineMock engine;
167168
loader.setEngine(&engine);
168169
QTimerEvent event(0);
169170

171+
QSignalSpy runningSpy(&loader, &ProjectLoader::runningChanged);
170172
EXPECT_CALL(engine, step());
173+
EXPECT_CALL(engine, isRunning()).WillOnce(Return(false));
171174
QCoreApplication::sendEvent(&loader, &event);
175+
ASSERT_FALSE(loader.running());
176+
ASSERT_TRUE(runningSpy.empty());
177+
178+
EXPECT_CALL(engine, step());
179+
EXPECT_CALL(engine, isRunning()).WillOnce(Return(true));
180+
QCoreApplication::sendEvent(&loader, &event);
181+
ASSERT_TRUE(loader.running());
182+
ASSERT_EQ(runningSpy.size(), 1);
183+
184+
EXPECT_CALL(engine, step());
185+
EXPECT_CALL(engine, isRunning()).WillOnce(Return(true));
186+
QCoreApplication::sendEvent(&loader, &event);
187+
ASSERT_TRUE(loader.running());
188+
ASSERT_EQ(runningSpy.size(), 1);
189+
190+
EXPECT_CALL(engine, step());
191+
EXPECT_CALL(engine, isRunning()).WillOnce(Return(false));
192+
QCoreApplication::sendEvent(&loader, &event);
193+
ASSERT_FALSE(loader.running());
194+
ASSERT_EQ(runningSpy.size(), 2);
172195
}
173196

174197
TEST_F(ProjectLoaderTest, QuestionAsked)

0 commit comments

Comments
 (0)