From 46c3e4e0ded0fed5c13bb6e9ab42f50555c87a2a Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Tue, 28 May 2024 21:12:38 -0500 Subject: [PATCH] [jasper/world/studio] Cleanup, give WorldEditor an acceptsClipboardPayload function --- .../worldeditor/commands/modifytiles.hpp | 2 - .../src/studio/worldeditor/tileclipboard.cpp | 4 +- .../src/studio/worldeditor/tileclipboard.hpp | 11 +++++- .../studio/worldeditor/worldeditor-imgui.cpp | 37 +++++++++++++------ .../studio/worldeditor/worldeditor-imgui.hpp | 4 ++ 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/src/jasper/modules/world/src/studio/worldeditor/commands/modifytiles.hpp b/src/jasper/modules/world/src/studio/worldeditor/commands/modifytiles.hpp index 2cba944..d48db8b 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/commands/modifytiles.hpp +++ b/src/jasper/modules/world/src/studio/worldeditor/commands/modifytiles.hpp @@ -37,6 +37,4 @@ class ModifyTilesCommand: public studio::UndoCommand { void swap() noexcept; }; -using TileUpdate = ModifyTilesCommand::Mod; - } diff --git a/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.cpp b/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.cpp index 8517f80..73f154d 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.cpp +++ b/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.cpp @@ -6,7 +6,9 @@ namespace jasper::world { -TileClipboard::TileClipboard(ox::Size selSz) noexcept: m_selSz(selSz) {} +TileClipboard::TileClipboard(ox::UUID assetId, ox::Size selSz) noexcept: + m_assetId(assetId), m_selSz(selSz) { +} ox::Size TileClipboard::selectionSize() const noexcept { return m_selSz; diff --git a/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.hpp b/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.hpp index 6133e93..05ea9a7 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.hpp +++ b/src/jasper/modules/world/src/studio/worldeditor/tileclipboard.hpp @@ -15,13 +15,13 @@ class TileClipboard : public turbine::ClipboardObject { static constexpr auto TypeName = "net.drinkingtea.jasper.world.studio.TileClipboard"; static constexpr auto TypeVersion = 1; - protected: + ox::UUID m_assetId; ox::Size m_selSz; ox::Vector m_tileMods; public: - explicit TileClipboard(ox::Size selSz) noexcept; + TileClipboard(ox::UUID assetId, ox::Size selSz) noexcept; [[nodiscard]] ox::Size selectionSize() const noexcept; @@ -30,6 +30,13 @@ class TileClipboard : public turbine::ClipboardObject { [[nodiscard]] ox::SpanView tiles() const noexcept; + + constexpr ox::UUID const&assetId() const noexcept { + return m_assetId; + } }; +oxModelBegin(TileClipboard) +oxModelEnd() + } \ No newline at end of file diff --git a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp index 65a7bc1..65d8cd7 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp +++ b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp @@ -81,8 +81,8 @@ constexpr bool inside(auto const val, int const min, int const max) noexcept { WorldEditorImGui::WorldEditorImGui(studio::StudioContext &sctx, ox::StringView path): Editor(path), m_sctx(sctx), - m_doc(makeValid(*readObj(keelCtx(m_sctx.tctx), path).unwrapThrow())), - m_objCache(buildObjCache(keelCtx(m_sctx.tctx), m_doc).unwrapThrow()), + m_doc(makeValid(*readObj(keelCtx(m_sctx), path).unwrapThrow())), + m_objCache(buildObjCache(keelCtx(m_sctx), m_doc).unwrapThrow()), m_worldStatic(loadWorldStatic(m_objCache, m_doc)), m_view(m_sctx.tctx, m_worldStatic) { oxThrowError(loadObjectSets()); @@ -116,7 +116,8 @@ void WorldEditorImGui::onActivated() noexcept { void WorldEditorImGui::copy() noexcept { if (m_selection) { - auto mods = ox::make_unique(m_selection->size()); + auto const assetId = this->assetId().unwrapThrow(); + auto mods = ox::make_unique(assetId, m_selection->size()); studio::iterateSelection(*m_selection, [this, &mods](int32_t x, int32_t y) { auto &t = tile(m_doc, m_activeLayer, x, y); x -= m_selection->a.x; @@ -177,6 +178,14 @@ void WorldEditorImGui::paste() { } } +bool WorldEditorImGui::acceptsClipboardPayload() const noexcept { + auto const [cb, noCb] = getClipboardObject(m_sctx.tctx); + if (noCb) { + return false; + } + return cb && cb->assetId() == assetId().or_value({}); +} + ox::Error WorldEditorImGui::saveItem() noexcept { return m_sctx.project->writeObj(itemPath(), m_doc, ox::ClawFormat::Organic); } @@ -192,7 +201,7 @@ void WorldEditorImGui::drawObjSetSelector() noexcept { } ig::ListBox("Object Sets", [this](size_t i) -> ox::CStringView { auto const&uuidUrl = m_doc.objSets[i].path; - auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx.tctx), uuidUrl); + auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx), uuidUrl); if (err) { setName = uuidUrl; } @@ -204,7 +213,7 @@ void WorldEditorImGui::drawObjSelector() noexcept { ig::IDStackItem const idStackItem("ObjSelector"); for (auto const&[uuidUrl, setId, set] : m_objSets) { constexpr auto flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick; - auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx.tctx), uuidUrl); + auto [setName, err] = uuidUrlToPath(keelCtx(m_sctx), uuidUrl); if (err) { setName = uuidUrl; } @@ -370,7 +379,7 @@ ox::Error WorldEditorImGui::handleDrop(float fbPaneScale) noexcept { } ox::Error WorldEditorImGui::addObjSet(ox::StringView path) noexcept { - oxRequire(uuid, keel::pathToUuid(keelCtx(m_sctx.tctx), path)); + oxRequire(uuid, getUuid(keelCtx(m_sctx), path)); std::ignore = pushCommand(m_doc, uuid); return {}; } @@ -380,9 +389,9 @@ void WorldEditorImGui::rmObjSet() noexcept { } ox::Error WorldEditorImGui::handleDepUpdate(ox::StringView, ox::UUID const&uuid) noexcept { - auto &kctx = keelCtx(m_sctx.tctx); + auto &kctx = keelCtx(m_sctx); auto const objSetMatches = [&uuid, &kctx](ObjectSetEntry const&set) { - auto const [setUuid, err] = keel::getUuid(kctx, set.path); + auto const [setUuid, err] = getUuid(kctx, set.path); return !err && setUuid == uuid; }; auto const depMatches = [&uuid](ox::SmallMap::Pair const&set) { @@ -391,7 +400,7 @@ ox::Error WorldEditorImGui::handleDepUpdate(ox::StringView, ox::UUID const&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), m_doc).moveTo(m_objCache)); oxReturnError(loadWorldStatic(m_objCache, m_doc).moveTo(m_worldStatic)); oxReturnError(loadObjectSets()); } @@ -401,7 +410,7 @@ ox::Error WorldEditorImGui::handleDepUpdate(ox::StringView, ox::UUID const&uuid) ox::Error WorldEditorImGui::loadObjectSets() noexcept { m_objSets.clear(); m_dependencies.clear(); - auto &kctx = keelCtx(m_sctx.tctx); + auto &kctx = keelCtx(m_sctx); for (auto const&set : m_doc.objSets) { oxRequireM(os, readObj(kctx, set.path)); oxLogError(addDependency(os->tilesheet)); @@ -434,9 +443,13 @@ void WorldEditorImGui::clearSelection() noexcept { m_view.clearSelection(); } +ox::Result WorldEditorImGui::assetId() const noexcept { + return getUuid(keelCtx(m_sctx), itemPath()); +} + ox::Error WorldEditorImGui::addDependency(ox::FileAddress const&fileAddr) noexcept { - auto &kctx = keelCtx(m_sctx.tctx); - oxRequire(uuid, keel::getUuid(kctx, fileAddr)); + auto &kctx = keelCtx(m_sctx); + oxRequire(uuid, getUuid(kctx, fileAddr)); m_dependencies[uuid] = true; return {}; } diff --git a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.hpp b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.hpp index 7d5b8f0..34a2458 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.hpp +++ b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.hpp @@ -64,6 +64,8 @@ class WorldEditorImGui: public studio::Editor { void paste() override; + bool acceptsClipboardPayload() const noexcept override; + ox::Error saveItem() noexcept final; private: @@ -99,6 +101,8 @@ class WorldEditorImGui: public studio::Editor { void clearSelection() noexcept; + ox::Result assetId() const noexcept; + ox::Error addDependency(ox::FileAddress const&fileAddr) noexcept; };