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 41c82e8d..e58bb1b0 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.cpp @@ -88,11 +88,11 @@ static ox::Error toPngFile( TileSheetEditorImGui::TileSheetEditorImGui(studio::StudioContext &sctx, ox::StringParam path): Editor(std::move(path)), - m_sctx(sctx), - m_tctx(m_sctx.tctx), - m_view(m_sctx, itemPath(), *undoStack()), - m_model(m_view.model()) { - std::ignore = setPaletteSelection(); + m_sctx{sctx}, + m_tctx{m_sctx.tctx}, + m_palPicker{"Palette Chooser", keelCtx(sctx), FileExt_npal}, + m_view{m_sctx, itemPath(), *undoStack()}, + m_model{m_view.model()} { // connect signal/slots m_subsheetEditor.inputSubmitted.connect(this, &TileSheetEditorImGui::updateActiveSubsheet); m_exportMenu.inputSubmitted.connect(this, &TileSheetEditorImGui::exportSubhseetToPng); @@ -132,10 +132,10 @@ void TileSheetEditorImGui::keyStateChanged(turbine::Key key, bool down) { if (key == turbine::Key::Escape) { m_subsheetEditor.close(); m_exportMenu.close(); + m_palPicker.close(); } - auto const popupOpen = m_subsheetEditor.isOpen() || m_exportMenu.isOpen(); auto const pal = m_model.pal(); - if (!popupOpen) { + if (ig::mainWinHasFocus() && !m_palPathFocused) { auto const colorCnt = gfx::colorCnt(pal, m_model.palettePage()); if (key == turbine::Key::Alpha_D) { m_tool = TileSheetTool::Draw; @@ -183,9 +183,8 @@ void TileSheetEditorImGui::keyStateChanged(turbine::Key key, bool down) { } void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept { - auto const popupOpen = m_subsheetEditor.isOpen() || m_exportMenu.isOpen(); - if (!popupOpen && m_tool == TileSheetTool::Select) { - if (ImGui::IsKeyDown(ImGuiKey_ModCtrl)) { + if (ig::mainWinHasFocus() && m_tool == TileSheetTool::Select) { + if (ImGui::IsKeyDown(ImGuiKey_ModCtrl) && !m_palPathFocused) { if (ImGui::IsKeyPressed(ImGuiKey_A)) { auto const&img = m_model.activeSubSheet(); m_model.setSelection({{}, {img.columns * TileWidth - 1, img.rows * TileHeight - 1}}); @@ -277,6 +276,11 @@ void TileSheetEditorImGui::draw(studio::StudioContext&) noexcept { ImGui::EndChild(); m_subsheetEditor.draw(m_tctx); m_exportMenu.draw(m_tctx); + if (auto pal = m_palPicker.draw(m_sctx)) { + if (*pal != m_model.palPath()) { + oxLogError(m_model.setPalette(*pal)); + } + } } void TileSheetEditorImGui::drawSubsheetSelector( @@ -437,20 +441,26 @@ void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept { } void TileSheetEditorImGui::drawPaletteMenu() noexcept { + ig::IDStackItem const idStackItem{"PaletteMenu"}; auto constexpr comboWidthSub = 62; ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x - comboWidthSub); auto constexpr palTags = ImGuiInputTextFlags_ReadOnly; - if (ig::InputText("Palette", m_selectedPalette, palTags)) { - oxLogError(m_model.setPalette(m_selectedPalette)); + if (ig::InputTextWithHint("##Palette", "Path to Palette", m_model.palPath(), palTags)) { + oxLogError(m_model.setPalette(m_model.palPath())); } + m_palPathFocused = ImGui::IsItemFocused(); if (ig::DragDropTarget const dragDropTarget; dragDropTarget) { auto const [ref, err] = ig::getDragDropPayload("FileRef"); if (!err && endsWith(ref.path, FileExt_npal)) { - if (ref.path != m_selectedPalette) { + if (ref.path != m_model.palPath()) { oxLogError(m_model.setPalette(ref.path)); } } } + ImGui::SameLine(); + if (ImGui::Button("Browse")) { + m_palPicker.open(); + } auto const pages = m_model.pal().pages.size(); if (pages > 1) { ig::IndentStackItem const indentStackItem{20}; @@ -521,7 +531,6 @@ ox::Error TileSheetEditorImGui::updateActiveSubsheet(ox::StringView const&name, } ox::Error TileSheetEditorImGui::setPaletteSelection() noexcept { - m_selectedPalette = m_model.palPath(); return {}; } diff --git a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp index f3490b34..8fd58a54 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditor-imgui.hpp @@ -9,6 +9,7 @@ #include #include +#include #include "tilesheetpixelgrid.hpp" #include "tilesheetpixels.hpp" @@ -46,17 +47,18 @@ class TileSheetEditorImGui: public studio::Editor { constexpr bool isOpen() const noexcept { return m_show; } }; static constexpr float s_palViewWidth = 300; - ox::String m_selectedPalette; studio::StudioContext &m_sctx; turbine::Context &m_tctx; ox::Vector m_paletteList; SubSheetEditor m_subsheetEditor; ExportMenu m_exportMenu; + studio::FilePickerPopup m_palPicker; glutils::FrameBuffer m_framebuffer; TileSheetEditorView m_view; TileSheetEditorModel &m_model; ox::Vec2 m_prevMouseDownPos; TileSheetTool m_tool = TileSheetTool::Draw; + bool m_palPathFocused{}; public: TileSheetEditorImGui(studio::StudioContext &sctx, ox::StringParam path); diff --git a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditormodel.cpp b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditormodel.cpp index 04cb839e..44fcfdd6 100644 --- a/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditormodel.cpp +++ b/src/nostalgia/modules/gfx/src/studio/tilesheeteditor/tilesheeteditormodel.cpp @@ -4,8 +4,6 @@ #include -#include -#include #include #include @@ -86,9 +84,9 @@ void TileSheetEditorModel::copy() { auto cb = ox::make_unique(); iterateSelectionRows(*m_selection, [&](int const x, int const y) { auto pt = ox::Point{x, y}; - const auto&s = activeSubSheet(); - const auto idx = gfx::idx(s, pt); - const auto c = getPixel(s, idx); + auto const&s = activeSubSheet(); + auto const idx = gfx::idx(s, pt); + auto const c = getPixel(s, idx); pt -= m_selection->a; cb->addPixel(pt, c); }); @@ -149,11 +147,11 @@ size_t TileSheetEditorModel::palettePage() const noexcept { } void TileSheetEditorModel::drawCommand(ox::Point const&pt, std::size_t const palIdx) noexcept { - const auto &activeSubSheet = getSubSheet(m_img, m_activeSubsSheetIdx); + auto const &activeSubSheet = getSubSheet(m_img, m_activeSubsSheetIdx); if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) { return; } - const auto idx = gfx::idx(activeSubSheet, pt); + auto const idx = gfx::idx(activeSubSheet, pt); if (m_ongoingDrawCommand) { m_updated = m_updated || m_ongoingDrawCommand->append(idx); } else if (getPixel(activeSubSheet, idx) != palIdx) { @@ -255,14 +253,16 @@ bool TileSheetEditorModel::updated() const noexcept { ox::Error TileSheetEditorModel::markUpdatedCmdId(studio::UndoCommand const*cmd) noexcept { m_updated = true; - const auto cmdId = cmd->commandId(); + auto const cmdId = cmd->commandId(); if (static_cast(cmdId) == CommandId::PaletteChange) { - OX_RETURN_ERROR(readObj(keelCtx(m_tctx), m_img.defaultPalette).moveTo(m_pal)); - m_palettePage = ox::min(m_pal->pages.size(), 0); + if (readObj(keelCtx(m_tctx), m_img.defaultPalette).moveTo(m_pal)) { + m_pal = keel::AssetRef{}; + } + m_palettePage = ox::min(pal().pages.size(), 0); paletteChanged.emit(); } - auto tsCmd = dynamic_cast(cmd); - auto idx = validateSubSheetIdx(m_img, tsCmd->subsheetIdx()); + auto const tsCmd = dynamic_cast(cmd); + auto const idx = validateSubSheetIdx(m_img, tsCmd->subsheetIdx()); if (idx != m_activeSubsSheetIdx) { setActiveSubsheet(idx); }