Skip to content

Commit 302cd32

Browse files
authored
Merge pull request #38 from scratchcpp/engine_properties_api
Add engine properties API
2 parents 6236266 + c459307 commit 302cd32

File tree

4 files changed

+170
-8
lines changed

4 files changed

+170
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ Button {
124124
- [x] JPEG and PNG rendering
125125
- [x] Everything related to displaying sprites (position, rotation, size, etc.)
126126
- [ ] Loading projects in another thread
127-
- [ ] API for engine properties (FPS, turbo mode, etc.)
127+
- [x] API for engine properties (FPS, turbo mode, etc.)
128128
- [ ] Loading projects from URL
129129
- [ ] SVG rendering
130130
- [ ] Mouse position

ScratchCPPGui/ProjectPlayer.qml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@ import ScratchCPPGui
55

66
ProjectScene {
77
property string fileName
8-
property int stageWidth: 480
9-
property int stageHeight: 360
8+
property alias fps: loader.fps
9+
property alias turboMode: loader.turboMode
10+
property alias cloneLimit: loader.cloneLimit
11+
property alias spriteFencing: loader.spriteFencing
1012

1113
id: root
12-
width: stageWidth
13-
height: stageHeight
14-
clip: true
14+
clip: true
1515

1616
ProjectLoader {
1717
id: loader
1818
fileName: root.fileName
19+
stageWidth: parent.width
20+
stageHeight: parent.height
1921
}
2022

2123
RenderedTarget {

ScratchCPPGui/projectloader.cpp

Lines changed: 126 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,31 @@ void ProjectLoader::setFileName(const QString &newFileName)
5858
m_project.setFileName(m_fileName.toStdString());
5959
m_loaded = m_project.load();
6060
m_engine = m_project.engine().get();
61-
auto handler = std::bind(&ProjectLoader::emitTick, this);
62-
m_engine->setRedrawHandler(std::function<void()>(handler));
6361

6462
// Delete old sprites
6563
for (SpriteModel *sprite : m_sprites)
6664
sprite->deleteLater();
6765

6866
m_sprites.clear();
6967

68+
if (!m_engine) {
69+
emit fileNameChanged();
70+
emit loadedChanged();
71+
emit engineChanged();
72+
emit spritesChanged();
73+
return;
74+
}
75+
76+
m_engine->setFps(m_fps);
77+
m_engine->setTurboModeEnabled(m_turboMode);
78+
m_engine->setStageWidth(m_stageWidth);
79+
m_engine->setStageHeight(m_stageHeight);
80+
m_engine->setCloneLimit(m_cloneLimit);
81+
m_engine->setSpriteFencingEnabled(m_spriteFencing);
82+
83+
auto handler = std::bind(&ProjectLoader::emitTick, this);
84+
m_engine->setRedrawHandler(std::function<void()>(handler));
85+
7086
// Load targets
7187
const auto &targets = m_engine->targets();
7288

@@ -160,3 +176,111 @@ void ProjectLoader::emitTick()
160176
renderedTarget->loadProperties();
161177
}
162178
}
179+
180+
double ProjectLoader::fps() const
181+
{
182+
return m_fps;
183+
}
184+
185+
void ProjectLoader::setFps(double newFps)
186+
{
187+
if (qFuzzyCompare(m_fps, newFps))
188+
return;
189+
190+
m_fps = newFps;
191+
192+
if (m_engine)
193+
m_engine->setFps(m_fps);
194+
195+
emit fpsChanged();
196+
}
197+
198+
bool ProjectLoader::turboMode() const
199+
{
200+
return m_turboMode;
201+
}
202+
203+
void ProjectLoader::setTurboMode(bool newTurboMode)
204+
{
205+
if (m_turboMode == newTurboMode)
206+
return;
207+
208+
m_turboMode = newTurboMode;
209+
210+
if (m_engine)
211+
m_engine->setTurboModeEnabled(m_turboMode);
212+
213+
emit turboModeChanged();
214+
}
215+
216+
unsigned int ProjectLoader::stageWidth() const
217+
{
218+
return m_stageWidth;
219+
}
220+
221+
void ProjectLoader::setStageWidth(unsigned int newStageWidth)
222+
{
223+
if (m_stageWidth == newStageWidth)
224+
return;
225+
226+
m_stageWidth = newStageWidth;
227+
228+
if (m_engine)
229+
m_engine->setStageWidth(m_stageWidth);
230+
231+
emit stageWidthChanged();
232+
}
233+
234+
unsigned int ProjectLoader::stageHeight() const
235+
{
236+
return m_stageHeight;
237+
}
238+
239+
void ProjectLoader::setStageHeight(unsigned int newStageHeight)
240+
{
241+
if (m_stageHeight == newStageHeight)
242+
return;
243+
244+
m_stageHeight = newStageHeight;
245+
246+
if (m_engine)
247+
m_engine->setStageHeight(m_stageHeight);
248+
249+
emit stageHeightChanged();
250+
}
251+
252+
int ProjectLoader::cloneLimit() const
253+
{
254+
return m_cloneLimit;
255+
}
256+
257+
void ProjectLoader::setCloneLimit(int newCloneLimit)
258+
{
259+
if (m_cloneLimit == newCloneLimit)
260+
return;
261+
262+
m_cloneLimit = newCloneLimit;
263+
264+
if (m_engine)
265+
m_engine->setCloneLimit(m_cloneLimit);
266+
267+
emit cloneLimitChanged();
268+
}
269+
270+
bool ProjectLoader::spriteFencing() const
271+
{
272+
return m_spriteFencing;
273+
}
274+
275+
void ProjectLoader::setSpriteFencing(bool newSpriteFencing)
276+
{
277+
if (m_spriteFencing == newSpriteFencing)
278+
return;
279+
280+
m_spriteFencing = newSpriteFencing;
281+
282+
if (m_engine)
283+
m_engine->setSpriteFencingEnabled(m_spriteFencing);
284+
285+
emit spriteFencingChanged();
286+
}

ScratchCPPGui/projectloader.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ class ProjectLoader : public QObject
2323
Q_PROPERTY(libscratchcpp::IEngine *engine READ engine NOTIFY engineChanged)
2424
Q_PROPERTY(StageModel *stage READ stage NOTIFY stageChanged)
2525
Q_PROPERTY(QQmlListProperty<SpriteModel> sprites READ sprites NOTIFY spritesChanged)
26+
Q_PROPERTY(double fps READ fps WRITE setFps NOTIFY fpsChanged)
27+
Q_PROPERTY(bool turboMode READ turboMode WRITE setTurboMode NOTIFY turboModeChanged)
28+
Q_PROPERTY(unsigned int stageWidth READ stageWidth WRITE setStageWidth NOTIFY stageWidthChanged)
29+
Q_PROPERTY(unsigned int stageHeight READ stageHeight WRITE setStageHeight NOTIFY stageHeightChanged)
30+
Q_PROPERTY(int cloneLimit READ cloneLimit WRITE setCloneLimit NOTIFY cloneLimitChanged)
31+
Q_PROPERTY(bool spriteFencing READ spriteFencing WRITE setSpriteFencing NOTIFY spriteFencingChanged)
2632

2733
public:
2834
explicit ProjectLoader(QObject *parent = nullptr);
@@ -45,12 +51,36 @@ class ProjectLoader : public QObject
4551
unsigned int frameFinished() const;
4652
void setFrameFinished(unsigned int newFrameFinished);
4753

54+
double fps() const;
55+
void setFps(double newFps);
56+
57+
bool turboMode() const;
58+
void setTurboMode(bool newTurboMode);
59+
60+
unsigned int stageWidth() const;
61+
void setStageWidth(unsigned int newStageWidth);
62+
63+
unsigned int stageHeight() const;
64+
void setStageHeight(unsigned int newStageHeight);
65+
66+
int cloneLimit() const;
67+
void setCloneLimit(int newCloneLimit);
68+
69+
bool spriteFencing() const;
70+
void setSpriteFencing(bool newSpriteFencing);
71+
4872
signals:
4973
void fileNameChanged();
5074
void loadedChanged();
5175
void engineChanged();
5276
void stageChanged();
5377
void spritesChanged();
78+
void fpsChanged();
79+
void turboModeChanged();
80+
void stageWidthChanged();
81+
void stageHeightChanged();
82+
void cloneLimitChanged();
83+
void spriteFencingChanged();
5484

5585
protected:
5686
void timerEvent(QTimerEvent *event) override;
@@ -67,6 +97,12 @@ class ProjectLoader : public QObject
6797
StageModel m_stage;
6898
QList<SpriteModel *> m_sprites;
6999
QFuture<void> m_eventLoop;
100+
double m_fps = 30;
101+
bool m_turboMode = false;
102+
unsigned int m_stageWidth;
103+
unsigned int m_stageHeight;
104+
int m_cloneLimit;
105+
bool m_spriteFencing;
70106
};
71107

72108
} // namespace scratchcppgui

0 commit comments

Comments
 (0)