From 03d4a5736ea9a98a260b8cf47232439032ddac92 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Thu, 20 Feb 2025 23:20:43 -0600 Subject: [PATCH] [nostalgia,studio] Add ability to navigate from tile sheet to palette color --- .../paletteeditor/paletteeditor-imgui.cpp | 21 +++++++++++++++++++ .../paletteeditor/paletteeditor-imgui.hpp | 2 ++ .../tilesheeteditor/tilesheeteditor-imgui.cpp | 6 +++++- src/olympic/studio/applib/src/studioapp.cpp | 10 +++++++++ src/olympic/studio/applib/src/studioapp.hpp | 2 ++ .../studio/modlib/include/studio/context.hpp | 2 ++ .../studio/modlib/include/studio/editor.hpp | 2 ++ src/olympic/studio/modlib/src/editor.cpp | 2 ++ 8 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp b/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp index 8a433078..2f01775a 100644 --- a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.cpp +++ b/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/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp b/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp index f3865e34..1ad127d6 100644 --- a/src/nostalgia/modules/gfx/src/studio/paletteeditor/paletteeditor-imgui.hpp +++ b/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/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp index 8b79ae42..20c92030 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/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/src/olympic/studio/applib/src/studioapp.cpp b/src/olympic/studio/applib/src/studioapp.cpp index ea2b04bc..a17e8c54 100644 --- a/src/olympic/studio/applib/src/studioapp.cpp +++ b/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/src/olympic/studio/applib/src/studioapp.hpp b/src/olympic/studio/applib/src/studioapp.hpp index 6809102a..a37c5314 100644 --- a/src/olympic/studio/applib/src/studioapp.hpp +++ b/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/src/olympic/studio/modlib/include/studio/context.hpp b/src/olympic/studio/modlib/include/studio/context.hpp index 970d27e9..f14fe0ee 100644 --- a/src/olympic/studio/modlib/include/studio/context.hpp +++ b/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/src/olympic/studio/modlib/include/studio/editor.hpp b/src/olympic/studio/modlib/include/studio/editor.hpp index db6db911..20e9ec61 100644 --- a/src/olympic/studio/modlib/include/studio/editor.hpp +++ b/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/src/olympic/studio/modlib/src/editor.cpp b/src/olympic/studio/modlib/src/editor.cpp index 8aef1515..37f4f235 100644 --- a/src/olympic/studio/modlib/src/editor.cpp +++ b/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)),