diff --git a/deps/nostalgia/deps/ox/src/ox/std/vector.hpp b/deps/nostalgia/deps/ox/src/ox/std/vector.hpp index 7f10ff5..a8868bd 100644 --- a/deps/nostalgia/deps/ox/src/ox/std/vector.hpp +++ b/deps/nostalgia/deps/ox/src/ox/std/vector.hpp @@ -311,6 +311,8 @@ class Vector: detail::VectorAllocator { */ constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept); + constexpr Error remove(T const &val); + constexpr void reserve(std::size_t cap) noexcept(useNoexcept); constexpr void shrink_to_fit() noexcept(useNoexcept); @@ -659,6 +661,17 @@ constexpr Error Vector::unordered_erase(std::size return ox::Error(0); } +template +constexpr ox::Error Vector::remove(T const &val) { + for (size_t i{}; auto const &v : *this) { + if (v == val) { + return erase(i).error; + } + ++i; + } + return ox::Error{1, "element not found"}; +} + template constexpr void Vector::reserve(std::size_t cap) noexcept(useNoexcept) { if (cap <= m_cap) { diff --git a/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp b/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp index 8a43307..2f01775 100644 --- a/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp +++ b/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp @@ -94,6 +94,27 @@ ox::Error PaletteEditorImGui::saveItem() noexcept { return m_sctx.project->writeObj(itemPath(), m_pal, ox::ClawFormat::Organic); } +void PaletteEditorImGui::navigateTo(ox::StringViewCR arg) noexcept { + auto const args = ox::split<2>(arg, ';'); + if (args.size() < 2) { + return; + } + auto const &color = args[0]; + auto const &page = args[1]; + { + auto const [c, err] = atoi(color); + if (!err && static_cast(c) < colorCnt(m_pal)) { + m_selectedColorRow = static_cast(c); + } + } + { + auto const [pg, err] = atoi(page); + if (!err && static_cast(pg) < m_pal.pages.size()) { + m_page = static_cast(pg); + } + } +} + void PaletteEditorImGui::drawColumnLeftAlign(ox::CStringView txt) noexcept { ImGui::TableNextColumn(); ImGui::Text("%s", txt.c_str()); diff --git a/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp b/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp index f3865e3..1ad127d 100644 --- a/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp +++ b/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp @@ -45,6 +45,8 @@ class PaletteEditorImGui: public studio::Editor { protected: ox::Error saveItem() noexcept final; + void navigateTo(ox::StringViewCR arg) noexcept override; + private: static void drawColumnLeftAlign(ox::CStringView txt) noexcept; diff --git a/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index 8b79ae4..20c9203 100644 --- a/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/deps/nostalgia/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -565,9 +565,13 @@ void TileSheetEditorImGui::drawPaletteMenu() noexcept { label.c_str(), rowSelected, ImGuiSelectableFlags_SpanAllColumns)) { m_view.setPalIdx(i); } + if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(0)) { + auto const rqst = ox::sfmt>("{};{}", i, m_model.palettePage()); + oxLogError(studio::navigateTo(m_sctx, m_model.palPath(), rqst)); + } // Column: color RGB ImGui::TableNextColumn(); - auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1)); + auto const ic = ImGui::GetColorU32({redf(c), greenf(c), bluef(c), 1}); ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic); ImGui::TableNextColumn(); auto const&name = i < pal.colorNames.size() ? pal.colorNames[i].c_str() : ""; diff --git a/deps/nostalgia/src/olympic/studio/applib/src/studioapp.cpp b/deps/nostalgia/src/olympic/studio/applib/src/studioapp.cpp index ea2b04b..a17e8c5 100644 --- a/deps/nostalgia/src/olympic/studio/applib/src/studioapp.cpp +++ b/deps/nostalgia/src/olympic/studio/applib/src/studioapp.cpp @@ -18,6 +18,10 @@ namespace studio { +ox::Error navigateTo(StudioContext &ctx, ox::StringViewCR filePath, ox::StringViewCR args) noexcept { + return ctx.ui.navigateTo(filePath, args); +} + namespace ig { extern bool s_mainWinHasFocus; } @@ -107,6 +111,12 @@ void StudioUI::handleKeyEvent(turbine::Key const key, bool const down) noexcept } } +ox::Error StudioUI::navigateTo(ox::StringViewCR path, ox::StringViewCR navArgs) noexcept { + OX_RETURN_ERROR(openFile(path)); + m_activeEditor->navigateTo(navArgs); + return {}; +} + void StudioUI::draw() noexcept { glutils::clearScreen(); drawMenu(); diff --git a/deps/nostalgia/src/olympic/studio/applib/src/studioapp.hpp b/deps/nostalgia/src/olympic/studio/applib/src/studioapp.hpp index 6809102..a37c531 100644 --- a/deps/nostalgia/src/olympic/studio/applib/src/studioapp.hpp +++ b/deps/nostalgia/src/olympic/studio/applib/src/studioapp.hpp @@ -68,6 +68,8 @@ class StudioUI: public ox::SignalHandler { void handleKeyEvent(turbine::Key, bool down) noexcept; + ox::Error navigateTo(ox::StringViewCR path, ox::StringViewCR navArgs = {}) noexcept; + [[nodiscard]] constexpr Project *project() noexcept { return m_project.get(); diff --git a/deps/nostalgia/src/olympic/studio/modlib/include/studio/context.hpp b/deps/nostalgia/src/olympic/studio/modlib/include/studio/context.hpp index 970d27e..f14fe0e 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/include/studio/context.hpp +++ b/deps/nostalgia/src/olympic/studio/modlib/include/studio/context.hpp @@ -27,4 +27,6 @@ inline keel::Context &keelCtx(StudioContext &ctx) noexcept { return keelCtx(ctx.tctx); } +ox::Error navigateTo(StudioContext &ctx, ox::StringViewCR filePath, ox::StringViewCR args) noexcept; + } diff --git a/deps/nostalgia/src/olympic/studio/modlib/include/studio/editor.hpp b/deps/nostalgia/src/olympic/studio/modlib/include/studio/editor.hpp index db6db91..20e9ec6 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/include/studio/editor.hpp +++ b/deps/nostalgia/src/olympic/studio/modlib/include/studio/editor.hpp @@ -99,6 +99,8 @@ class BaseEditor: public Widget { [[nodiscard]] virtual UndoStack *undoStack() noexcept; + virtual void navigateTo(ox::StringViewCR arg) noexcept; + void setRequiresConstantRefresh(bool value) noexcept; // signals diff --git a/deps/nostalgia/src/olympic/studio/modlib/src/editor.cpp b/deps/nostalgia/src/olympic/studio/modlib/src/editor.cpp index 8aef151..37f4f23 100644 --- a/deps/nostalgia/src/olympic/studio/modlib/src/editor.cpp +++ b/deps/nostalgia/src/olympic/studio/modlib/src/editor.cpp @@ -106,6 +106,8 @@ UndoStack *BaseEditor::undoStack() noexcept { return nullptr; } +void BaseEditor::navigateTo(ox::StringViewCR) noexcept {} + Editor::Editor(StudioContext &ctx, ox::StringParam itemPath) noexcept: m_itemPath(std::move(itemPath)),