diff --git a/src/jasper/modules/world/include/jasper/world/worldstatic.hpp b/src/jasper/modules/world/include/jasper/world/worldstatic.hpp index 1fce866..79c9633 100644 --- a/src/jasper/modules/world/include/jasper/world/worldstatic.hpp +++ b/src/jasper/modules/world/include/jasper/world/worldstatic.hpp @@ -14,8 +14,6 @@ namespace jasper::world { -namespace ngfx = nostalgia::gfx; - constexpr void setTopEdge(uint8_t &layerAttachments, uint8_t const val) noexcept { layerAttachments = static_cast((layerAttachments & 0b11111100) | val); } 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 d529e3b..f394c8b 100644 --- a/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp +++ b/src/jasper/modules/world/src/studio/worldeditor/worldeditor-imgui.cpp @@ -9,6 +9,7 @@ #include +#include #include #include "commands/addrmobjectset.hpp" @@ -64,8 +65,8 @@ constexpr ox::Point fbPtToTileAddr( constexpr auto RowsOnScrn = 10; auto const fbX = static_cast(fbPt.x); auto const fbY = static_cast(fbPt.y); - auto const tw = static_cast(mapSz.x / ColumnsOnScrn); - auto const th = static_cast(mapSz.y / RowsOnScrn); + auto const tw = mapSz.x / static_cast(ColumnsOnScrn); + auto const th = mapSz.y / static_cast(RowsOnScrn); return { static_cast(fbX / tw), static_cast(fbY / th), @@ -222,6 +223,9 @@ void WorldEditorImGui::drawObjSelector() noexcept { if (ImGui::TreeNodeEx(setName.c_str(), flags)) { for (auto const&obj : set->objects) { if (ImGui::TreeNodeEx(obj.name.c_str(), ImGuiTreeNodeFlags_Leaf)) { + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + studio::navigateTo(m_sctx, setName, obj.name); + } ImGui::TreePop(); } ig::dragDropSource([&] { diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp index 47018c8..f478d38 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.cpp @@ -10,16 +10,16 @@ EditObjectSubSheet::EditObjectSubSheet( WorldObjectSet &doc, size_t const objIdx, ngfx::SubSheetId const newSubSheet, - uint8_t const newFrames) noexcept: + uint8_t const newFrames): m_doc{doc}, m_objIdx{objIdx}, m_oldSubSheet{m_doc.objects[objIdx].subsheetId}, m_newSubSheet{newSubSheet}, m_oldFrames{m_doc.objects[objIdx].frames}, m_newFrames{newFrames} { - setObsolete( - m_newSubSheet == m_oldSubSheet && - m_newFrames == m_oldFrames); + if (m_newSubSheet == m_oldSubSheet && m_newFrames == m_oldFrames) { + throw ox::Exception{1, "EditObjectSubsheet: no change occurred"}; + } } ox::Error EditObjectSubSheet::redo() noexcept { diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp index b5c8596..96cec49 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/commands/editobject.hpp @@ -119,7 +119,7 @@ class EditObjectSubSheet: public studio::UndoCommand { WorldObjectSet &doc, size_t objIdx, ngfx::SubSheetId newSubSheet, - uint8_t newFrames) noexcept; + uint8_t newFrames); ox::Error redo() noexcept override; diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp index e68ca48..760ef2a 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.cpp @@ -77,6 +77,18 @@ void WorldObjectSetEditorImGui::draw(studio::Context&) noexcept { void WorldObjectSetEditorImGui::onActivated() noexcept { } +void WorldObjectSetEditorImGui::navigateTo(ox::StringViewCR arg) noexcept { + auto const idx = ox::find_if( + m_doc.objects.begin(), + m_doc.objects.end(), + [arg](WorldObject const &wo) { + return wo.name == arg; + }); + if (idx != m_doc.objects.end()) { + m_selectedObj = idx.offset();; + } +} + WorldObject const&WorldObjectSetEditorImGui::activeObj() const noexcept { return m_doc.objects[m_selectedObj]; } @@ -257,6 +269,9 @@ void WorldObjectSetEditorImGui::drawSubSheetNode(ngfx::TileSheet::SubSheet const std::ignore = pushCommand( m_doc, m_selectedObj, ss.id, static_cast(ss.subsheets.size())); } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + studio::navigateTo(m_sctx, m_tilesheetPath, ox::intToStr(ss.id)); + } for (auto const&child : ss.subsheets) { drawSubSheetNode(child); } @@ -266,11 +281,17 @@ void WorldObjectSetEditorImGui::drawSubSheetNode(ngfx::TileSheet::SubSheet const std::ignore = pushCommand( m_doc, m_selectedObj, ss.id, static_cast(ss.subsheets.size())); } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + studio::navigateTo(m_sctx, m_tilesheetPath, ox::intToStr(ss.id)); + } } } else if (ImGui::TreeNodeEx(ss.name.c_str(), ImGuiTreeNodeFlags_Leaf | selected)) { if (ImGui::IsItemClicked()) { std::ignore = pushCommand(m_doc, m_selectedObj, ss.id, static_cast(1)); } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + studio::navigateTo(m_sctx, m_tilesheetPath, ox::intToStr(ss.id)); + } ImGui::TreePop(); } } @@ -311,6 +332,12 @@ void WorldObjectSetEditorImGui::drawPaletteListItems() noexcept { if (ImGui::Selectable("##PaletteSelection", i == m_selectedPal, ImGuiSelectableFlags_SpanAllColumns)) { m_selectedPal = i; } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) { + auto const [p, err] = m_doc.palettes[i].getPath(); + if (!err) { + studio::navigateTo(m_sctx, p); + } + } ++i; } } diff --git a/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.hpp b/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.hpp index fb0d433..fbeb7f0 100644 --- a/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.hpp +++ b/src/jasper/modules/world/src/studio/worldobjectseteditor/worldobjectseteditor-imgui.hpp @@ -41,6 +41,8 @@ class WorldObjectSetEditorImGui: public studio::Editor { void onActivated() noexcept override; + void navigateTo(ox::StringViewCR arg) noexcept override; + private: WorldObject const&activeObj() const noexcept;