Skip to content

Commit a81e0c6

Browse files
authored
Merge pull request #42 from scratchcpp/loading_progress
Show loading progress
2 parents f78da3e + 3bf773f commit a81e0c6

File tree

3 files changed

+93
-0
lines changed

3 files changed

+93
-0
lines changed

ScratchCPPGui/ProjectPlayer.qml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// SPDX-License-Identifier: LGPL-3.0-or-later
22

33
import QtQuick
4+
import QtQuick.Layouts
5+
import QtQuick.Controls
46
import ScratchCPPGui
57

68
ProjectScene {
@@ -9,18 +11,30 @@ ProjectScene {
911
property alias turboMode: loader.turboMode
1012
property alias cloneLimit: loader.cloneLimit
1113
property alias spriteFencing: loader.spriteFencing
14+
property bool showLoadingProgress: true
15+
readonly property bool loading: priv.loading
16+
readonly property int downloadedAssets: loader.downloadedAssets
17+
readonly property int assetCount: loader.assetCount
1218
signal loaded()
1319
signal failedToLoad()
1420

1521
id: root
1622
clip: true
23+
onFileNameChanged: priv.loading = true;
24+
25+
QtObject {
26+
id: priv
27+
property bool loading: false
28+
}
1729

1830
ProjectLoader {
1931
id: loader
2032
fileName: root.fileName
2133
stageWidth: parent.width
2234
stageHeight: parent.height
2335
onLoadingFinished: {
36+
priv.loading = false;
37+
2438
if(loadStatus)
2539
loaded();
2640
else
@@ -55,4 +69,44 @@ ProjectScene {
5569
Component.onCompleted: modelData.renderedTarget = this
5670
}
5771
}
72+
73+
Loader {
74+
anchors.fill: parent
75+
active: showLoadingProgress && loading
76+
77+
sourceComponent: ColumnLayout {
78+
anchors.fill: parent
79+
80+
Item { Layout.fillHeight: true }
81+
82+
BusyIndicator {
83+
Layout.fillWidth: true
84+
Layout.maximumWidth: 100
85+
Layout.alignment: Qt.AlignHCenter
86+
running: true
87+
}
88+
89+
Label {
90+
Layout.alignment: Qt.AlignHCenter
91+
font.bold: true
92+
font.pointSize: 12
93+
text: {
94+
if(loading)
95+
return assetCount == downloadedAssets ? qsTr("Loading project...") : qsTr("Downloading assets... (%1 of %2)").arg(downloadedAssets).arg(assetCount);
96+
else
97+
return "";
98+
}
99+
}
100+
101+
ProgressBar {
102+
Layout.fillWidth: true
103+
from: 0
104+
to: assetCount
105+
value: downloadedAssets
106+
indeterminate: assetCount == downloadedAssets
107+
}
108+
109+
Item { Layout.fillHeight: true }
110+
}
111+
}
58112
}

ScratchCPPGui/projectloader.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ void runEventLoop(IEngine *engine)
2020
ProjectLoader::ProjectLoader(QObject *parent) :
2121
QObject(parent)
2222
{
23+
m_project.setDownloadProgressCallback([this](unsigned int finished, unsigned int all) {
24+
if (finished != m_downloadedAssets) {
25+
m_downloadedAssets = finished;
26+
emit downloadedAssetsChanged();
27+
}
28+
29+
if (all != m_assetCount) {
30+
m_assetCount = all;
31+
emit assetCountChanged();
32+
}
33+
});
34+
2335
initTimer();
2436

2537
// Update refresh rate when primary screen changes
@@ -66,6 +78,13 @@ void ProjectLoader::setFileName(const QString &newFileName)
6678
m_project.setScratchVersion(ScratchVersion::Scratch3);
6779
m_project.setFileName(m_fileName.toStdString());
6880
m_loadStatus = false;
81+
82+
// TODO: Do not set these to 0 after libscratchcpp starts doing it itself
83+
m_downloadedAssets = 0;
84+
m_assetCount = 0;
85+
emit downloadedAssetsChanged();
86+
emit assetCountChanged();
87+
6988
emit loadStatusChanged();
7089
emit fileNameChanged();
7190

@@ -397,3 +416,13 @@ void ProjectLoader::setEventLoopEnabled(bool newEventLoopEnabled)
397416
m_engineMutex.unlock();
398417
emit eventLoopEnabledChanged();
399418
}
419+
420+
unsigned int ProjectLoader::downloadedAssets() const
421+
{
422+
return m_downloadedAssets;
423+
}
424+
425+
unsigned int ProjectLoader::assetCount() const
426+
{
427+
return m_assetCount;
428+
}

ScratchCPPGui/projectloader.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class ProjectLoader : public QObject
3030
Q_PROPERTY(int cloneLimit READ cloneLimit WRITE setCloneLimit NOTIFY cloneLimitChanged)
3131
Q_PROPERTY(bool spriteFencing READ spriteFencing WRITE setSpriteFencing NOTIFY spriteFencingChanged)
3232
Q_PROPERTY(bool eventLoopEnabled READ eventLoopEnabled WRITE setEventLoopEnabled NOTIFY eventLoopEnabledChanged)
33+
Q_PROPERTY(unsigned int downloadedAssets READ downloadedAssets NOTIFY downloadedAssetsChanged)
34+
Q_PROPERTY(unsigned int assetCount READ assetCount NOTIFY assetCountChanged)
3335

3436
public:
3537
explicit ProjectLoader(QObject *parent = nullptr);
@@ -72,6 +74,10 @@ class ProjectLoader : public QObject
7274
bool eventLoopEnabled() const;
7375
void setEventLoopEnabled(bool newEventLoopEnabled);
7476

77+
unsigned int downloadedAssets() const;
78+
79+
unsigned int assetCount() const;
80+
7581
signals:
7682
void fileNameChanged();
7783
void loadStatusChanged();
@@ -86,6 +92,8 @@ class ProjectLoader : public QObject
8692
void cloneLimitChanged();
8793
void spriteFencingChanged();
8894
void eventLoopEnabledChanged();
95+
void downloadedAssetsChanged();
96+
void assetCountChanged();
8997

9098
protected:
9199
void timerEvent(QTimerEvent *event) override;
@@ -113,6 +121,8 @@ class ProjectLoader : public QObject
113121
int m_cloneLimit = 300;
114122
bool m_spriteFencing = true;
115123
bool m_eventLoopEnabled = true;
124+
std::atomic<unsigned int> m_downloadedAssets = 0;
125+
std::atomic<unsigned int> m_assetCount = 0;
116126
};
117127

118128
} // namespace scratchcppgui

0 commit comments

Comments
 (0)