Merge commit '47eee1d56d591e3631d16e95a78ea3629ee312ee'
All checks were successful
Build / build (push) Successful in 1m28s

This commit is contained in:
Gary Talent 2025-05-30 23:38:53 -05:00
commit b6f1bdbbcd
25 changed files with 76 additions and 64 deletions

View File

@ -3,6 +3,11 @@
* Add ability to remember recent projects in config
* PaletteEditor: Add RGB key shortcuts for focusing color channels
# d2025.05.2
* TileSheetEditor: Fix manual redo of draw actions, fix drawing to pixel 0, 0 as first action (cce5f52f96511694afd98f0b9b6b1f19c06ecd20)
* TileSheetEditor: Fix draw command to work on same pixel after switching subsheets (514cb978351ee4b0a5335c22a506a6d9f608f0a7)
# d2025.05.1
* TileSheetEditor: Fix overrun errors when switching subsheets, clear selection

View File

@ -126,7 +126,7 @@ void TileSheetEditorModel::paste() {
auto const pt1 = m_selection->a;
auto const pt2 = ox::Point{s.columns * TileWidth, s.rows * TileHeight};
if (auto const cmd = ox::makeCatch<CutPasteCommand>(
CommandId::Paste, m_img, m_activeSubsSheetIdx, pt1, pt2, *cb); cmd.ok()) {
CommandId::Paste, m_img, m_activeSubsSheetIdx, pt1, pt2, *cb); cmd.value) {
std::ignore = pushCommand(cmd.value);
}
}
@ -198,6 +198,7 @@ void TileSheetEditorModel::endDrawCommand() noexcept {
if (m_ongoingDrawCommand) {
m_ongoingDrawCommand->finish();
m_ongoingDrawCommand = nullptr;
m_lastDrawUpdatePt = {-1, -1};
}
}
@ -230,9 +231,10 @@ void TileSheetEditorModel::setActiveSubsheet(TileSheet::SubSheetIdx const&idx) n
m_activeSubsSheetIdx = idx;
this->activeSubsheetChanged.emit(m_activeSubsSheetIdx);
clearSelection();
m_lastDrawUpdatePt = {-1, -1};
}
void TileSheetEditorModel::fill(ox::Point const&pt, int const palIdx) noexcept {
void TileSheetEditorModel::fill(ox::Point const &pt, uint8_t const palIdx) noexcept {
auto const&activeSubSheet = getSubSheet(m_img, m_activeSubsSheetIdx);
// build idx list
if (pt.x >= activeSubSheet.columns * TileWidth || pt.y >= activeSubSheet.rows * TileHeight) {
@ -393,9 +395,9 @@ ox::Error TileSheetEditorModel::moveSubSheet(TileSheet::SubSheetIdx src, TileShe
void TileSheetEditorModel::getFillPixels(
TileSheet::SubSheet const&activeSubSheet,
ox::Span<bool> pixels,
ox::Span<bool> const pixels,
ox::Point const &pt,
int const oldColor) const noexcept {
uint8_t const oldColor) noexcept {
auto const idx = ptToIdx(pt, activeSubSheet.columns);
auto const relIdx = idx % PixelsPerTile;
if (pixels[relIdx] || activeSubSheet.pixels[idx] != oldColor) {

View File

@ -14,7 +14,7 @@
namespace nostalgia::gfx {
class TileSheetEditorModel: public ox::SignalHandler {
class TileSheetEditorModel final: public ox::SignalHandler {
public:
ox::Signal<ox::Error(const TileSheet::SubSheetIdx&)> activeSubsheetChanged;
@ -35,7 +35,7 @@ class TileSheetEditorModel: public ox::SignalHandler {
studio::SelectionTracker m_selTracker;
ox::Optional<studio::Selection> m_selection;
ox::Point m_lineStartPt;
ox::Point m_lastDrawUpdatePt;
ox::Point m_lastDrawUpdatePt{-1, -1};
bool m_updated = false;
public:
@ -104,7 +104,7 @@ class TileSheetEditorModel: public ox::SignalHandler {
return m_activeSubsSheetIdx;
}
void fill(ox::Point const&pt, int palIdx) noexcept;
void fill(ox::Point const &pt, uint8_t palIdx) noexcept;
ox::Error rotateLeft() noexcept;
@ -144,11 +144,11 @@ class TileSheetEditorModel: public ox::SignalHandler {
ox::Error moveSubSheet(TileSheet::SubSheetIdx src, TileSheet::SubSheetIdx dst) noexcept;
private:
void getFillPixels(
static void getFillPixels(
TileSheet::SubSheet const &activeSubSheet,
ox::Span<bool> pixels,
ox::Point const &pt,
int oldColor) const noexcept;
uint8_t oldColor) noexcept;
void setPalPath() noexcept;

View File

@ -89,7 +89,7 @@ void TileSheetEditorView::clickSelect(ox::Vec2 const&paneSize, ox::Vec2 const&cl
void TileSheetEditorView::clickFill(ox::Vec2 const&paneSize, ox::Vec2 const&clickPos) noexcept {
auto const pt = clickPoint(paneSize, clickPos);
m_model.fill(pt, static_cast<int>(m_palIdx));
m_model.fill(pt, static_cast<uint8_t>(m_palIdx));
}
void TileSheetEditorView::releaseMouseButton(TileSheetTool tool) noexcept {

View File

@ -60,6 +60,11 @@ ox::Result<ox::CStringView> uuidToPath(Context &ctx, ox::StringViewCR uuid) noex
ox::Result<ox::CStringView> uuidToPath(Context &ctx, ox::UUID const&uuid) noexcept;
[[nodiscard]]
constexpr bool isUuidUrl(ox::StringViewCR path) noexcept {
return ox::beginsWith(path, "uuid://");
}
#ifndef OX_BARE_METAL
namespace detail {

View File

@ -10,6 +10,6 @@
namespace studio {
void registerModule(studio::Module const*) noexcept;
void registerModule(Module const*) noexcept;
}

View File

@ -1,17 +1,17 @@
add_library(
StudioAppLib
aboutpopup.cpp
app.cpp
clawviewer.cpp
deleteconfirmation.cpp
filedialogmanager.cpp
font.cpp
makecopypopup.cpp
newdir.cpp
newmenu.cpp
newproject.cpp
popups/about.cpp
popups/deleteconfirmation.cpp
popups/makecopy.cpp
popups/newdir.cpp
popups/newmenu.cpp
popups/newproject.cpp
popups/renamefile.cpp
projectexplorer.cpp
renamefile.cpp
studioui.cpp
)
target_compile_definitions(

View File

@ -5,7 +5,7 @@
#include <imgui.h>
#include <studio/imguiutil.hpp>
#include "aboutpopup.hpp"
#include "about.hpp"
namespace olympic {
extern ox::String appVersion;

View File

@ -4,7 +4,7 @@
#include <studio/imguiutil.hpp>
#include "makecopypopup.hpp"
#include "makecopy.hpp"
namespace studio {

View File

@ -7,7 +7,7 @@
#include <studio/imguiutil.hpp>
#include <utility>
#include "filedialogmanager.hpp"
#include "../filedialogmanager.hpp"
#include "newproject.hpp"
namespace studio {

View File

@ -14,14 +14,14 @@
#include <studio/project.hpp>
#include <studio/task.hpp>
#include "aboutpopup.hpp"
#include "deleteconfirmation.hpp"
#include "makecopypopup.hpp"
#include "newdir.hpp"
#include "newmenu.hpp"
#include "newproject.hpp"
#include "popups/about.hpp"
#include "popups/deleteconfirmation.hpp"
#include "popups/makecopy.hpp"
#include "popups/newdir.hpp"
#include "popups/newmenu.hpp"
#include "popups/newproject.hpp"
#include "projectexplorer.hpp"
#include "renamefile.hpp"
#include "popups/renamefile.hpp"
namespace studio {

View File

@ -120,7 +120,7 @@ void editConfig(keel::Context &kctx, Func f) noexcept {
*/
template<typename T>
ox::Error headerizeConfigFile(keel::Context &kctx, ox::StringViewCR name = ox::ModelTypeName_v<T>) noexcept {
auto const path = ox::sfmt("/{}.json", name);
auto const path = ox::sfmt("/{}.json", detail::slashesToPct(name));
ox::PassThroughFS fs(configPath(kctx));
OX_REQUIRE_M(buff, fs.read(path));
OX_REQUIRE_M(cv1, ox::readOC<T>(buff));