[jasper/world] Simplify WorldEditor - remove ObjSet selector
All checks were successful
Build / build (push) Successful in 1m34s
All checks were successful
Build / build (push) Successful in 1m34s
This commit is contained in:
parent
b7aff140bf
commit
dd266b23b2
@ -74,7 +74,7 @@ constexpr ox::Point fbPtToTileAddr(
|
|||||||
}
|
}
|
||||||
|
|
||||||
WorldEditorImGui::WorldEditorImGui(studio::Context &sctx, ox::StringParam path):
|
WorldEditorImGui::WorldEditorImGui(studio::Context &sctx, ox::StringParam path):
|
||||||
Editor(sctx, std::move(path)),
|
Editor{sctx, std::move(path)},
|
||||||
m_sctx{sctx},
|
m_sctx{sctx},
|
||||||
m_objSetPicker{"Object Set Chooser", keelCtx(m_sctx), FileExt_jwob},
|
m_objSetPicker{"Object Set Chooser", keelCtx(m_sctx), FileExt_jwob},
|
||||||
m_doc{*keel::readObj<WorldDoc>(keelCtx(m_sctx), itemPath()).unwrapThrow()} {
|
m_doc{*keel::readObj<WorldDoc>(keelCtx(m_sctx), itemPath()).unwrapThrow()} {
|
||||||
@ -88,6 +88,7 @@ WorldEditorImGui::WorldEditorImGui(studio::Context &sctx, ox::StringParam path):
|
|||||||
keelCtx(m_sctx), itemPath(), [this](WorldEditorConfig const&config) {
|
keelCtx(m_sctx), itemPath(), [this](WorldEditorConfig const&config) {
|
||||||
m_view.setAnimate(config.animateBg);
|
m_view.setAnimate(config.animateBg);
|
||||||
});
|
});
|
||||||
|
undoStack()->changeTriggered.connect(this, &WorldEditorImGui::handleUndoStackChange);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldEditorImGui::draw(studio::Context&) noexcept {
|
void WorldEditorImGui::draw(studio::Context&) noexcept {
|
||||||
@ -187,40 +188,33 @@ ox::Error WorldEditorImGui::saveItem() noexcept {
|
|||||||
return m_sctx.project->writeObj(itemPath(), m_doc, ox::ClawFormat::Organic);
|
return m_sctx.project->writeObj(itemPath(), m_doc, ox::ClawFormat::Organic);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldEditorImGui::drawObjSetSelector() noexcept {
|
void WorldEditorImGui::drawObjSelector() noexcept {
|
||||||
ig::IDStackItem const idStackItem("ObjSetSelector");
|
ig::IDStackItem const idStackItem("ObjSelector");
|
||||||
if (ig::PushButton("+", SqrBtnSize)) {
|
if (ig::PushButton("+", SqrBtnSize)) {
|
||||||
m_objSetPicker.open();
|
m_objSetPicker.open();
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
ImGui::BeginDisabled(m_objMgr.selectedObjSet.len() == 0);
|
||||||
if (ig::PushButton("-", SqrBtnSize)) {
|
if (ig::PushButton("-", SqrBtnSize)) {
|
||||||
rmObjSet();
|
rmObjSet();
|
||||||
}
|
}
|
||||||
ig::ListBox("Object Sets", [this](size_t i) -> ox::CStringView {
|
ImGui::EndDisabled();
|
||||||
auto const&uuidUrl = m_doc.objSets[i].path;
|
ImGui::BeginChild("ObjTree");
|
||||||
auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx), uuidUrl);
|
{
|
||||||
if (err) {
|
|
||||||
setName = uuidUrl;
|
|
||||||
}
|
|
||||||
return setName;
|
|
||||||
}, m_doc.objSets.size(), m_palMgr.selectedIdx);
|
|
||||||
if (ig::DragDropTarget const d; d) {
|
|
||||||
auto const [fr, err] = ig::getDragDropPayload<studio::FileRef>("FileRef");
|
|
||||||
if (!err && endsWith(fr.path, FileExt_jwob)) {
|
|
||||||
std::ignore = addObjSet(fr.path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void WorldEditorImGui::drawObjSelector() noexcept {
|
|
||||||
ig::IDStackItem const idStackItem("ObjSelector");
|
|
||||||
for (auto const&[uuidUrl, setId, set] : m_objSets) {
|
for (auto const&[uuidUrl, setId, set] : m_objSets) {
|
||||||
constexpr auto flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
|
auto flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick;
|
||||||
auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx), uuidUrl);
|
auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx), uuidUrl);
|
||||||
|
auto const uuid = substr(uuidUrl, 7);
|
||||||
if (err) {
|
if (err) {
|
||||||
setName = uuidUrl;
|
setName = uuidUrl;
|
||||||
}
|
}
|
||||||
|
if (uuid == m_objMgr.selectedObjSet) {
|
||||||
|
flags |= ImGuiTreeNodeFlags_Selected;
|
||||||
|
}
|
||||||
if (ImGui::TreeNodeEx(setName.c_str(), flags)) {
|
if (ImGui::TreeNodeEx(setName.c_str(), flags)) {
|
||||||
|
if (ImGui::IsItemClicked()) {
|
||||||
|
m_objMgr.selectedObjSet = uuid;
|
||||||
|
}
|
||||||
for (auto const&obj : set->objects) {
|
for (auto const&obj : set->objects) {
|
||||||
if (ImGui::TreeNodeEx(obj.name.c_str(), ImGuiTreeNodeFlags_Leaf)) {
|
if (ImGui::TreeNodeEx(obj.name.c_str(), ImGuiTreeNodeFlags_Leaf)) {
|
||||||
if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) {
|
if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) {
|
||||||
@ -237,6 +231,18 @@ void WorldEditorImGui::drawObjSelector() noexcept {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
|
} else {
|
||||||
|
if (ImGui::IsItemClicked()) {
|
||||||
|
m_objMgr.selectedObjSet = uuid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndChild();
|
||||||
|
if (ig::DragDropTarget const d; d) {
|
||||||
|
auto const [fr, err] = ig::getDragDropPayload<studio::FileRef>("FileRef");
|
||||||
|
if (!err && endsWith(fr.path, FileExt_jwob)) {
|
||||||
|
std::ignore = addObjSet(fr.path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -285,7 +291,6 @@ void WorldEditorImGui::drawMenu() noexcept {
|
|||||||
|
|
||||||
void WorldEditorImGui::drawResources() noexcept {
|
void WorldEditorImGui::drawResources() noexcept {
|
||||||
ig::IDStackItem const idStackItem("Resources");
|
ig::IDStackItem const idStackItem("Resources");
|
||||||
drawObjSetSelector();
|
|
||||||
drawObjSelector();
|
drawObjSelector();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,7 +404,13 @@ ox::Error WorldEditorImGui::addObjSet(ox::StringViewCR path) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WorldEditorImGui::rmObjSet() noexcept {
|
void WorldEditorImGui::rmObjSet() noexcept {
|
||||||
std::ignore = pushCommand<RmObjectSet>(m_doc, m_palMgr.selectedIdx);
|
auto const idx = ox::find_if(
|
||||||
|
m_doc.objSets.begin(), m_doc.objSets.end(), [this](ObjectSetEntry const &e) {
|
||||||
|
return substr(e.path, 7) == m_objMgr.selectedObjSet;
|
||||||
|
});
|
||||||
|
if (idx != m_doc.objSets.end()) {
|
||||||
|
std::ignore = pushCommand<RmObjectSet>(m_doc, idx.offset());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Error WorldEditorImGui::handleDepUpdate(ox::StringViewCR, ox::UUID const&uuid) noexcept {
|
ox::Error WorldEditorImGui::handleDepUpdate(ox::StringViewCR, ox::UUID const&uuid) noexcept {
|
||||||
@ -458,4 +469,14 @@ ox::Error WorldEditorImGui::addDependency(ox::FileAddress const&fileAddr) noexce
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ox::Error WorldEditorImGui::handleUndoStackChange(studio::UndoCommand const*cmd) noexcept {
|
||||||
|
if (dynamic_cast<AddObjectSet const*>(cmd)) {
|
||||||
|
return loadObjectSets();
|
||||||
|
}
|
||||||
|
if (dynamic_cast<RmObjectSet const*>(cmd)) {
|
||||||
|
return loadObjectSets();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -40,8 +40,8 @@ class WorldEditorImGui: public studio::Editor {
|
|||||||
WorldStaticLoader m_loader{keelCtx(m_sctx), m_worldStatic, m_doc};
|
WorldStaticLoader m_loader{keelCtx(m_sctx), m_worldStatic, m_doc};
|
||||||
WorldEditorView m_view{m_sctx, m_worldStatic};
|
WorldEditorView m_view{m_sctx, m_worldStatic};
|
||||||
struct {
|
struct {
|
||||||
size_t selectedIdx{};
|
ox::UUIDStr selectedObjSet;
|
||||||
} m_palMgr;
|
} m_objMgr;
|
||||||
struct {
|
struct {
|
||||||
bool show{};
|
bool show{};
|
||||||
int columns{};
|
int columns{};
|
||||||
@ -67,8 +67,6 @@ class WorldEditorImGui: public studio::Editor {
|
|||||||
ox::Error saveItem() noexcept final;
|
ox::Error saveItem() noexcept final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void drawObjSetSelector() noexcept;
|
|
||||||
|
|
||||||
void drawObjSelector() noexcept;
|
void drawObjSelector() noexcept;
|
||||||
|
|
||||||
void drawPropEditor() noexcept;
|
void drawPropEditor() noexcept;
|
||||||
@ -101,6 +99,8 @@ class WorldEditorImGui: public studio::Editor {
|
|||||||
|
|
||||||
ox::Error addDependency(ox::FileAddress const&fileAddr) noexcept;
|
ox::Error addDependency(ox::FileAddress const&fileAddr) noexcept;
|
||||||
|
|
||||||
|
ox::Error handleUndoStackChange(studio::UndoCommand const*) noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr bool popupOpen() const noexcept {
|
constexpr bool popupOpen() const noexcept {
|
||||||
return m_sizeEditor.show;
|
return m_sizeEditor.show;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user