diff --git a/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp b/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp index fa1a573f..94efdd2d 100644 --- a/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp @@ -56,6 +56,10 @@ void TileSheetEditorImGui::draw(core::Context*) noexcept { ImGui::EndChild(); } +studio::UndoStack *TileSheetEditorImGui::undoStack() noexcept { + return m_tileSheetEditor.undoStack(); +} + void TileSheetEditorImGui::saveItem() { } @@ -93,7 +97,7 @@ void TileSheetEditorImGui::drawTileSheet(const geo::Vec2 &fbSize) noexcept { const auto &winPos = ImGui::GetWindowPos(); clickPos.x -= winPos.x + 10; clickPos.y -= winPos.y + 10; - m_tileSheetEditor.click(fbSize, clickPos, m_palIdx); + m_tileSheetEditor.click(fbSize, clickPos); } } if (io.MouseReleased[0]) { @@ -113,13 +117,13 @@ void TileSheetEditorImGui::drawPalettePicker() noexcept { // Column: color idx ImGui::TableNextColumn(); const auto label = ox::BString<8>() + (i + 1); - const auto rowSelected = i == m_palIdx; + const auto rowSelected = i == m_tileSheetEditor.palIdx(); if (ImGui::Selectable(label.c_str(), rowSelected, ImGuiSelectableFlags_SpanAllColumns)) { - m_palIdx = i; + m_tileSheetEditor.setPalIdx(i); } // Column: color RGB ImGui::TableNextColumn(); - ImGui::Text("(%d, %d, %d)", red16(c), green16(c), blue16(c)); + ImGui::Text("(%02d, %02d, %02d)", red16(c), green16(c), blue16(c)); ImGui::TableNextRow(); ImGui::PopID(); ++i; diff --git a/src/nostalgia/core/studio/tilesheeteditor-imgui.hpp b/src/nostalgia/core/studio/tilesheeteditor-imgui.hpp index 3680a8a3..196ee6f6 100644 --- a/src/nostalgia/core/studio/tilesheeteditor-imgui.hpp +++ b/src/nostalgia/core/studio/tilesheeteditor-imgui.hpp @@ -28,9 +28,6 @@ class TileSheetEditorImGui: public studio::Editor { float m_palViewWidth = 200; geo::Vec2 m_prevMouseDownPos; - // palette view vars - std::size_t m_palIdx = 0; - public: TileSheetEditorImGui(Context *ctx, const ox::String &path); @@ -50,6 +47,8 @@ class TileSheetEditorImGui: public studio::Editor { void draw(core::Context*) noexcept override; + virtual studio::UndoStack *undoStack() noexcept override; + protected: void saveItem() override; diff --git a/src/nostalgia/core/studio/tilesheeteditor.cpp b/src/nostalgia/core/studio/tilesheeteditor.cpp index 04a42712..64d274a3 100644 --- a/src/nostalgia/core/studio/tilesheeteditor.cpp +++ b/src/nostalgia/core/studio/tilesheeteditor.cpp @@ -63,7 +63,7 @@ void TileSheetEditor::scrollH(const geo::Vec2 &paneSz, float wheelh) noexcept { m_scrollOffset.x = ox::clamp(m_scrollOffset.x, -(sheetSize.x / 2), 0.f); } -void TileSheetEditor::click(const geo::Vec2 &paneSize, const geo::Vec2 &clickPos, size_t palIdx) noexcept { +void TileSheetEditor::click(const geo::Vec2 &paneSize, const geo::Vec2 &clickPos) noexcept { auto [x, y] = clickPos; const auto pixDrawSz = m_pixelsDrawer.pixelSize(paneSize); x /= paneSize.x; @@ -73,7 +73,7 @@ void TileSheetEditor::click(const geo::Vec2 &paneSize, const geo::Vec2 &clickPos x /= pixDrawSz.x; y /= pixDrawSz.y; const auto pt = geo::Point(static_cast(x * 2), static_cast(y * 2)); - m_model.drawCommand(pt, palIdx); + m_model.drawCommand(pt, m_palIdx); } void TileSheetEditor::releaseMouseButton() noexcept { diff --git a/src/nostalgia/core/studio/tilesheeteditor.hpp b/src/nostalgia/core/studio/tilesheeteditor.hpp index 46d14ebb..0ba5df11 100644 --- a/src/nostalgia/core/studio/tilesheeteditor.hpp +++ b/src/nostalgia/core/studio/tilesheeteditor.hpp @@ -45,6 +45,7 @@ class TileSheetEditor { float m_pixelSizeMod = 1; bool m_updated = false; geo::Vec2 m_scrollOffset; + std::size_t m_palIdx = 0; public: TileSheetEditor(Context *ctx, const ox::String &path); @@ -59,7 +60,7 @@ class TileSheetEditor { void draw() noexcept; - void click(const geo::Vec2 &paneSize, const geo::Vec2 &clickPos, size_t palIdx) noexcept; + void click(const geo::Vec2 &paneSize, const geo::Vec2 &clickPos) noexcept; void releaseMouseButton() noexcept; @@ -75,11 +76,24 @@ class TileSheetEditor { [[nodiscard]] constexpr const NostalgiaPalette &pal() const noexcept; + constexpr auto setPalIdx(auto palIdx) noexcept { + m_palIdx = palIdx; + } + + [[nodiscard]] + constexpr auto palIdx() const noexcept { + return m_palIdx; + } + [[nodiscard]] bool updated() const noexcept; void ackUpdate() noexcept; + constexpr studio::UndoStack *undoStack() noexcept { + return m_model.undoStack(); + } + protected: void saveItem(); diff --git a/src/nostalgia/core/studio/tilesheeteditormodel.cpp b/src/nostalgia/core/studio/tilesheeteditormodel.cpp index b7abf1d6..19850129 100644 --- a/src/nostalgia/core/studio/tilesheeteditormodel.cpp +++ b/src/nostalgia/core/studio/tilesheeteditormodel.cpp @@ -29,7 +29,7 @@ void TileSheetEditorModel::drawCommand(const geo::Point &pt, std::size_t palIdx) } else { const auto idx = ptToIdx(pt, m_img.columns); if (m_img.getPixel(idx) != palIdx) { - pushCommand(new DrawCommand(&m_img, idx, palIdx)); + pushCommand(new DrawCommand(&m_updated, &m_img, idx, palIdx)); } } } diff --git a/src/nostalgia/core/studio/tilesheeteditormodel.hpp b/src/nostalgia/core/studio/tilesheeteditormodel.hpp index d6b24f06..08596f76 100644 --- a/src/nostalgia/core/studio/tilesheeteditormodel.hpp +++ b/src/nostalgia/core/studio/tilesheeteditormodel.hpp @@ -31,9 +31,11 @@ struct DrawCommand: public studio::UndoCommand { NostalgiaGraphic *m_img = nullptr; ox::Vector m_changes; int m_palIdx = 0; + bool *m_modelUpdated = nullptr; public: - constexpr DrawCommand(NostalgiaGraphic *img, std::size_t idx, int palIdx) noexcept { + constexpr DrawCommand(bool *updated, NostalgiaGraphic *img, std::size_t idx, int palIdx) noexcept { + m_modelUpdated = updated; m_img = img; m_changes.emplace_back(idx, m_img->getPixel(idx)); m_palIdx = palIdx; @@ -55,16 +57,18 @@ struct DrawCommand: public studio::UndoCommand { } void redo() noexcept final { - for (const auto &c : m_changes) { - oxDebugf("{} to {}", c.idx, m_palIdx); + for (const auto &c : m_changes + ) { m_img->setPixel(c.idx, m_palIdx); } + *m_modelUpdated = true; } void undo() noexcept final { for (const auto &c : m_changes) { m_img->setPixel(c.idx, c.oldPalIdx); } + *m_modelUpdated = true; } }; @@ -146,6 +150,10 @@ class TileSheetEditorModel { void ackUpdate() noexcept; + constexpr studio::UndoStack *undoStack() noexcept { + return &m_undoStack; + } + protected: void saveItem();