[nostalgia/core/studio] Add palette picker combo box
This commit is contained in:
parent
ef3a28846c
commit
6eb4070d97
Binary file not shown.
Before Width: | Height: | Size: 1.3 KiB |
@ -12,9 +12,22 @@
|
|||||||
namespace nostalgia::core {
|
namespace nostalgia::core {
|
||||||
|
|
||||||
TileSheetEditorImGui::TileSheetEditorImGui(Context *ctx, const ox::String &path): m_tileSheetEditor(ctx, path) {
|
TileSheetEditorImGui::TileSheetEditorImGui(Context *ctx, const ox::String &path): m_tileSheetEditor(ctx, path) {
|
||||||
|
m_ctx = ctx;
|
||||||
m_itemPath = path;
|
m_itemPath = path;
|
||||||
const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
|
const auto lastSlash = std::find(m_itemPath.rbegin(), m_itemPath.rend(), '/').offset();
|
||||||
m_itemName = m_itemPath.substr(lastSlash + 1);
|
m_itemName = m_itemPath.substr(lastSlash + 1);
|
||||||
|
// init palette idx
|
||||||
|
const auto palPath = model()->palPath();
|
||||||
|
auto sctx = applicationData<studio::StudioContext>(m_ctx);
|
||||||
|
const auto &palList = sctx->project->fileList(core::FileExt_npal + 1);
|
||||||
|
for (std::size_t i = 0; const auto &pal : palList) {
|
||||||
|
if (palPath == pal) {
|
||||||
|
m_selectedPaletteIdx = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
// connect signal/slots
|
||||||
undoStack()->changeTriggered.connect(this, &TileSheetEditorImGui::markUnsavedChanges);
|
undoStack()->changeTriggered.connect(this, &TileSheetEditorImGui::markUnsavedChanges);
|
||||||
m_subsheetEditor.inputSubmitted.connect(this, &TileSheetEditorImGui::updateActiveSubsheet);
|
m_subsheetEditor.inputSubmitted.connect(this, &TileSheetEditorImGui::updateActiveSubsheet);
|
||||||
}
|
}
|
||||||
@ -76,7 +89,7 @@ void TileSheetEditorImGui::draw(core::Context*) noexcept {
|
|||||||
// draw palette/color picker
|
// draw palette/color picker
|
||||||
ImGui::BeginChild("Palette", ImVec2(m_palViewWidth - 24, ySize / 2.07f), true);
|
ImGui::BeginChild("Palette", ImVec2(m_palViewWidth - 24, ySize / 2.07f), true);
|
||||||
{
|
{
|
||||||
drawPalettePicker();
|
drawPaletteSelector();
|
||||||
}
|
}
|
||||||
ImGui::EndChild();
|
ImGui::EndChild();
|
||||||
ImGui::BeginChild("SubSheets", ImVec2(m_palViewWidth - 24, ySize / 2.07f), true);
|
ImGui::BeginChild("SubSheets", ImVec2(m_palViewWidth - 24, ySize / 2.07f), true);
|
||||||
@ -200,7 +213,7 @@ void TileSheetEditorImGui::drawTileSheet(const geo::Vec2 &fbSize) noexcept {
|
|||||||
const auto wheel = io.MouseWheel;
|
const auto wheel = io.MouseWheel;
|
||||||
const auto wheelh = io.MouseWheelH;
|
const auto wheelh = io.MouseWheelH;
|
||||||
if (wheel != 0) {
|
if (wheel != 0) {
|
||||||
const auto zoomMod = ox::defines::OS == ox::OS::Darwin ? io.KeySuper : io.KeyCtrl;
|
const auto zoomMod = ox::defines::OS == ox::OS::Darwin ? io.KeySuper : core::buttonDown(m_ctx, core::Key::Mod_Ctrl);
|
||||||
m_tileSheetEditor.scrollV(fbSize, wheel, zoomMod);
|
m_tileSheetEditor.scrollV(fbSize, wheel, zoomMod);
|
||||||
}
|
}
|
||||||
if (wheelh != 0) {
|
if (wheelh != 0) {
|
||||||
@ -233,7 +246,23 @@ void TileSheetEditorImGui::drawTileSheet(const geo::Vec2 &fbSize) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheetEditorImGui::drawPalettePicker() noexcept {
|
void TileSheetEditorImGui::drawPaletteSelector() noexcept {
|
||||||
|
auto sctx = applicationData<studio::StudioContext>(m_ctx);
|
||||||
|
const auto &files = sctx->project->fileList(core::FileExt_npal + 1);
|
||||||
|
const auto first = m_selectedPaletteIdx < files.size() ? files[m_selectedPaletteIdx].c_str() : "";
|
||||||
|
if (ImGui::BeginCombo("Palette", first, 0)) {
|
||||||
|
for (auto n = 0u; n < files.size(); n++) {
|
||||||
|
const auto selected = (m_selectedPaletteIdx == n);
|
||||||
|
if (ImGui::Selectable(files[n].c_str(), selected) && m_selectedPaletteIdx != n) {
|
||||||
|
m_selectedPaletteIdx = n;
|
||||||
|
oxLogError(model()->setPalette(files[n]));
|
||||||
|
}
|
||||||
|
if (selected) {
|
||||||
|
ImGui::SetItemDefaultFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndCombo();
|
||||||
|
}
|
||||||
// header
|
// header
|
||||||
if (ImGui::BeginTable("PaletteTable", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) {
|
if (ImGui::BeginTable("PaletteTable", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingStretchProp)) {
|
||||||
ImGui::TableSetupColumn("No.", 0, 0.45);
|
ImGui::TableSetupColumn("No.", 0, 0.45);
|
||||||
|
@ -6,9 +6,7 @@
|
|||||||
|
|
||||||
#include <ox/model/def.hpp>
|
#include <ox/model/def.hpp>
|
||||||
|
|
||||||
#include <nostalgia/geo/bounds.hpp>
|
|
||||||
#include <nostalgia/geo/vec.hpp>
|
#include <nostalgia/geo/vec.hpp>
|
||||||
#include <nostalgia/core/gfx.hpp>
|
|
||||||
#include <nostalgia/glutils/glutils.hpp>
|
#include <nostalgia/glutils/glutils.hpp>
|
||||||
#include <nostalgia/studio/studio.hpp>
|
#include <nostalgia/studio/studio.hpp>
|
||||||
|
|
||||||
@ -43,6 +41,9 @@ class TileSheetEditorImGui: public studio::Editor {
|
|||||||
}
|
}
|
||||||
void draw() noexcept;
|
void draw() noexcept;
|
||||||
};
|
};
|
||||||
|
std::size_t m_selectedPaletteIdx = 0;
|
||||||
|
Context *m_ctx = nullptr;
|
||||||
|
ox::Vector<ox::String> m_paletteList;
|
||||||
SubSheetEditor m_subsheetEditor;
|
SubSheetEditor m_subsheetEditor;
|
||||||
ox::String m_itemPath;
|
ox::String m_itemPath;
|
||||||
ox::String m_itemName;
|
ox::String m_itemName;
|
||||||
@ -103,7 +104,7 @@ class TileSheetEditorImGui: public studio::Editor {
|
|||||||
|
|
||||||
void drawTileSheet(const geo::Vec2 &fbSize) noexcept;
|
void drawTileSheet(const geo::Vec2 &fbSize) noexcept;
|
||||||
|
|
||||||
void drawPalettePicker() noexcept;
|
void drawPaletteSelector() noexcept;
|
||||||
|
|
||||||
ox::Error updateActiveSubsheet(const ox::String &name, int cols, int rows) noexcept;
|
ox::Error updateActiveSubsheet(const ox::String &name, int cols, int rows) noexcept;
|
||||||
|
|
||||||
|
@ -57,6 +57,7 @@ enum class CommandId {
|
|||||||
RmSubSheet = 3,
|
RmSubSheet = 3,
|
||||||
UpdateSubSheet = 4,
|
UpdateSubSheet = 4,
|
||||||
Paste = 5,
|
Paste = 5,
|
||||||
|
PaletteChange = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr bool operator==(CommandId c, int i) noexcept {
|
constexpr bool operator==(CommandId c, int i) noexcept {
|
||||||
@ -322,6 +323,34 @@ class UpdateSubSheetCommand: public studio::UndoCommand {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class PaletteChangeCommand: public studio::UndoCommand {
|
||||||
|
private:
|
||||||
|
TileSheet *m_img = nullptr;
|
||||||
|
ox::FileAddress m_oldPalette;
|
||||||
|
ox::FileAddress m_newPalette;
|
||||||
|
|
||||||
|
public:
|
||||||
|
constexpr PaletteChangeCommand(TileSheet *img, const ox::String &newPalette) noexcept {
|
||||||
|
m_img = img;
|
||||||
|
m_oldPalette = m_img->defaultPalette;
|
||||||
|
m_newPalette = newPalette;
|
||||||
|
}
|
||||||
|
|
||||||
|
void redo() noexcept final {
|
||||||
|
m_img->defaultPalette = m_newPalette;
|
||||||
|
}
|
||||||
|
|
||||||
|
void undo() noexcept final {
|
||||||
|
m_img->defaultPalette = m_oldPalette;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
int commandId() const noexcept final {
|
||||||
|
return static_cast<int>(CommandId::PaletteChange);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
TileSheetEditorModel::TileSheetEditorModel(Context *ctx, const ox::String &path) {
|
TileSheetEditorModel::TileSheetEditorModel(Context *ctx, const ox::String &path) {
|
||||||
m_ctx = ctx;
|
m_ctx = ctx;
|
||||||
@ -378,6 +407,15 @@ void TileSheetEditorModel::paste() {
|
|||||||
pushCommand(new PasteCommand(&m_img, m_activeSubsSheetIdx, pt1, pt2, *cb));
|
pushCommand(new PasteCommand(&m_img, m_activeSubsSheetIdx, pt1, pt2, *cb));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ox::FileAddress &TileSheetEditorModel::palPath() const noexcept {
|
||||||
|
return m_img.defaultPalette;
|
||||||
|
}
|
||||||
|
|
||||||
|
ox::Error TileSheetEditorModel::setPalette(const ox::String &path) noexcept {
|
||||||
|
pushCommand(new PaletteChangeCommand(&m_img, path));
|
||||||
|
return OxError(0);
|
||||||
|
}
|
||||||
|
|
||||||
void TileSheetEditorModel::drawCommand(const geo::Point &pt, std::size_t palIdx) noexcept {
|
void TileSheetEditorModel::drawCommand(const geo::Point &pt, std::size_t palIdx) noexcept {
|
||||||
const auto &activeSubSheet = m_img.getSubSheet(m_activeSubsSheetIdx);
|
const auto &activeSubSheet = m_img.getSubSheet(m_activeSubsSheetIdx);
|
||||||
if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) {
|
if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) {
|
||||||
@ -480,6 +518,9 @@ ox::Error TileSheetEditorModel::markUpdated(int cmdId) noexcept {
|
|||||||
case CommandId::Paste:
|
case CommandId::Paste:
|
||||||
case CommandId::UpdateSubSheet:
|
case CommandId::UpdateSubSheet:
|
||||||
break;
|
break;
|
||||||
|
case CommandId::PaletteChange:
|
||||||
|
oxReturnError(readObj<Palette>(m_ctx, m_img.defaultPalette.getPath().value).moveTo(&m_pal));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include <nostalgia/core/gfx.hpp>
|
#include <nostalgia/core/gfx.hpp>
|
||||||
#include <nostalgia/geo/bounds.hpp>
|
#include <nostalgia/geo/bounds.hpp>
|
||||||
#include <nostalgia/geo/point.hpp>
|
#include <nostalgia/geo/point.hpp>
|
||||||
#include <nostalgia/geo/vec.hpp>
|
|
||||||
#include <nostalgia/studio/studio.hpp>
|
#include <nostalgia/studio/studio.hpp>
|
||||||
|
|
||||||
namespace nostalgia::core {
|
namespace nostalgia::core {
|
||||||
@ -53,6 +52,11 @@ class TileSheetEditorModel: public ox::SignalHandler {
|
|||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr const Palette &pal() const noexcept;
|
constexpr const Palette &pal() const noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
const ox::FileAddress &palPath() const noexcept;
|
||||||
|
|
||||||
|
ox::Error setPalette(const ox::String &path) noexcept;
|
||||||
|
|
||||||
void drawCommand(const geo::Point &pt, std::size_t palIdx) noexcept;
|
void drawCommand(const geo::Point &pt, std::size_t palIdx) noexcept;
|
||||||
|
|
||||||
void endDrawCommand() noexcept;
|
void endDrawCommand() noexcept;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user