From 2f36a3f6f0f94d5e6c746666e68ba12d753265de Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 30 Jul 2025 00:37:23 -0500 Subject: [PATCH] [studio] Add File -> Reload Project menu item --- src/olympic/studio/applib/src/studioui.cpp | 12 ++++++++---- src/olympic/studio/modlib/include/studio/project.hpp | 7 ++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/olympic/studio/applib/src/studioui.cpp b/src/olympic/studio/applib/src/studioui.cpp index 16ecb968..3b910457 100644 --- a/src/olympic/studio/applib/src/studioui.cpp +++ b/src/olympic/studio/applib/src/studioui.cpp @@ -250,6 +250,9 @@ void StudioUI::drawMenu() noexcept { if (ImGui::MenuItem("Open Project...", STUDIO_CTRL "+O")) { m_taskRunner.add(*ox::make(this, &StudioUI::openProjectPath)); } + if (ImGui::MenuItem("Reload Project")) { + oxLogError(openProjectPath(m_project->projectPath())); + } if (ImGui::BeginMenu("Recent Projects", m_recentProjects.size() > 1)) { for (size_t i = 1; i < m_recentProjects.size(); ++i) { auto const &p = m_recentProjects[i]; @@ -636,6 +639,9 @@ ox::Error StudioUI::createOpenProject(ox::StringViewCR path) noexcept { ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept { OX_REQUIRE_M(fs, keel::loadRomFs(path.view())); + m_project.reset(); + m_openFiles.clear(); + m_editors.clear(); keel::DuplicateSet ds; OX_RETURN_ERROR(keel::setRomFs(keelCtx(m_tctx), std::move(fs), ds)); if (ds.size()) { @@ -649,8 +655,8 @@ ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept { m_messagePopup.show(msg); } OX_RETURN_ERROR( - ox::make_unique_catch(keelCtx(m_tctx), std::move(path), m_projectDataDir) - .moveTo(m_project)); + ox::make_unique_catch(keelCtx(m_tctx), std::move(path), m_projectDataDir) + .moveTo(m_project)); m_sctx.project = m_project.get(); m_activeEditor = nullptr; m_activeEditorOnLastDraw = nullptr; @@ -665,8 +671,6 @@ ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept { m_project->dirDeleted.connect(this, &StudioUI::handleDeleteDir); m_project->fileDeleted.connect(this, &StudioUI::handleDeleteFile); m_project->fileMoved.connect(this, &StudioUI::handleMoveFile); - m_openFiles.clear(); - m_editors.clear(); studio::editConfig(keelCtx(m_tctx), [&](StudioConfig &config) { auto const pcIt = std::find_if( config.projects.begin(), config.projects.end(), diff --git a/src/olympic/studio/modlib/include/studio/project.hpp b/src/olympic/studio/modlib/include/studio/project.hpp index 6d9bd270..f514e3c2 100644 --- a/src/olympic/studio/modlib/include/studio/project.hpp +++ b/src/olympic/studio/modlib/include/studio/project.hpp @@ -185,10 +185,15 @@ ox::Error Project::writeObj(ox::StringViewCR path, T const &obj) noexcept { template ox::Result Project::loadObj(ox::StringViewCR path) const noexcept { - OX_REQUIRE(buff, loadBuff(path)); + OX_REQUIRE_M(buff, loadBuff(path)); if constexpr(ox::is_same_v) { return keel::readAsset(m_typeStore, buff); } else { + OX_REQUIRE(typeId, keel::readAssetTypeId(buff)); + if (typeId != ox::ModelTypeId_v) { + OX_REQUIRE(ah, keel::readAssetHeader(buff)); + OX_RETURN_ERROR(keel::convertBuffToBuff(m_kctx, buff, ah.clawHdr.fmt).moveTo(buff)); + } return keel::readAsset(buff); } }