[jasper/world/studio] Improve WorldEditor dependency tracking
This commit is contained in:
@ -87,7 +87,7 @@ WorldEditorImGui::WorldEditorImGui(studio::StudioContext &sctx, ox::StringView p
|
|||||||
oxThrowError(loadObjectSets());
|
oxThrowError(loadObjectSets());
|
||||||
setRequiresConstantRefresh(false);
|
setRequiresConstantRefresh(false);
|
||||||
m_objSetPicker.filePicked.connect(this, &WorldEditorImGui::addObjSet);
|
m_objSetPicker.filePicked.connect(this, &WorldEditorImGui::addObjSet);
|
||||||
m_sctx.project->fileUpdated.connect(this, &WorldEditorImGui::handleObjectSetUpdate);
|
m_sctx.project->fileUpdated.connect(this, &WorldEditorImGui::handleDepUpdate);
|
||||||
studio::Editor::undoStack()->changeTriggered.connect(this, &WorldEditorImGui::undoStackChanged);
|
studio::Editor::undoStack()->changeTriggered.connect(this, &WorldEditorImGui::undoStackChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -308,22 +308,34 @@ void WorldEditorImGui::rmObjSet() noexcept {
|
|||||||
std::ignore = pushCommand<RmObjectSet>(m_doc, m_palMgr.selectedIdx);
|
std::ignore = pushCommand<RmObjectSet>(m_doc, m_palMgr.selectedIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Error WorldEditorImGui::handleObjectSetUpdate(ox::StringView, ox::UUID const&uuid) noexcept {
|
ox::Error WorldEditorImGui::handleDepUpdate(ox::StringView, ox::UUID const&uuid) noexcept {
|
||||||
auto const matches = [uuid](ObjectSetEntry const&set) {
|
auto const objSetMatches = [&uuid](ObjectSetEntry const&set) {
|
||||||
auto const [setUuid, err] = keel::uuidUrlToUuid(set.path);
|
auto const [setUuid, err] = keel::uuidUrlToUuid(set.path);
|
||||||
return !err && setUuid == uuid;
|
return !err && setUuid == uuid;
|
||||||
};
|
};
|
||||||
if (ox::any_of(m_doc.objSets.begin(), m_doc.objSets.end(), matches)) {
|
auto const depMatches = [&uuid](ox::SmallMap<ox::UUID, bool>::Pair const&set) {
|
||||||
|
return set.key == uuid;
|
||||||
|
};
|
||||||
|
auto const depUpdated = ox::any_of(m_doc.objSets.begin(), m_doc.objSets.end(), objSetMatches)
|
||||||
|
|| ox::any_of(m_dependencies.pairs().begin(), m_dependencies.pairs().end(), depMatches);
|
||||||
|
if (depUpdated) {
|
||||||
oxReturnError(buildObjCache(keelCtx(m_sctx.tctx), m_doc).moveTo(m_objCache));
|
oxReturnError(buildObjCache(keelCtx(m_sctx.tctx), m_doc).moveTo(m_objCache));
|
||||||
oxReturnError(loadWorldStatic(m_objCache, m_doc).moveTo(m_worldStatic));
|
oxReturnError(loadWorldStatic(m_objCache, m_doc).moveTo(m_worldStatic));
|
||||||
|
oxReturnError(loadObjectSets());
|
||||||
}
|
}
|
||||||
return loadObjectSets();
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Error WorldEditorImGui::loadObjectSets() noexcept {
|
ox::Error WorldEditorImGui::loadObjectSets() noexcept {
|
||||||
m_objSets.clear();
|
m_objSets.clear();
|
||||||
|
m_dependencies.clear();
|
||||||
|
auto &kctx = keelCtx(m_sctx.tctx);
|
||||||
for (auto const&set : m_doc.objSets) {
|
for (auto const&set : m_doc.objSets) {
|
||||||
oxRequireM(os, readObj<WorldObjectSet>(keelCtx(m_sctx.tctx), set.path));
|
oxRequireM(os, readObj<WorldObjectSet>(kctx, set.path));
|
||||||
|
oxLogError(addDependency(os->tilesheet));
|
||||||
|
for (auto const&pal : os->palettes) {
|
||||||
|
oxLogError(addDependency(pal.palette));
|
||||||
|
}
|
||||||
m_objSets.emplace_back(ox::String(set.path), set.id, std::move(os));
|
m_objSets.emplace_back(ox::String(set.path), set.id, std::move(os));
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
@ -347,4 +359,11 @@ void WorldEditorImGui::clearSelection() noexcept {
|
|||||||
m_view.clearSelection();
|
m_view.clearSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ox::Error WorldEditorImGui::addDependency(ox::FileAddress const&fileAddr) noexcept {
|
||||||
|
auto &kctx = keelCtx(m_sctx.tctx);
|
||||||
|
oxRequire(uuid, keel::getUuid(kctx, fileAddr));
|
||||||
|
m_dependencies[uuid] = true;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ class WorldEditorImGui: public studio::Editor {
|
|||||||
constexpr ObjSetRef() = default;
|
constexpr ObjSetRef() = default;
|
||||||
};
|
};
|
||||||
ox::Vector<ObjSetRef> m_objSets;
|
ox::Vector<ObjSetRef> m_objSets;
|
||||||
|
ox::SmallMap<ox::UUID, bool> m_dependencies;
|
||||||
WorldStatic m_worldStatic;
|
WorldStatic m_worldStatic;
|
||||||
WorldEditorView m_view;
|
WorldEditorView m_view;
|
||||||
struct {
|
struct {
|
||||||
@ -81,7 +82,7 @@ class WorldEditorImGui: public studio::Editor {
|
|||||||
void rmObjSet() noexcept;
|
void rmObjSet() noexcept;
|
||||||
|
|
||||||
// handles the updating of an object set in case it is one used by this world
|
// handles the updating of an object set in case it is one used by this world
|
||||||
ox::Error handleObjectSetUpdate(ox::StringView path, ox::UUID const&) noexcept;
|
ox::Error handleDepUpdate(ox::StringView path, ox::UUID const&) noexcept;
|
||||||
|
|
||||||
ox::Error loadObjectSets() noexcept;
|
ox::Error loadObjectSets() noexcept;
|
||||||
|
|
||||||
@ -91,6 +92,8 @@ class WorldEditorImGui: public studio::Editor {
|
|||||||
bool tileSelected(ox::Point const&pt) const noexcept;
|
bool tileSelected(ox::Point const&pt) const noexcept;
|
||||||
|
|
||||||
void clearSelection() noexcept;
|
void clearSelection() noexcept;
|
||||||
|
|
||||||
|
ox::Error addDependency(ox::FileAddress const&fileAddr) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user