diff --git a/src/olympic/studio/applib/src/main.cpp b/src/olympic/studio/applib/src/main.cpp index 24ec89d7..d588f5ed 100644 --- a/src/olympic/studio/applib/src/main.cpp +++ b/src/olympic/studio/applib/src/main.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include #include @@ -31,21 +30,19 @@ class StudioUIDrawer: public turbine::gl::Drawer { static int updateHandler(turbine::Context &ctx) noexcept { auto sctx = turbine::applicationData(ctx); - auto ui = dynamic_cast(sctx->ui); - ui->update(); + sctx->ui->update(); return 16; } static void keyEventHandler(turbine::Context &ctx, turbine::Key key, bool down) noexcept { auto sctx = turbine::applicationData(ctx); - auto ui = dynamic_cast(sctx->ui); - ui->handleKeyEvent(key, down); + sctx->ui->handleKeyEvent(key, down); } static ox::Error runApp( ox::CRStringView appName, ox::CRStringView projectDataDir, - ox::UniquePtr fs) noexcept { + ox::UPtr &&fs) noexcept { oxRequireM(ctx, turbine::init(std::move(fs), appName)); turbine::setWindowTitle(*ctx, keelCtx(*ctx).appName); turbine::setUpdateHandler(*ctx, updateHandler); diff --git a/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index 5061f226..121dbbc3 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/src/olympic/studio/applib/src/studioapp.cpp @@ -334,13 +334,15 @@ ox::Error StudioUI::createOpenProject(ox::CRStringView path) noexcept { std::filesystem::create_directories(toStdStringView(path), ec); oxReturnError(OxError(ec.value() != 0, "Could not create project directory")); oxReturnError(openProjectPath(path)); - return m_project->writeAllTypeDescriptors(); + return m_project->writeTypeStore(); } ox::Error StudioUI::openProjectPath(ox::CRStringView path) noexcept { oxRequireM(fs, keel::loadRomFs(path)); oxReturnError(keel::setRomFs(keelCtx(m_ctx), std::move(fs))); - m_project = ox::make_unique(keelCtx(m_ctx), ox::String(path), m_projectDataDir); + oxReturnError( + ox::make_unique_catch(keelCtx(m_ctx), ox::String(path), m_projectDataDir) + .moveTo(m_project)); auto const sctx = applicationData(m_ctx); sctx->project = m_project.get(); turbine::setWindowTitle(m_ctx, ox::sfmt("{} - {}", keelCtx(m_ctx).appName, m_project->projectPath())); diff --git a/src/olympic/studio/modlib/include/studio/context.hpp b/src/olympic/studio/modlib/include/studio/context.hpp index a7611d31..8fb57dfb 100644 --- a/src/olympic/studio/modlib/include/studio/context.hpp +++ b/src/olympic/studio/modlib/include/studio/context.hpp @@ -11,7 +11,7 @@ namespace studio { struct StudioContext { - ox::SignalHandler *ui = nullptr; + class StudioUI *ui = nullptr; Project *project = nullptr; }; diff --git a/src/olympic/studio/modlib/include/studio/project.hpp b/src/olympic/studio/modlib/include/studio/project.hpp index d54313e4..7f8adf0a 100644 --- a/src/olympic/studio/modlib/include/studio/project.hpp +++ b/src/olympic/studio/modlib/include/studio/project.hpp @@ -56,7 +56,7 @@ class Project { ox::HashMap> m_fileExtFileMap; public: - explicit Project(keel::Context &ctx, ox::String path, ox::CRStringView projectDataDir) noexcept; + explicit Project(keel::Context &ctx, ox::String path, ox::CRStringView projectDataDir); ox::Error create() noexcept; @@ -91,7 +91,7 @@ class Project { [[nodiscard]] ox::Vector const&fileList(ox::CRStringView ext) noexcept; - ox::Error writeAllTypeDescriptors() noexcept; + ox::Error writeTypeStore() noexcept; private: void buildFileIndex() noexcept; @@ -131,8 +131,8 @@ ox::Error Project::writeObj(ox::CRStringView path, T const&obj, ox::ClawFormat f } oxRequire(desc, m_typeStore.get()); auto const descExists = m_fs.stat(ox::sfmt("{}/{}", m_typeDescPath, buildTypeId(*desc))).error != 0; - if (!descExists || ox::defines::Debug) { - oxReturnError(writeAllTypeDescriptors()); + if (!descExists) { + oxReturnError(writeTypeStore()); } oxReturnError(keel::setAsset(m_ctx, path, obj)); fileUpdated.emit(path); diff --git a/src/olympic/studio/modlib/src/project.cpp b/src/olympic/studio/modlib/src/project.cpp index 76ee9b36..064997cc 100644 --- a/src/olympic/studio/modlib/src/project.cpp +++ b/src/olympic/studio/modlib/src/project.cpp @@ -26,7 +26,7 @@ static void generateTypes(ox::TypeStore &ts) noexcept { } } -Project::Project(keel::Context &ctx, ox::String path, ox::CRStringView projectDataDir) noexcept: +Project::Project(keel::Context &ctx, ox::String path, ox::CRStringView projectDataDir): m_ctx(ctx), m_path(std::move(path)), m_projectDataDir(projectDataDir), @@ -35,6 +35,9 @@ Project::Project(keel::Context &ctx, ox::String path, ox::CRStringView projectDa m_fs(*m_ctx.rom) { oxTracef("studio", "Project: {}", m_path); generateTypes(m_typeStore); + if (ox::defines::Debug) { + oxThrowError(writeTypeStore()); + } buildFileIndex(); } @@ -70,7 +73,7 @@ ox::Vector const&Project::fileList(ox::CRStringView ext) noexcept { return m_fileExtFileMap[ext]; } -ox::Error Project::writeAllTypeDescriptors() noexcept { +ox::Error Project::writeTypeStore() noexcept { // write all descriptors because we don't know which types T depends on oxReturnError(mkdir(m_typeDescPath)); for (auto const &t: m_typeStore.typeList()) {