[nostalgia] Split PaletteEditor into Imgui and general files, other cleanup

This commit is contained in:
Gary Talent 2022-04-08 01:05:32 -05:00
parent 632ade60b9
commit 56964e197a
16 changed files with 390 additions and 379 deletions

View File

@ -10,8 +10,6 @@
#include "irq.hpp"
#include "core.hpp"
extern "C" void isr();
namespace nostalgia::core {
extern volatile gba_timer_t g_timerMs;

View File

@ -5,6 +5,7 @@ add_library(
#new_tilesheet_wizard.cpp
#newpalettewizard.cpp
paletteeditor.cpp
paletteeditor-imgui.cpp
tilesheeteditor-imgui.cpp
tilesheeteditorview.cpp
tilesheeteditormodel.cpp

View File

@ -2,7 +2,7 @@
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include "paletteeditor.hpp"
#include "paletteeditor-imgui.hpp"
#include "tilesheeteditor-imgui.hpp"
#include "module.hpp"

View File

@ -0,0 +1,156 @@
/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <imgui.h>
#include <nostalgia/core/gfx.hpp>
#include <nostalgia/core/media.hpp>
#include <ox/std/memory.hpp>
#include "paletteeditor.hpp"
#include "paletteeditor-imgui.hpp"
namespace nostalgia::core {
ox::Result<PaletteEditorImGui*> PaletteEditorImGui::make(Context *ctx, const ox::String &path) noexcept {
auto out = ox::UniquePtr<PaletteEditorImGui>(new PaletteEditorImGui);
out->m_ctx = ctx;
out->m_itemPath = path;
const auto lastSlash = std::find(out->m_itemPath.rbegin(), out->m_itemPath.rend(), '/').offset();
out->m_itemName = out->m_itemPath.substr(lastSlash + 1);
oxRequire(pal, core::readObj<Palette>(out->m_ctx, out->m_itemPath));
out->m_pal = *pal.get();
out->undoStack()->changeTriggered.connect(out.get(), &PaletteEditorImGui::markUnsavedChanges);
return out.release();
}
const ox::String &PaletteEditorImGui::itemName() const {
return m_itemPath;
}
const ox::String &PaletteEditorImGui::itemDisplayName() const noexcept {
return m_itemName;
}
studio::UndoStack *PaletteEditorImGui::undoStack() noexcept {
return &m_undoStack;
}
void PaletteEditorImGui::draw(core::Context*) noexcept {
static constexpr auto flags = ImGuiTableFlags_RowBg;
const auto paneSize = ImGui::GetContentRegionAvail();
ImGui::BeginChild("PaletteEditor");
{
ImGui::BeginChild("Colors", ImVec2(paneSize.x - 200, paneSize.y), false);
{
const auto colorsSz = ImGui::GetContentRegionAvail();
static constexpr auto toolbarHeight = 40;
ImGui::BeginChild("Toolbar", ImVec2(colorsSz.x, toolbarHeight), true);
{
const auto sz = ImVec2(70, 24);
if (ImGui::Button("Add", sz)) {
m_undoStack.push(new AddColorCommand(&m_pal, 0, m_pal.colors.size()));
}
ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size());
{
if (ImGui::Button("Remove", sz)) {
m_undoStack.push(new RemoveColorCommand(&m_pal, m_pal.colors[static_cast<std::size_t>(m_selectedRow)], m_selectedRow));
m_selectedRow = ox::min(m_pal.colors.size() - 1, m_selectedRow);
}
ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow <= 0);
{
if (ImGui::Button("Move Up", sz)) {
m_undoStack.push(new MoveColorCommand(&m_pal, m_selectedRow, -1));
--m_selectedRow;
}
}
ImGui::EndDisabled();
ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size() - 1);
{
if (ImGui::Button("Move Down", sz)) {
m_undoStack.push(new MoveColorCommand(&m_pal, m_selectedRow, 1));
++m_selectedRow;
}
}
ImGui::EndDisabled();
}
ImGui::EndDisabled();
}
ImGui::EndChild();
ImGui::BeginTable("Colors", 5, flags, ImVec2(colorsSz.x, colorsSz.y - (toolbarHeight + 5)));
{
ImGui::TableSetupColumn("Idx", ImGuiTableColumnFlags_WidthFixed, 25);
ImGui::TableSetupColumn("Red", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Green", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Blue", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Color Preview", ImGuiTableColumnFlags_NoHide);
ImGui::TableHeadersRow();
for (auto i = 0u; const auto c : m_pal.colors) {
ImGui::PushID(static_cast<int>(i));
ImGui::TableNextRow();
// Color No.
ImGui::TableNextColumn();
ImGui::Text("%d", i);
// Red
ImGui::TableNextColumn();
ImGui::Text("%d", red16(c));
// Green
ImGui::TableNextColumn();
ImGui::Text("%d", green16(c));
// Blue
ImGui::TableNextColumn();
ImGui::Text("%d", blue16(c));
// ColorPreview
ImGui::TableNextColumn();
const auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1));
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic);
if (ImGui::Selectable("##ColorRow", i == m_selectedRow, ImGuiSelectableFlags_SpanAllColumns)) {
m_selectedRow = i;
}
ImGui::PopID();
++i;
}
}
ImGui::EndTable();
}
ImGui::EndChild();
if (m_selectedRow < m_pal.colors.size()) {
ImGui::SameLine();
ImGui::BeginChild("ColorEditor", ImVec2(200, paneSize.y), true);
{
const auto c = m_pal.colors[m_selectedRow];
int r = red16(c);
int g = green16(c);
int b = blue16(c);
int a = alpha16(c);
ImGui::InputInt("Red", &r, 1, 5);
ImGui::InputInt("Green", &g, 1, 5);
ImGui::InputInt("Blue", &b, 1, 5);
const auto newColor = color16(r, g, b, a);
if (c != newColor) {
m_undoStack.push(new UpdateColorCommand(&m_pal, m_selectedRow, c, newColor));
}
}
ImGui::EndChild();
}
}
ImGui::EndChild();
}
ox::Error PaletteEditorImGui::saveItem() noexcept {
const auto sctx = applicationData<studio::StudioContext>(m_ctx);
oxReturnError(sctx->project->writeObj(m_itemPath, &m_pal));
oxReturnError(m_ctx->assetManager.setAsset(m_itemPath, m_pal));
return OxError(0);
}
ox::Error PaletteEditorImGui::markUnsavedChanges(int) noexcept {
setUnsavedChanges(true);
return OxError(0);
}
}

View File

@ -0,0 +1,46 @@
/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include <nostalgia/core/gfx.hpp>
#include <nostalgia/studio/studio.hpp>
namespace nostalgia::core {
class PaletteEditorImGui: public studio::Editor {
private:
Context *m_ctx = nullptr;
ox::String m_itemName;
ox::String m_itemPath;
Palette m_pal;
std::size_t m_selectedRow = 0;
studio::UndoStack m_undoStack;
PaletteEditorImGui() noexcept = default;
public:
static ox::Result<PaletteEditorImGui*> make(Context *ctx, const ox::String &path) noexcept;
/**
* Returns the name of item being edited.
*/
const ox::String &itemName() const override;
const ox::String &itemDisplayName() const noexcept override;
void draw(core::Context*) noexcept override;
protected:
studio::UndoStack *undoStack() noexcept final;
ox::Error saveItem() noexcept override;
private:
ox::Error markUnsavedChanges(int) noexcept;
};
}

View File

@ -2,318 +2,104 @@
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include <algorithm>
#include <imgui.h>
#include <nostalgia/core/gfx.hpp>
#include <nostalgia/core/media.hpp>
#include <ox/std/memory.hpp>
#include "paletteeditor.hpp"
namespace nostalgia::core {
enum class PaletteEditorCommandId {
AddColor,
RemoveColor,
UpdateColor,
MoveColor,
};
class AddColorCommand: public studio::UndoCommand {
private:
PaletteEditorImGui *m_editor = nullptr;
Color16 m_color = 0;
int m_idx = -1;
public:
AddColorCommand(PaletteEditorImGui *editor, Color16 color, int idx) noexcept {
m_editor = editor;
m_color = color;
m_idx = idx;
}
~AddColorCommand() noexcept override = default;
[[nodiscard]]
int commandId() const noexcept override {
return static_cast<int>(PaletteEditorCommandId::AddColor);
}
void redo() noexcept override {
m_editor->addColor(m_idx, m_color);
}
void undo() noexcept override {
m_editor->rmColor(m_idx);
}
};
class RemoveColorCommand: public studio::UndoCommand {
private:
PaletteEditorImGui *m_editor = nullptr;
Color16 m_color = 0;
int m_idx = -1;
public:
RemoveColorCommand(PaletteEditorImGui *editor, Color16 color, int idx) noexcept {
m_editor = editor;
m_color = color;
m_idx = idx;
}
~RemoveColorCommand() noexcept override = default;
[[nodiscard]]
int commandId() const noexcept override {
return static_cast<int>(PaletteEditorCommandId::RemoveColor);
}
void redo() noexcept override {
m_editor->rmColor(m_idx);
}
void undo() noexcept override {
m_editor->addColor(m_idx, m_color);
}
};
class UpdateColorCommand: public studio::UndoCommand {
private:
PaletteEditorImGui *m_editor = nullptr;
Color16 m_oldColor = 0;
Color16 m_newColor = 0;
int m_idx = -1;
public:
UpdateColorCommand(PaletteEditorImGui *editor, int idx, Color16 oldColor, Color16 newColor) noexcept {
m_editor = editor;
m_idx = idx;
m_oldColor = oldColor;
m_newColor = newColor;
//setObsolete(m_oldColor == m_newColor);
}
~UpdateColorCommand() noexcept override = default;
bool mergeWith(const UndoCommand *cmd) noexcept final {
if (cmd->commandId() != static_cast<int>(PaletteEditorCommandId::UpdateColor)) {
return false;
}
auto ucCmd = static_cast<const UpdateColorCommand*>(cmd);
if (m_idx != ucCmd->m_idx) {
return false;
}
m_newColor = ucCmd->m_newColor;
return true;
}
int commandId() const noexcept final {
return static_cast<int>(PaletteEditorCommandId::UpdateColor);
}
void redo() noexcept final {
m_editor->updateColor(m_idx, m_newColor);
}
void undo() noexcept final {
m_editor->updateColor(m_idx, m_oldColor);
}
};
class MoveColorCommand: public studio::UndoCommand {
private:
PaletteEditorImGui *m_editor = nullptr;
std::size_t m_idx = 0;
int m_offset = 0;
public:
MoveColorCommand(PaletteEditorImGui *editor, std::size_t idx, int offset) noexcept {
m_editor = editor;
m_idx = idx;
m_offset = offset;
}
~MoveColorCommand() noexcept override = default;
[[nodiscard]]
int commandId() const noexcept override {
return static_cast<int>(PaletteEditorCommandId::MoveColor);
}
void redo() noexcept override {
m_editor->moveColor(m_idx, m_offset);
}
void undo() noexcept override {
m_editor->moveColor(static_cast<int>(m_idx) + m_offset, -m_offset);
}
};
ox::Result<PaletteEditorImGui*> PaletteEditorImGui::make(Context *ctx, const ox::String &path) noexcept {
auto out = ox::UniquePtr<PaletteEditorImGui>(new PaletteEditorImGui);
out->m_ctx = ctx;
out->m_itemPath = path;
const auto lastSlash = std::find(out->m_itemPath.rbegin(), out->m_itemPath.rend(), '/').offset();
out->m_itemName = out->m_itemPath.substr(lastSlash + 1);
oxRequire(pal, core::readObj<Palette>(out->m_ctx, out->m_itemPath));
out->m_pal = *pal.get();
out->undoStack()->changeTriggered.connect(out.get(), &PaletteEditorImGui::markUnsavedChanges);
return out.release();
AddColorCommand::AddColorCommand(Palette *pal, Color16 color, int idx) noexcept {
m_pal = pal;
m_color = color;
m_idx = idx;
}
const ox::String &PaletteEditorImGui::itemName() const {
return m_itemPath;
int AddColorCommand::commandId() const noexcept {
return static_cast<int>(PaletteEditorCommandId::AddColor);
}
const ox::String &PaletteEditorImGui::itemDisplayName() const noexcept {
return m_itemName;
void AddColorCommand::redo() noexcept {
m_pal->colors.insert(static_cast<std::size_t>(m_idx), m_color);
}
studio::UndoStack *PaletteEditorImGui::undoStack() noexcept {
return &m_undoStack;
void AddColorCommand::undo() noexcept {
oxIgnoreError(m_pal->colors.erase(static_cast<std::size_t>(m_idx)));
}
void PaletteEditorImGui::draw(core::Context*) noexcept {
static constexpr auto flags = ImGuiTableFlags_RowBg;
const auto paneSize = ImGui::GetContentRegionAvail();
ImGui::BeginChild("PaletteEditor");
{
ImGui::BeginChild("Colors", ImVec2(paneSize.x - 200, paneSize.y), false);
{
const auto colorsSz = ImGui::GetContentRegionAvail();
static constexpr auto toolbarHeight = 40;
ImGui::BeginChild("Toolbar", ImVec2(colorsSz.x, toolbarHeight), true);
{
const auto sz = ImVec2(70, 24);
if (ImGui::Button("Add", sz)) {
m_undoStack.push(new AddColorCommand(this, 0, m_pal.colors.size()));
}
ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size());
{
if (ImGui::Button("Remove", sz)) {
m_undoStack.push(new RemoveColorCommand(this, m_pal.colors[static_cast<std::size_t>(m_selectedRow)], m_selectedRow));
m_selectedRow = ox::min(m_pal.colors.size() - 1, m_selectedRow);
}
ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow <= 0);
{
if (ImGui::Button("Move Up", sz)) {
m_undoStack.push(new MoveColorCommand(this, m_selectedRow, -1));
--m_selectedRow;
}
}
ImGui::EndDisabled();
ImGui::SameLine();
ImGui::BeginDisabled(m_selectedRow >= m_pal.colors.size() - 1);
{
if (ImGui::Button("Move Down", sz)) {
m_undoStack.push(new MoveColorCommand(this, m_selectedRow, 1));
++m_selectedRow;
}
}
ImGui::EndDisabled();
}
ImGui::EndDisabled();
}
ImGui::EndChild();
ImGui::BeginTable("Colors", 5, flags, ImVec2(colorsSz.x, colorsSz.y - (toolbarHeight + 5)));
{
ImGui::TableSetupColumn("Idx", ImGuiTableColumnFlags_WidthFixed, 25);
ImGui::TableSetupColumn("Red", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Green", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Blue", ImGuiTableColumnFlags_WidthFixed, 50);
ImGui::TableSetupColumn("Color Preview", ImGuiTableColumnFlags_NoHide);
ImGui::TableHeadersRow();
for (auto i = 0u; const auto c : m_pal.colors) {
ImGui::PushID(static_cast<int>(i));
ImGui::TableNextRow();
// Color No.
ImGui::TableNextColumn();
ImGui::Text("%d", i);
// Red
ImGui::TableNextColumn();
ImGui::Text("%d", red16(c));
// Green
ImGui::TableNextColumn();
ImGui::Text("%d", green16(c));
// Blue
ImGui::TableNextColumn();
ImGui::Text("%d", blue16(c));
// ColorPreview
ImGui::TableNextColumn();
const auto ic = ImGui::GetColorU32(ImVec4(redf(c), greenf(c), bluef(c), 1));
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic);
if (ImGui::Selectable("##ColorRow", i == m_selectedRow, ImGuiSelectableFlags_SpanAllColumns)) {
m_selectedRow = i;
}
ImGui::PopID();
++i;
}
}
ImGui::EndTable();
}
ImGui::EndChild();
if (m_selectedRow < m_pal.colors.size()) {
ImGui::SameLine();
ImGui::BeginChild("ColorEditor", ImVec2(200, paneSize.y), true);
{
const auto c = m_pal.colors[m_selectedRow];
int r = red16(c);
int g = green16(c);
int b = blue16(c);
int a = alpha16(c);
ImGui::InputInt("Red", &r, 1, 5);
ImGui::InputInt("Green", &g, 1, 5);
ImGui::InputInt("Blue", &b, 1, 5);
const auto newColor = color16(r, g, b, a);
if (c != newColor) {
m_undoStack.push(new UpdateColorCommand(this, m_selectedRow, c, newColor));
}
}
ImGui::EndChild();
}
RemoveColorCommand::RemoveColorCommand(Palette *pal, Color16 color, int idx) noexcept {
m_pal = pal;
m_color = color;
m_idx = idx;
}
int RemoveColorCommand::commandId() const noexcept {
return static_cast<int>(PaletteEditorCommandId::RemoveColor);
}
void RemoveColorCommand::redo() noexcept {
oxIgnoreError(m_pal->colors.erase(static_cast<std::size_t>(m_idx)));
}
void RemoveColorCommand::undo() noexcept {
m_pal->colors.insert(static_cast<std::size_t>(m_idx), m_color);
}
UpdateColorCommand::UpdateColorCommand(Palette *pal, int idx, Color16 oldColor, Color16 newColor) noexcept {
m_pal = pal;
m_idx = idx;
m_oldColor = oldColor;
m_newColor = newColor;
//setObsolete(m_oldColor == m_newColor);
}
bool UpdateColorCommand::mergeWith(const UndoCommand *cmd) noexcept {
if (cmd->commandId() != static_cast<int>(PaletteEditorCommandId::UpdateColor)) {
return false;
}
ImGui::EndChild();
auto ucCmd = static_cast<const UpdateColorCommand*>(cmd);
if (m_idx != ucCmd->m_idx) {
return false;
}
m_newColor = ucCmd->m_newColor;
return true;
}
void PaletteEditorImGui::addColor(int idx, Color16 c) noexcept {
m_pal.colors.insert(static_cast<std::size_t>(idx), c);
setUnsavedChanges(true);
[[nodiscard]]
int UpdateColorCommand::commandId() const noexcept {
return static_cast<int>(PaletteEditorCommandId::UpdateColor);
}
void PaletteEditorImGui::rmColor(int idx) noexcept {
oxIgnoreError(m_pal.colors.erase(static_cast<std::size_t>(idx)));
setUnsavedChanges(true);
void UpdateColorCommand::redo() noexcept {
m_pal->colors[static_cast<std::size_t>(m_idx)] = m_newColor;
}
void PaletteEditorImGui::updateColor(int idx, Color16 c) noexcept {
m_pal.colors[static_cast<std::size_t>(idx)] = c;
setUnsavedChanges(true);
void UpdateColorCommand::undo() noexcept {
m_pal->colors[static_cast<std::size_t>(m_idx)] = m_oldColor;
}
void PaletteEditorImGui::moveColor(int idx, int offset) noexcept {
const auto c = m_pal.colors[static_cast<std::size_t>(idx)];
oxIgnoreError(m_pal.colors.erase(static_cast<std::size_t>(idx)));
m_pal.colors.insert(static_cast<std::size_t>(idx + offset), c);
setUnsavedChanges(true);
MoveColorCommand::MoveColorCommand(Palette *pal, std::size_t idx, int offset) noexcept {
m_pal = pal;
m_idx = idx;
m_offset = offset;
}
void PaletteEditorImGui::saveItem() {
//m_ctx->project->writeObj(m_itemPath, &m_pal);
int MoveColorCommand::commandId() const noexcept {
return static_cast<int>(PaletteEditorCommandId::MoveColor);
}
ox::Error PaletteEditorImGui::markUnsavedChanges(int) noexcept {
setUnsavedChanges(true);
return OxError(0);
void MoveColorCommand::redo() noexcept {
moveColor(static_cast<int>(m_idx), m_offset);
}
void MoveColorCommand::undo() noexcept {
moveColor(static_cast<int>(m_idx) + m_offset, -m_offset);
}
void MoveColorCommand::moveColor(int idx, int offset) noexcept {
const auto c = m_pal->colors[static_cast<std::size_t>(idx)];
oxIgnoreError(m_pal->colors.erase(static_cast<std::size_t>(idx)));
m_pal->colors.insert(static_cast<std::size_t>(idx + offset), c);
}
}

View File

@ -4,58 +4,104 @@
#pragma once
#include "nostalgia/studio/lib/undostack.hpp"
#include <nostalgia/core/gfx.hpp>
#include <nostalgia/studio/studio.hpp>
#include <ox/std/memory.hpp>
namespace nostalgia::core {
class PaletteEditorImGui: public studio::Editor {
enum class PaletteEditorCommandId {
AddColor,
RemoveColor,
UpdateColor,
MoveColor,
};
friend class AddColorCommand;
friend class RemoveColorCommand;
friend class UpdateColorCommand;
friend class MoveColorCommand;
class AddColorCommand: public studio::UndoCommand {
private:
Context *m_ctx = nullptr;
ox::String m_itemName;
ox::String m_itemPath;
Palette m_pal;
std::size_t m_selectedRow = 0;
studio::UndoStack m_undoStack;
PaletteEditorImGui() noexcept = default;
Palette *m_pal = nullptr;
Color16 m_color = 0;
int m_idx = -1;
public:
static ox::Result<PaletteEditorImGui*> make(Context *ctx, const ox::String &path) noexcept;
AddColorCommand(Palette *pal, Color16 color, int idx) noexcept;
/**
* Returns the name of item being edited.
*/
const ox::String &itemName() const override;
~AddColorCommand() noexcept override = default;
const ox::String &itemDisplayName() const noexcept override;
[[nodiscard]]
int commandId() const noexcept override;
void draw(core::Context*) noexcept override;
void redo() noexcept override;
studio::UndoStack *undoStack() noexcept final;
protected:
void addColor(int idx, Color16 c) noexcept;
void rmColor(int idx) noexcept;
void updateColor(int idx, Color16) noexcept;
void moveColor(int idx, int offset) noexcept;
void saveItem() override;
private:
ox::Error markUnsavedChanges(int) noexcept;
void undo() noexcept override;
};
}
class RemoveColorCommand: public studio::UndoCommand {
private:
Palette *m_pal = nullptr;
Color16 m_color = 0;
int m_idx = -1;
public:
RemoveColorCommand(Palette *pal, Color16 color, int idx) noexcept;
~RemoveColorCommand() noexcept override = default;
[[nodiscard]]
int commandId() const noexcept override;
void redo() noexcept override;
void undo() noexcept override;
};
class UpdateColorCommand: public studio::UndoCommand {
private:
Palette *m_pal = nullptr;
Color16 m_oldColor = 0;
Color16 m_newColor = 0;
int m_idx = -1;
public:
UpdateColorCommand(Palette *pal, int idx, Color16 oldColor, Color16 newColor) noexcept;
~UpdateColorCommand() noexcept override = default;
[[nodiscard]]
bool mergeWith(const UndoCommand *cmd) noexcept final;
[[nodiscard]]
int commandId() const noexcept final;
void redo() noexcept final;
void undo() noexcept final;
};
class MoveColorCommand: public studio::UndoCommand {
private:
Palette *m_pal = nullptr;
std::size_t m_idx = 0;
int m_offset = 0;
public:
MoveColorCommand(Palette *pal, std::size_t idx, int offset) noexcept;
~MoveColorCommand() noexcept override = default;
[[nodiscard]]
int commandId() const noexcept override;
public:
void redo() noexcept override;
void undo() noexcept override;
private:
void moveColor(int idx, int offset) noexcept;
};
}

View File

@ -182,13 +182,8 @@ studio::UndoStack *TileSheetEditorImGui::undoStack() noexcept {
return model()->undoStack();
}
void TileSheetEditorImGui::saveItem() {
const auto err = model()->saveFile();
if (!err) {
this->setUnsavedChanges(false);
} else {
oxErrorf("Could not save file {}: {}", m_itemPath, toStr(err));
}
ox::Error TileSheetEditorImGui::saveItem() noexcept {
return model()->saveFile();
}
void TileSheetEditorImGui::drawTileSheet(const geo::Vec2 &fbSize) noexcept {

View File

@ -77,7 +77,7 @@ class TileSheetEditorImGui: public studio::Editor {
studio::UndoStack *undoStack() noexcept final;
protected:
void saveItem() override;
ox::Error saveItem() noexcept override;
private:
[[nodiscard]]

View File

@ -16,7 +16,6 @@ add_library(
task.cpp
undostack.cpp
widget.cpp
window.cpp
filedialog_gtk.cpp
$<$<BOOL:${APPLE}>:filedialog_mac.mm>
)
@ -59,7 +58,6 @@ install(
task.hpp
undostack.hpp
widget.hpp
window.hpp
${CMAKE_CURRENT_BINARY_DIR}/nostalgiastudio_export.h
DESTINATION
include/nostalgia/studio/lib

View File

@ -28,9 +28,13 @@ void Editor::close() {
this->closed.emit(itemName());
}
void Editor::save() {
saveItem();
setUnsavedChanges(false);
void Editor::save() noexcept {
const auto err = saveItem();
if (!err) {
setUnsavedChanges(false);
} else {
oxErrorf("Could not save file {}: {}", itemName(), toStr(err));
}
}
void Editor::setUnsavedChanges(bool uc) {
@ -78,7 +82,8 @@ bool Editor::pasteEnabled() const {
return m_pasteEnabled;
}
void Editor::saveItem() {
ox::Error Editor::saveItem() noexcept {
return OxError(0);
}
}

View File

@ -11,12 +11,17 @@
#include "nostalgiastudio_export.h"
namespace nostalgia {
class StudioUI;
}
namespace nostalgia::studio {
class NOSTALGIASTUDIO_EXPORT Editor: public Widget {
friend StudioUI;
private:
UndoStack m_cmdStack;
bool m_unsavedChanges = false;
bool m_exportable = false;
bool m_cutEnabled = false;
@ -43,20 +48,12 @@ class NOSTALGIASTUDIO_EXPORT Editor: public Widget {
virtual void exportFile();
/**
* Returns the undo stack holding changes to the item being edited.
*/
[[nodiscard]]
virtual UndoStack *undoStack() noexcept {
return nullptr;
}
void close();
/**
* Save changes to item being edited.
*/
void save();
void save() noexcept;
/**
* Sets indication of item being edited has unsaved changes. Also emits
@ -91,7 +88,15 @@ class NOSTALGIASTUDIO_EXPORT Editor: public Widget {
/**
* Save changes to item being edited.
*/
virtual void saveItem();
virtual ox::Error saveItem() noexcept;
/**
* Returns the undo stack holding changes to the item being edited.
*/
[[nodiscard]]
virtual UndoStack *undoStack() noexcept {
return nullptr;
}
// signals
public:

View File

@ -4,8 +4,6 @@
#pragma once
#include <memory>
#include <ox/claw/read.hpp>
#include <ox/claw/write.hpp>
#include <ox/event/signal.hpp>

View File

@ -1,9 +0,0 @@
/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#include "window.hpp"

View File

@ -1,15 +0,0 @@
/*
* Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/
#pragma once
#include "widget.hpp"
namespace nostalgia::studio {
class Window: public Widget {
};
}

View File

@ -42,6 +42,7 @@ class StudioUI: public ox::SignalHandler {
void handleKeyEvent(core::Key, bool down) noexcept;
[[nodiscard]]
constexpr auto project() noexcept {
return m_project.get();
}