diff --git a/src/ProjectPlayer.qml b/src/ProjectPlayer.qml index 5d12c3d..b0b200c 100644 --- a/src/ProjectPlayer.qml +++ b/src/ProjectPlayer.qml @@ -12,6 +12,7 @@ ProjectScene { property int stageWidth: 480 property int stageHeight: 360 readonly property bool running: loader.running + readonly property list unsupportedBlocks: loader.unsupportedBlocks property alias fps: loader.fps property alias turboMode: loader.turboMode property alias cloneLimit: loader.cloneLimit diff --git a/src/projectloader.cpp b/src/projectloader.cpp index 6344911..cc6a3ee 100644 --- a/src/projectloader.cpp +++ b/src/projectloader.cpp @@ -188,6 +188,11 @@ const QList &ProjectLoader::monitorList() const return m_monitors; } +const QStringList &ProjectLoader::unsupportedBlocks() const +{ + return m_unsupportedBlocks; +} + void ProjectLoader::start() { if (m_loadThread.isRunning()) @@ -300,6 +305,15 @@ void ProjectLoader::load() return; } + // Get unsupported blocks + const auto &unsupportedBlocks = m_engine->unsupportedBlocks(); + m_unsupportedBlocks.clear(); + + for (const std::string &opcode : unsupportedBlocks) + m_unsupportedBlocks.push_back(QString::fromStdString(opcode)); + + emit unsupportedBlocksChanged(); + m_engineMutex.unlock(); emit loadStatusChanged(); diff --git a/src/projectloader.h b/src/projectloader.h index 286cade..a645afa 100644 --- a/src/projectloader.h +++ b/src/projectloader.h @@ -30,6 +30,7 @@ class ProjectLoader : public QObject Q_PROPERTY(QQmlListProperty sprites READ sprites NOTIFY spritesChanged) Q_PROPERTY(QQmlListProperty clones READ clones NOTIFY clonesChanged) Q_PROPERTY(QQmlListProperty monitors READ monitors NOTIFY monitorsChanged) + Q_PROPERTY(QStringList unsupportedBlocks READ unsupportedBlocks NOTIFY unsupportedBlocksChanged) Q_PROPERTY(double fps READ fps WRITE setFps NOTIFY fpsChanged) Q_PROPERTY(bool turboMode READ turboMode WRITE setTurboMode NOTIFY turboModeChanged) Q_PROPERTY(unsigned int stageWidth READ stageWidth WRITE setStageWidth NOTIFY stageWidthChanged) @@ -65,6 +66,8 @@ class ProjectLoader : public QObject QQmlListProperty monitors(); const QList &monitorList() const; + const QStringList &unsupportedBlocks() const; + Q_INVOKABLE void start(); Q_INVOKABLE void stop(); @@ -105,6 +108,7 @@ class ProjectLoader : public QObject void spritesChanged(); void clonesChanged(); void monitorsChanged(); + void unsupportedBlocksChanged(); void fpsChanged(); void turboModeChanged(); void stageWidthChanged(); @@ -147,6 +151,7 @@ class ProjectLoader : public QObject QList m_sprites; QList m_clones; QList m_monitors; + QStringList m_unsupportedBlocks; double m_fps = 30; bool m_turboMode = false; unsigned int m_stageWidth = 480; diff --git a/test/projectloader/projectloader_test.cpp b/test/projectloader/projectloader_test.cpp index d3414be..96ee1f2 100644 --- a/test/projectloader/projectloader_test.cpp +++ b/test/projectloader/projectloader_test.cpp @@ -32,6 +32,7 @@ class ProjectLoaderTest : public testing::Test QSignalSpy clonesSpy(loader, &ProjectLoader::clonesChanged); QSignalSpy monitorsSpy(loader, &ProjectLoader::monitorsChanged); QSignalSpy monitorAddedSpy(loader, &ProjectLoader::monitorAdded); + QSignalSpy unsupportedBlocksSpy(loader, &ProjectLoader::unsupportedBlocksChanged); loader->setFileName(fileName); @@ -60,6 +61,7 @@ class ProjectLoaderTest : public testing::Test ASSERT_EQ(clonesSpy.count(), 1); ASSERT_EQ(monitorsSpy.count(), loader->monitorList().size() + 1); ASSERT_EQ(monitorAddedSpy.count(), loader->monitorList().size()); + ASSERT_EQ(unsupportedBlocksSpy.count(), 1); } }; @@ -107,6 +109,25 @@ TEST_F(ProjectLoaderTest, Load) ASSERT_EQ(valueMonitorModel->color(), QColor::fromString("#FF8C1A")); } +TEST_F(ProjectLoaderTest, UnsupportedBlocks) +{ + ProjectLoader loader; + ASSERT_TRUE(loader.fileName().isEmpty()); + ASSERT_FALSE(loader.loadStatus()); + ASSERT_TRUE(loader.stage()); + + loader.setFileName("unsupported_blocks.sb3"); + loader.start(); // wait until it loads + + auto engine = loader.engine(); + const auto &blocks = loader.unsupportedBlocks(); + const auto &refBlocks = engine->unsupportedBlocks(); + ASSERT_EQ(blocks.size(), refBlocks.size()); + + for (const QString &opcode : blocks) + ASSERT_NE(refBlocks.find(opcode.toStdString()), refBlocks.cend()); +} + TEST_F(ProjectLoaderTest, Clones) { ProjectLoader loader; diff --git a/test/unsupported_blocks.sb3 b/test/unsupported_blocks.sb3 new file mode 100644 index 0000000..7098a65 Binary files /dev/null and b/test/unsupported_blocks.sb3 differ