Squashed 'deps/nostalgia/' changes from 0de428a2..00e52b64

00e52b64 [nostalgia] Make pkg-dmg more versatile
ae404879 [nostalgia/gfx] Add navigateTo handler to TileSheetEditor
84b612c6 [studio/modlib] Give navigateTo a default argument
3c2a6b04 [studio/applib] Make navigateTo handle UUID paths
626da322 [ox/std] Add StringParam(IString const&) constructor

git-subtree-dir: deps/nostalgia
git-subtree-split: 00e52b649141b3daffd9a10b0320b142499c536f
This commit is contained in:
Gary Talent 2025-05-15 22:27:30 -05:00
parent 71b1e79d61
commit e2ca6389a9
9 changed files with 57 additions and 6 deletions

View File

@ -19,7 +19,7 @@ pkg-gba: build
.PHONY: pkg-mac .PHONY: pkg-mac
pkg-mac: install pkg-mac: install
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-dmg.py ${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-dmg.py NostalgiaStudio
.PHONY: generate-studio-rsrc .PHONY: generate-studio-rsrc
generate-studio-rsrc: generate-studio-rsrc:

View File

@ -20,6 +20,8 @@ class StringParam {
constexpr StringParam(StringParam &&o) noexcept: m_value{std::move(o.m_value)} {} constexpr StringParam(StringParam &&o) noexcept: m_value{std::move(o.m_value)} {}
constexpr StringParam(char const*value) noexcept: m_value{value} {} constexpr StringParam(char const*value) noexcept: m_value{value} {}
constexpr StringParam(detail::BaseStringView const&value) noexcept: m_value{value} {} constexpr StringParam(detail::BaseStringView const&value) noexcept: m_value{value} {}
template<size_t sz>
constexpr StringParam(ox::IString<sz> const&value) noexcept: m_value{value} {}
constexpr StringParam(ox::String const&value) noexcept: m_value{value} {} constexpr StringParam(ox::String const&value) noexcept: m_value{value} {}
constexpr StringParam(ox::String &&value) noexcept: m_value{std::move(value)} {} constexpr StringParam(ox::String &&value) noexcept: m_value{std::move(value)} {}
constexpr operator ox::String() && noexcept { return std::move(m_value); } constexpr operator ox::String() && noexcept { return std::move(m_value); }

View File

@ -426,6 +426,8 @@ ox::Error resizeSubsheet(TileSheet::SubSheet &ss, ox::Size const&sz) noexcept;
[[nodiscard]] [[nodiscard]]
TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubSheetIdx idx) noexcept; TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubSheetIdx idx) noexcept;
ox::Result<TileSheet::SubSheetIdx> getSubSheetIdx(TileSheet const &ts, SubSheetId pId) noexcept;
[[nodiscard]] [[nodiscard]]
TileSheet::SubSheet &getSubSheet( TileSheet::SubSheet &getSubSheet(
ox::SpanView<uint32_t> const&idx, ox::SpanView<uint32_t> const&idx,

View File

@ -388,6 +388,17 @@ ox::Error TileSheetEditorImGui::saveItem() noexcept {
return m_model.saveFile(); return m_model.saveFile();
} }
void TileSheetEditorImGui::navigateTo(ox::StringViewCR arg) noexcept {
auto const subSheetId = strToInt(arg);
if (subSheetId.error) {
return;
}
if (auto const [val, err] = getSubSheetIdx(m_model.img(), subSheetId.value);
!err) {
setActiveSubsheet(val);
}
}
void TileSheetEditorImGui::showSubsheetEditor() noexcept { void TileSheetEditorImGui::showSubsheetEditor() noexcept {
auto const&sheet = m_model.activeSubSheet(); auto const&sheet = m_model.activeSubSheet();
if (!sheet.subsheets.empty()) { if (!sheet.subsheets.empty()) {
@ -451,7 +462,7 @@ void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept {
if (wheelh != 0) { if (wheelh != 0) {
m_view.scrollH(fbSize, wheelh); m_view.scrollH(fbSize, wheelh);
} }
if (ImGui::IsMouseDown(0) && m_prevMouseDownPos != mousePos) { if (ImGui::IsMouseClicked(0) && m_prevMouseDownPos != mousePos) {
m_prevMouseDownPos = mousePos; m_prevMouseDownPos = mousePos;
switch (m_tool) { switch (m_tool) {
case TileSheetTool::Draw: case TileSheetTool::Draw:

View File

@ -87,6 +87,8 @@ class TileSheetEditorImGui: public studio::Editor {
protected: protected:
ox::Error saveItem() noexcept override; ox::Error saveItem() noexcept override;
void navigateTo(ox::StringViewCR arg) noexcept override;
private: private:
void showSubsheetEditor() noexcept; void showSubsheetEditor() noexcept;

View File

@ -2,6 +2,8 @@
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved. * Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/ */
#include "nostalgia/gfx/tilesheet.hpp"
#include <ox/std/size.hpp> #include <ox/std/size.hpp>
#include <ox/std/vector.hpp> #include <ox/std/vector.hpp>
@ -187,6 +189,28 @@ TileSheet::SubSheetIdx validateSubSheetIdx(TileSheet const&ts, TileSheet::SubShe
return validateSubSheetIdx(std::move(idx), 0, ts.subsheet); return validateSubSheetIdx(std::move(idx), 0, ts.subsheet);
} }
static ox::Error getSubSheetIdx(TileSheet::SubSheet const &ss, SubSheetId const pId, TileSheet::SubSheetIdx &idx) noexcept {
if (ss.id == pId) {
return {};
}
for (uint32_t i{}; auto const &sub : ss.subsheets) {
idx.emplace_back(i);
auto const err = getSubSheetIdx(sub, pId, idx);
if (!err) {
return {};
}
idx.pop_back();
++i;
}
return ox::Error{1, "SubSheet not found"};
}
ox::Result<TileSheet::SubSheetIdx> getSubSheetIdx(TileSheet const &ts, SubSheetId const pId) noexcept {
ox::Result<TileSheet::SubSheetIdx> out;
OX_RETURN_ERROR(getSubSheetIdx(ts.subsheet, pId, out.value));
return out;
}
#if defined(__GNUC__) && __GNUC__ >= 13 #if defined(__GNUC__) && __GNUC__ >= 13
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdangling-reference" #pragma GCC diagnostic ignored "-Wdangling-reference"

View File

@ -31,7 +31,15 @@ static bool shutdownHandler(turbine::Context &ctx) {
} }
void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept { void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept {
ctx.ui.navigateTo(std::move(filePath), std::move(navArgs)); ox::String path = std::move(filePath);
if (beginsWith(path, "uuid://")) {
auto [p, err] = keel::uuidUrlToPath(keelCtx(ctx), path);
if (err) {
return;
}
path = p;
}
ctx.ui.navigateTo(std::move(path), std::move(navArgs));
} }
namespace ig { namespace ig {

View File

@ -27,6 +27,6 @@ inline keel::Context &keelCtx(Context &ctx) noexcept {
return keelCtx(ctx.tctx); return keelCtx(ctx.tctx);
} }
void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept; void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs = "") noexcept;
} }

View File

@ -5,6 +5,8 @@ import shutil
import subprocess import subprocess
import sys import sys
target_name = sys.argv[1]
def rm(path: str): def rm(path: str):
file_exists = os.path.exists(path) file_exists = os.path.exists(path)
is_link = os.path.islink(path) is_link = os.path.islink(path)
@ -26,12 +28,12 @@ def run(args: list[str]):
dmg_dir = 'dist/darwin-arm64-release/NostalgiaStudio' dmg_dir = f'dist/darwin-arm64-release/{target_name}'
dmg = f'{dmg_dir}.dmg' dmg = f'{dmg_dir}.dmg'
rm(dmg) rm(dmg)
rm(dmg_dir) rm(dmg_dir)
mkdir_p(dmg_dir) mkdir_p(dmg_dir)
shutil.copytree('dist/darwin-arm64-release/NostalgiaStudio.app', f'{dmg_dir}/NostalgiaStudio.app') shutil.copytree(f'dist/darwin-arm64-release/{target_name}.app', f'{dmg_dir}/{target_name}.app')
os.symlink('/Applications', f'{dmg_dir}/Applications') os.symlink('/Applications', f'{dmg_dir}/Applications')
run(['hdiutil', 'create', '-srcfolder', dmg_dir, dmg]) run(['hdiutil', 'create', '-srcfolder', dmg_dir, dmg])
rm(dmg_dir) rm(dmg_dir)