From 56ec0636584a891eff6b0447f132294be631bed6 Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Sat, 19 Feb 2022 01:45:37 -0600 Subject: [PATCH] [nostalgia/studio] Get save working --- src/nostalgia/core/CMakeLists.txt | 15 ++++++----- .../core/studio/tilesheeteditor-imgui.cpp | 6 +++++ src/nostalgia/core/studio/tilesheeteditor.hpp | 10 ++++++++ .../core/studio/tilesheeteditormodel.cpp | 10 ++++++++ .../core/studio/tilesheeteditormodel.hpp | 4 +++ src/nostalgia/core/typeconv.cpp | 7 +++--- src/nostalgia/studio/CMakeLists.txt | 3 --- src/nostalgia/studio/lib/CMakeLists.txt | 2 -- src/nostalgia/studio/lib/undostack.hpp | 10 ++++++++ src/nostalgia/studio/studioapp.cpp | 25 +++++++++++-------- src/nostalgia/tools/CMakeLists.txt | 5 ++++ src/nostalgia/tools/pack/CMakeLists.txt | 3 --- 12 files changed, 73 insertions(+), 27 deletions(-) diff --git a/src/nostalgia/core/CMakeLists.txt b/src/nostalgia/core/CMakeLists.txt index bf5ec097..4b115daa 100644 --- a/src/nostalgia/core/CMakeLists.txt +++ b/src/nostalgia/core/CMakeLists.txt @@ -45,19 +45,22 @@ else() ) endif() -add_library( - NostalgiaCore +set( + NOSTALGIA_CORE_GENERAL_SRC gfx.cpp media.cpp typeconv.cpp +) + +add_library( + NostalgiaCore + ${NOSTALGIA_CORE_GENERAL_SRC} ${NOSTALGIA_CORE_IMPL_SRC} ) add_library( NostalgiaCore-Headless - gfx.cpp - media.cpp - typeconv.cpp + ${NOSTALGIA_CORE_GENERAL_SRC} headless/core.cpp headless/gfx.cpp headless/media.cpp @@ -75,7 +78,7 @@ target_link_libraries( ) target_link_libraries( - NostalgiaCore-Headless PUBLIC + NostalgiaCore-Headless PUBLIC OxClaw OxFS ) diff --git a/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp b/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp index e5caaf6d..22dc27b7 100644 --- a/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp +++ b/src/nostalgia/core/studio/tilesheeteditor-imgui.cpp @@ -61,6 +61,12 @@ studio::UndoStack *TileSheetEditorImGui::undoStack() noexcept { } void TileSheetEditorImGui::saveItem() { + const auto err = m_tileSheetEditor.model()->saveFile(); + if (!err) { + this->setUnsavedChanges(false); + } else { + oxErrorf("Could not save file {}: {}", m_itemPath, toStr(err)); + } } void TileSheetEditorImGui::drawTileSheet(const geo::Vec2 &fbSize) noexcept { diff --git a/src/nostalgia/core/studio/tilesheeteditor.hpp b/src/nostalgia/core/studio/tilesheeteditor.hpp index 9ca85b28..a2b8e304 100644 --- a/src/nostalgia/core/studio/tilesheeteditor.hpp +++ b/src/nostalgia/core/studio/tilesheeteditor.hpp @@ -76,6 +76,16 @@ class TileSheetEditor { [[nodiscard]] constexpr const Palette &pal() const noexcept; + [[nodiscard]] + constexpr auto *model() noexcept { + return &m_model; + } + + [[nodiscard]] + constexpr auto *model() const noexcept { + return &m_model; + } + constexpr auto setPalIdx(auto palIdx) noexcept { m_palIdx = palIdx; } diff --git a/src/nostalgia/core/studio/tilesheeteditormodel.cpp b/src/nostalgia/core/studio/tilesheeteditormodel.cpp index 20fe3c6f..782b126b 100644 --- a/src/nostalgia/core/studio/tilesheeteditormodel.cpp +++ b/src/nostalgia/core/studio/tilesheeteditormodel.cpp @@ -2,6 +2,8 @@ * Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved. */ +#include + #include #include "tilesheeteditormodel.hpp" @@ -9,6 +11,8 @@ namespace nostalgia::core { TileSheetEditorModel::TileSheetEditorModel(Context *ctx, const ox::String &path) { + m_ctx = ctx; + m_path = path; oxRequireT(img, readObj(ctx, path.c_str())); m_img = *img; oxThrowError(readObj(ctx, m_img.defaultPalette).moveTo(&m_pal)); @@ -46,6 +50,12 @@ void TileSheetEditorModel::ackUpdate() noexcept { m_updated = false; } +ox::Error TileSheetEditorModel::saveFile() noexcept { + oxRequire(buff, ox::writeClaw(&m_img)); + oxReturnError(m_ctx->rom->write(m_path.c_str(), buff.data(), buff.size())); + return m_ctx->assetManager.setAsset(m_path, m_img).error; +} + void TileSheetEditorModel::getFillPixels(bool *pixels, const geo::Point &pt, int oldColor) const noexcept { const auto tileIdx = [this](const geo::Point &pt) noexcept { return ptToIdx(pt, img().columns()) / PixelsPerTile; diff --git a/src/nostalgia/core/studio/tilesheeteditormodel.hpp b/src/nostalgia/core/studio/tilesheeteditormodel.hpp index 36970ff7..5145f1ee 100644 --- a/src/nostalgia/core/studio/tilesheeteditormodel.hpp +++ b/src/nostalgia/core/studio/tilesheeteditormodel.hpp @@ -119,6 +119,8 @@ class TileSheetEditorModel { studio::UndoStack m_undoStack; DrawCommand *m_ongoingDrawCommand = nullptr; bool m_updated = false; + Context *m_ctx = nullptr; + ox::String m_path; public: TileSheetEditorModel(Context *ctx, const ox::String &path); @@ -149,6 +151,8 @@ class TileSheetEditorModel { void ackUpdate() noexcept; + ox::Error saveFile() noexcept; + constexpr studio::UndoStack *undoStack() noexcept { return &m_undoStack; } diff --git a/src/nostalgia/core/typeconv.cpp b/src/nostalgia/core/typeconv.cpp index 61810575..37d5eb0c 100644 --- a/src/nostalgia/core/typeconv.cpp +++ b/src/nostalgia/core/typeconv.cpp @@ -2,8 +2,6 @@ * Copyright 2016 - 2022 Gary Talent (gary@drinkingtea.net). All rights reserved. */ -#include - #include #include "typeconv.hpp" @@ -40,6 +38,7 @@ struct TileSheetToCompactTileSheetConverter: public Converter, 3> converters; converters.emplace_back(new NostalgiaGraphicToTileSheetConverter()); @@ -59,10 +58,12 @@ static auto findConverter(const ox::String &srcTypeName, int srcTypeVersion, con ox::Result convert(const ox::Buffer &srcBuffer, const ox::String &dstTypeName, int dstTypeVersion, ox::ClawFormat fmt) noexcept { oxRequire(hdr, ox::readClawHeader(srcBuffer)); + // look for direct converter auto [c, err] = findConverter(hdr.typeName, hdr.typeVersion, dstTypeName, dstTypeVersion); - if (!err) { // try to chain multiple converters + if (!err) { return c->convertBuffToBuff(srcBuffer); } + // try to chain multiple converters for (const auto &subConverter : converters) { if (!subConverter->dstMatches(dstTypeName, dstTypeVersion)) { continue; diff --git a/src/nostalgia/studio/CMakeLists.txt b/src/nostalgia/studio/CMakeLists.txt index 598d1391..7992a5b4 100644 --- a/src/nostalgia/studio/CMakeLists.txt +++ b/src/nostalgia/studio/CMakeLists.txt @@ -12,11 +12,8 @@ add_executable( target_link_libraries( nostalgia-studio OxClArgs - OxFS NostalgiaCore-Studio - NostalgiaCore NostalgiaStudio - NostalgiaPack ) if (CMAKE_BUILD_TYPE STREQUAL "Release") diff --git a/src/nostalgia/studio/lib/CMakeLists.txt b/src/nostalgia/studio/lib/CMakeLists.txt index 22ebecad..d45b16df 100644 --- a/src/nostalgia/studio/lib/CMakeLists.txt +++ b/src/nostalgia/studio/lib/CMakeLists.txt @@ -43,8 +43,6 @@ target_link_libraries( imgui::imgui ${GTK3_LIBRARIES} OxEvent - OxFS - OxClaw NostalgiaCore ) diff --git a/src/nostalgia/studio/lib/undostack.hpp b/src/nostalgia/studio/lib/undostack.hpp index be60f009..c08ae316 100644 --- a/src/nostalgia/studio/lib/undostack.hpp +++ b/src/nostalgia/studio/lib/undostack.hpp @@ -28,6 +28,16 @@ class UndoStack { void redo() noexcept; void undo() noexcept; + + [[nodiscard]] + constexpr bool canRedo() noexcept { + return m_stackIdx < m_stack.size(); + } + + [[nodiscard]] + constexpr bool canUndo() noexcept { + return m_stackIdx; + } }; } \ No newline at end of file diff --git a/src/nostalgia/studio/studioapp.cpp b/src/nostalgia/studio/studioapp.cpp index 7a46614f..de990861 100644 --- a/src/nostalgia/studio/studioapp.cpp +++ b/src/nostalgia/studio/studioapp.cpp @@ -39,14 +39,14 @@ StudioUI::StudioUI(core::Context *ctx) noexcept { if (!err) { oxIgnoreError(openProject(config.projectPath)); for (const auto &f : config.openFiles) { - auto err = openFile(f); - if (err) { - oxErrorf("Could not open editor: {}\n", err.msg); + auto openFileErr = openFile(f); + if (openFileErr) { + oxErrorf("Could not open editor: {}\n", toStr(openFileErr)); } } } else { - if (err.msg) { - oxErrf("Could not open studio config file: {}\n", err.msg); + if (toStr(err)) { + oxErrf("Could not open studio config file: {}\n", toStr(err)); } else { oxErrf("Could not open studio config file: {} ({}:{})\n", err.errCode, err.file, err.line); } @@ -83,7 +83,8 @@ void StudioUI::drawMenu() noexcept { if (ImGui::MenuItem("Open Project...", "Ctrl+O")) { m_taskRunner.add(new FileDialogManager(this, &StudioUI::openProject)); } - if (ImGui::MenuItem("Save", "Ctrl+S", false, m_saveEnabled)) { + if (ImGui::MenuItem("Save", "Ctrl+S", false, m_acitveEditor && m_acitveEditor->unsavedChanges())) { + m_acitveEditor->save(); } if (ImGui::MenuItem("Quit", "Ctrl+Q")) { oxIgnoreError(core::shutdown(m_ctx)); @@ -92,14 +93,14 @@ void StudioUI::drawMenu() noexcept { } if (ImGui::BeginMenu("Edit")) { auto undoStack = m_acitveEditor ? m_acitveEditor->undoStack() : nullptr; - if (ImGui::MenuItem("Undo", "Ctrl+Z", false, undoStack)) { + if (ImGui::MenuItem("Undo", "Ctrl+Z", false, undoStack && undoStack->canUndo())) { m_acitveEditor->undoStack()->undo(); } - if (ImGui::MenuItem("Redo", "Ctrl+Y", false, undoStack)) { + if (ImGui::MenuItem("Redo", "Ctrl+Y", false, undoStack && undoStack->canRedo())) { m_acitveEditor->undoStack()->redo(); } ImGui::Separator(); - if (ImGui::MenuItem("Copy", "Ctrl+N")) { + if (ImGui::MenuItem("Copy", "Ctrl+C")) { } if (ImGui::MenuItem("Cut", "Ctrl+X")) { } @@ -139,7 +140,11 @@ void StudioUI::drawToolbar() noexcept { m_taskRunner.add(new FileDialogManager(this, &StudioUI::openProject)); } ImGui::SameLine(); - ImGui::Button("Save##MainToolbar##MainWindow", ImVec2(BtnWidth, BtnHeight)); + if (ImGui::Button("Save##MainToolbar##MainWindow", ImVec2(BtnWidth, BtnHeight))) { + if (m_acitveEditor) { + m_acitveEditor->save(); + } + } } ImGui::End(); } diff --git a/src/nostalgia/tools/CMakeLists.txt b/src/nostalgia/tools/CMakeLists.txt index 93a5895c..ef59e15f 100644 --- a/src/nostalgia/tools/CMakeLists.txt +++ b/src/nostalgia/tools/CMakeLists.txt @@ -6,6 +6,11 @@ target_link_libraries( NostalgiaPack ) +if (CMAKE_BUILD_TYPE STREQUAL "Release") + # enable LTO + set_property(TARGET nost-pack PROPERTY INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + install( TARGETS nost-pack diff --git a/src/nostalgia/tools/pack/CMakeLists.txt b/src/nostalgia/tools/pack/CMakeLists.txt index 82211382..8468788e 100644 --- a/src/nostalgia/tools/pack/CMakeLists.txt +++ b/src/nostalgia/tools/pack/CMakeLists.txt @@ -6,10 +6,7 @@ add_library( target_link_libraries( NostalgiaPack PUBLIC - OxClaw - OxFS NostalgiaCore-Headless - NostalgiaGeo ) install(