Compare commits
3 Commits
6f380d817c
...
7ed540a583
Author | SHA1 | Date | |
---|---|---|---|
7ed540a583 | |||
50dbf02ad9 | |||
08236fc790 |
2
deps/nostalgia/deps/ox/src/ox/claw/write.hpp
vendored
2
deps/nostalgia/deps/ox/src/ox/claw/write.hpp
vendored
@ -39,7 +39,7 @@ struct TypeInfoCatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constexpr Error field(...) noexcept {
|
constexpr Error field(...) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto opType() {
|
static constexpr auto opType() {
|
||||||
|
@ -218,7 +218,7 @@ Error Signal<Args...>::emitCheckError(Args... args) const noexcept {
|
|||||||
for (auto &f : m_slots) {
|
for (auto &f : m_slots) {
|
||||||
f->call(args...);
|
f->call(args...);
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} catch (const ox::Exception &ex) {
|
} catch (const ox::Exception &ex) {
|
||||||
return ox::Error(ex.errCode, ex.msg, ex.src);
|
return ox::Error(ex.errCode, ex.msg, ex.src);
|
||||||
}
|
}
|
||||||
@ -410,7 +410,7 @@ Error Signal<Error(Args...)>::emitCheckError(Args... args) const noexcept {
|
|||||||
for (auto &f : m_slots) {
|
for (auto &f : m_slots) {
|
||||||
OX_RETURN_ERROR(f->call(ox::forward<Args>(args)...));
|
OX_RETURN_ERROR(f->call(ox::forward<Args>(args)...));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -230,7 +230,7 @@ template<typename size_t>
|
|||||||
Error FileStoreTemplate<size_t>::incLinks(uint64_t id) {
|
Error FileStoreTemplate<size_t>::incLinks(uint64_t id) {
|
||||||
OX_REQUIRE_M(item, find(static_cast<size_t>(id)).validate());
|
OX_REQUIRE_M(item, find(static_cast<size_t>(id)).validate());
|
||||||
++item->links;
|
++item->links;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
@ -240,7 +240,7 @@ Error FileStoreTemplate<size_t>::decLinks(uint64_t id) {
|
|||||||
if (item->links == 0) {
|
if (item->links == 0) {
|
||||||
OX_RETURN_ERROR(remove(item));
|
OX_RETURN_ERROR(remove(item));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
@ -298,7 +298,7 @@ Error FileStoreTemplate<size_t>::write(uint64_t id64, const void *data, FsSize_t
|
|||||||
dest->id.get(), dest.offset(), destData.size());
|
dest->id.get(), dest.offset(), destData.size());
|
||||||
fsData->rootNode = dest.offset();
|
fsData->rootNode = dest.offset();
|
||||||
oxTracef("ox.fs.FileStoreTemplate.write", "Root inode: {}", dest->id.get());
|
oxTracef("ox.fs.FileStoreTemplate.write", "Root inode: {}", dest->id.get());
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
oxTrace("ox.fs.FileStoreTemplate.write.fail", "Could not place item due to absence of FileStore header.");
|
oxTrace("ox.fs.FileStoreTemplate.write.fail", "Could not place item due to absence of FileStore header.");
|
||||||
@ -427,7 +427,7 @@ Error FileStoreTemplate<size_t>::resize() {
|
|||||||
oxTracef("ox.fs.FileStoreTemplate.resize", "resize to: {}", newSize);
|
oxTracef("ox.fs.FileStoreTemplate.resize", "resize to: {}", newSize);
|
||||||
OX_RETURN_ERROR(m_buffer->setSize(newSize));
|
OX_RETURN_ERROR(m_buffer->setSize(newSize));
|
||||||
oxTracef("ox.fs.FileStoreTemplate.resize", "resized to: {}", m_buffer->size());
|
oxTracef("ox.fs.FileStoreTemplate.resize", "resized to: {}", m_buffer->size());
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
@ -479,7 +479,7 @@ Error FileStoreTemplate<size_t>::walk(Error(*cb)(uint8_t, uint64_t, uint64_t)) {
|
|||||||
for (auto i = m_buffer->iterator(); i.valid(); i.next()) {
|
for (auto i = m_buffer->iterator(); i.valid(); i.next()) {
|
||||||
OX_RETURN_ERROR(cb(i->fileType, i.ptr().offset(), i.ptr().end()));
|
OX_RETURN_ERROR(cb(i->fileType, i.ptr().offset(), i.ptr().end()));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
@ -503,7 +503,7 @@ Error FileStoreTemplate<size_t>::compact() {
|
|||||||
return m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) -> Error {
|
return m_buffer->compact([this, &isFirstItem](uint64_t oldAddr, ItemPtr item) -> Error {
|
||||||
if (isFirstItem) {
|
if (isFirstItem) {
|
||||||
isFirstItem = false;
|
isFirstItem = false;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
if (!item.valid()) {
|
if (!item.valid()) {
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
@ -524,7 +524,7 @@ Error FileStoreTemplate<size_t>::compact() {
|
|||||||
parent->right = item;
|
parent->right = item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,7 +552,7 @@ Error FileStoreTemplate<size_t>::placeItem(ItemPtr item) {
|
|||||||
item->left = root->left;
|
item->left = root->left;
|
||||||
item->right = root->right;
|
item->right = root->right;
|
||||||
oxTracef("ox.fs.FileStoreTemplate.placeItem", "Overwrote Root Item: {}", item->id.get());
|
oxTracef("ox.fs.FileStoreTemplate.placeItem", "Overwrote Root Item: {}", item->id.get());
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
return placeItem(root, item);
|
return placeItem(root, item);
|
||||||
}
|
}
|
||||||
@ -573,7 +573,7 @@ Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item, int depth
|
|||||||
item->right = right->right;
|
item->right = right->right;
|
||||||
}
|
}
|
||||||
oxTracef("ox.fs.FileStoreTemplate.placeItem", "Placed Item: {}", item->id.get());
|
oxTracef("ox.fs.FileStoreTemplate.placeItem", "Placed Item: {}", item->id.get());
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
return placeItem(right, item, depth + 1);
|
return placeItem(right, item, depth + 1);
|
||||||
}
|
}
|
||||||
@ -586,7 +586,7 @@ Error FileStoreTemplate<size_t>::placeItem(ItemPtr root, ItemPtr item, int depth
|
|||||||
item->right = left->right;
|
item->right = left->right;
|
||||||
}
|
}
|
||||||
oxTracef("ox.fs.FileStoreTemplate.placeItem", "Placed Item: {}", item->id.get());
|
oxTracef("ox.fs.FileStoreTemplate.placeItem", "Placed Item: {}", item->id.get());
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
return placeItem(left, item, depth + 1);
|
return placeItem(left, item, depth + 1);
|
||||||
}
|
}
|
||||||
@ -624,7 +624,7 @@ Error FileStoreTemplate<size_t>::unplaceItem(ItemPtr item) {
|
|||||||
} else {
|
} else {
|
||||||
fsData->rootNode = 0;
|
fsData->rootNode = 0;
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
return unplaceItem(root, item);
|
return unplaceItem(root, item);
|
||||||
}
|
}
|
||||||
@ -661,7 +661,7 @@ Error FileStoreTemplate<size_t>::unplaceItem(ItemPtr root, ItemPtr item, int dep
|
|||||||
if (item->left) {
|
if (item->left) {
|
||||||
OX_RETURN_ERROR(placeItem(m_buffer->ptr(item->left)));
|
OX_RETURN_ERROR(placeItem(m_buffer->ptr(item->left)));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t>
|
template<typename size_t>
|
||||||
@ -669,7 +669,7 @@ Error FileStoreTemplate<size_t>::remove(ItemPtr item) {
|
|||||||
if (item.valid()) {
|
if (item.valid()) {
|
||||||
OX_RETURN_ERROR(unplaceItem(item));
|
OX_RETURN_ERROR(unplaceItem(item));
|
||||||
OX_RETURN_ERROR(m_buffer->free(item));
|
OX_RETURN_ERROR(m_buffer->free(item));
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
|
@ -329,7 +329,7 @@ Error FileSystemTemplate<FileStore, Directory>::format(void *buff, uint64_t buff
|
|||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
@ -346,7 +346,7 @@ Error FileSystemTemplate<FileStore, Directory>::move(StringViewCR src, StringVie
|
|||||||
OX_REQUIRE_M(inode, rootDir.find(src));
|
OX_REQUIRE_M(inode, rootDir.find(src));
|
||||||
OX_RETURN_ERROR(rootDir.write(dest, inode));
|
OX_RETURN_ERROR(rootDir.write(dest, inode));
|
||||||
OX_RETURN_ERROR(rootDir.remove(src));
|
OX_RETURN_ERROR(rootDir.remove(src));
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
@ -407,7 +407,7 @@ Error FileSystemTemplate<FileStore, Directory>::removePath(StringViewCR path, bo
|
|||||||
oxTrace("FileSystemTemplate.remove.fail", "Tried to remove directory without recursive setting.");
|
oxTrace("FileSystemTemplate.remove.fail", "Tried to remove directory without recursive setting.");
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename Directory>
|
template<typename FileStore, typename Directory>
|
||||||
@ -424,7 +424,7 @@ Result<Vector<String>> FileSystemTemplate<FileStore, Directory>::ls(StringViewCR
|
|||||||
Vector<String> out;
|
Vector<String> out;
|
||||||
OX_RETURN_ERROR(ls(path, [&out](StringViewCR name, typename FileStore::InodeId_t) {
|
OX_RETURN_ERROR(ls(path, [&out](StringViewCR name, typename FileStore::InodeId_t) {
|
||||||
out.emplace_back(name);
|
out.emplace_back(name);
|
||||||
return ox::Error(0);
|
return ox::Error{};
|
||||||
}));
|
}));
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ Error PassThroughFS::move(StringViewCR src, StringViewCR dest) noexcept {
|
|||||||
if (ec.value()) {
|
if (ec.value()) {
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<Vector<String>> PassThroughFS::ls(StringViewCR dir) const noexcept {
|
Result<Vector<String>> PassThroughFS::ls(StringViewCR dir) const noexcept {
|
||||||
@ -148,7 +148,7 @@ Error PassThroughFS::readFilePath(StringViewCR path, void *buffer, std::size_t b
|
|||||||
oxTracef("ox.fs.PassThroughFS.read.error", "Read of {} failed: {}", path, f.what());
|
oxTracef("ox.fs.PassThroughFS.read.error", "Read of {} failed: {}", path, f.what());
|
||||||
return ox::Error(2);
|
return ox::Error(2);
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error PassThroughFS::readFileInode(uint64_t, void*, std::size_t) noexcept {
|
Error PassThroughFS::readFileInode(uint64_t, void*, std::size_t) noexcept {
|
||||||
@ -197,7 +197,7 @@ Error PassThroughFS::writeFilePath(StringViewCR path, const void *buffer, uint64
|
|||||||
oxTracef("ox.fs.PassThroughFS.read.error", "Write of {} failed: {}", path, f.what());
|
oxTracef("ox.fs.PassThroughFS.read.error", "Write of {} failed: {}", path, f.what());
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error PassThroughFS::writeFileInode(uint64_t, const void*, uint64_t, FileType) noexcept {
|
Error PassThroughFS::writeFileInode(uint64_t, const void*, uint64_t, FileType) noexcept {
|
||||||
|
@ -99,7 +99,7 @@ Error PassThroughFS::ls(StringViewCR dir, F cb) const noexcept {
|
|||||||
for (auto &p : di) {
|
for (auto &p : di) {
|
||||||
OX_RETURN_ERROR(cb(p.path().filename().c_str(), 0));
|
OX_RETURN_ERROR(cb(p.path().filename().c_str(), 0));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ Error PathIterator::dirPath(char *out, std::size_t outSize) {
|
|||||||
if (idx >= 0 && size < outSize) {
|
if (idx >= 0 && size < outSize) {
|
||||||
ox::memcpy(out, m_path, size);
|
ox::memcpy(out, m_path, size);
|
||||||
out[size] = 0;
|
out[size] = 0;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ Error PathIterator::next(StringView &fileName) {
|
|||||||
std::size_t size = 0;
|
std::size_t size = 0;
|
||||||
auto retval = ox::Error(1);
|
auto retval = ox::Error(1);
|
||||||
if (m_iterator < m_maxSize && ox::strlen(&m_path[m_iterator])) {
|
if (m_iterator < m_maxSize && ox::strlen(&m_path[m_iterator])) {
|
||||||
retval = ox::Error(0);
|
retval = {};
|
||||||
if (m_path[m_iterator] == '/') {
|
if (m_path[m_iterator] == '/') {
|
||||||
m_iterator++;
|
m_iterator++;
|
||||||
}
|
}
|
||||||
@ -118,7 +118,7 @@ Result<std::size_t> PathIterator::nextSize() const {
|
|||||||
auto retval = ox::Error(1);
|
auto retval = ox::Error(1);
|
||||||
auto it = m_iterator;
|
auto it = m_iterator;
|
||||||
if (it < m_maxSize && ox::strlen(&m_path[it])) {
|
if (it < m_maxSize && ox::strlen(&m_path[it])) {
|
||||||
retval = ox::Error(0);
|
retval = {};
|
||||||
if (m_path[it] == '/') {
|
if (m_path[it] == '/') {
|
||||||
it++;
|
it++;
|
||||||
}
|
}
|
||||||
|
@ -354,7 +354,7 @@ Error NodeBuffer<size_t, Item>::free(ItemPtr item) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_header.bytesUsed -= item.size();
|
m_header.bytesUsed -= item.size();
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t, typename Item>
|
template<typename size_t, typename Item>
|
||||||
@ -370,7 +370,7 @@ Error NodeBuffer<size_t, Item>::setSize(std::size_t size) noexcept {
|
|||||||
m_header.size = static_cast<size_t>(size);
|
m_header.size = static_cast<size_t>(size);
|
||||||
auto data = reinterpret_cast<uint8_t*>(this) + end;
|
auto data = reinterpret_cast<uint8_t*>(this) + end;
|
||||||
ox::memset(data, 0, size - end);
|
ox::memset(data, 0, size - end);
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,7 +422,7 @@ Error NodeBuffer<size_t, Item>::compact(F cb) noexcept {
|
|||||||
src = ptr(dest->next);
|
src = ptr(dest->next);
|
||||||
dest = uninitializedPtr(dest.offset() + dest->fullSize());
|
dest = uninitializedPtr(dest.offset() + dest->fullSize());
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename size_t, typename Item>
|
template<typename size_t, typename Item>
|
||||||
|
4
deps/nostalgia/deps/ox/src/ox/fs/tool.cpp
vendored
4
deps/nostalgia/deps/ox/src/ox/fs/tool.cpp
vendored
@ -48,7 +48,7 @@ static ox::Error runLs(ox::FileSystem *fs, ox::Span<const char*> args) noexcept
|
|||||||
for (const auto &file : files) {
|
for (const auto &file : files) {
|
||||||
oxOutf("{}\n", file);
|
oxOutf("{}\n", file);
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static ox::Error runRead(ox::FileSystem *fs, ox::Span<const char*> args) noexcept {
|
static ox::Error runRead(ox::FileSystem *fs, ox::Span<const char*> args) noexcept {
|
||||||
@ -60,7 +60,7 @@ static ox::Error runRead(ox::FileSystem *fs, ox::Span<const char*> args) noexcep
|
|||||||
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
||||||
std::ignore = fwrite(buff.data(), sizeof(decltype(buff)::value_type), buff.size(), stdout);
|
std::ignore = fwrite(buff.data(), sizeof(decltype(buff)::value_type), buff.size(), stdout);
|
||||||
OX_ALLOW_UNSAFE_BUFFERS_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static ox::Error run(int argc, const char **argv) noexcept {
|
static ox::Error run(int argc, const char **argv) noexcept {
|
||||||
|
16
deps/nostalgia/deps/ox/src/ox/mc/read.hpp
vendored
16
deps/nostalgia/deps/ox/src/ox/mc/read.hpp
vendored
@ -197,7 +197,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::field(const char*, bool *val) n
|
|||||||
OX_RETURN_ERROR(result);
|
OX_RETURN_ERROR(result);
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// array handler
|
// array handler
|
||||||
@ -256,7 +256,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::field(const char*, HashMap<Stri
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
@ -330,7 +330,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::field(const char*, BasicString<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
@ -370,7 +370,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::fieldCString(const char*, char
|
|||||||
data[size] = 0;
|
data[size] = 0;
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
@ -388,7 +388,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::fieldCString(const char*, char
|
|||||||
data[size] = 0;
|
data[size] = 0;
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
@ -416,7 +416,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::fieldCString(const char*, char
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
@ -464,7 +464,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::readInteger(I *val) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
@ -487,7 +487,7 @@ constexpr Error MetalClawReaderTemplate<Reader>::field(const char*, CB cb) noexc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Reader_c Reader>
|
template<Reader_c Reader>
|
||||||
|
14
deps/nostalgia/deps/ox/src/ox/mc/write.hpp
vendored
14
deps/nostalgia/deps/ox/src/ox/mc/write.hpp
vendored
@ -122,7 +122,7 @@ class MetalClawWriter {
|
|||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
@ -184,7 +184,7 @@ constexpr Error MetalClawWriter<Writer>::field(const char*, const bool *val) noe
|
|||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), *val));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), *val));
|
||||||
}
|
}
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
@ -201,7 +201,7 @@ constexpr Error MetalClawWriter<Writer>::field(const char*, const BasicString<Sm
|
|||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
@ -229,7 +229,7 @@ constexpr Error MetalClawWriter<Writer>::fieldCString(const char*, const char *c
|
|||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
@ -255,7 +255,7 @@ constexpr Error MetalClawWriter<Writer>::fieldCString(const char*, const char *v
|
|||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
@ -319,7 +319,7 @@ OX_ALLOW_UNSAFE_BUFFERS_END
|
|||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
@ -356,7 +356,7 @@ constexpr Error MetalClawWriter<Writer>::field(const char*, const HashMap<String
|
|||||||
}
|
}
|
||||||
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
OX_RETURN_ERROR(m_fieldPresence.set(static_cast<std::size_t>(m_field), fieldSet));
|
||||||
++m_field;
|
++m_field;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<Writer_c Writer>
|
template<Writer_c Writer>
|
||||||
|
2
deps/nostalgia/deps/ox/src/ox/model/def.hpp
vendored
2
deps/nostalgia/deps/ox/src/ox/model/def.hpp
vendored
@ -13,7 +13,7 @@
|
|||||||
// oxModelFwdDecl is necessary because Apple-Clang is broken...
|
// oxModelFwdDecl is necessary because Apple-Clang is broken...
|
||||||
#define OX_MODEL_FWD_DECL(modelName) constexpr ox::Error model(auto *io, ox::CommonPtrWith<modelName> auto *o) noexcept
|
#define OX_MODEL_FWD_DECL(modelName) constexpr ox::Error model(auto *io, ox::CommonPtrWith<modelName> auto *o) noexcept
|
||||||
#define OX_MODEL_BEGIN(modelName) constexpr ox::Error model(auto *io, [[maybe_unused]] ox::CommonPtrWith<modelName> auto *o) noexcept { OX_RETURN_ERROR(io->template setTypeInfo<modelName>());
|
#define OX_MODEL_BEGIN(modelName) constexpr ox::Error model(auto *io, [[maybe_unused]] ox::CommonPtrWith<modelName> auto *o) noexcept { OX_RETURN_ERROR(io->template setTypeInfo<modelName>());
|
||||||
#define OX_MODEL_END() return ox::Error(0); }
|
#define OX_MODEL_END() return {}; }
|
||||||
#define OX_MODEL_FIELD(fieldName) OX_RETURN_ERROR(io->field(#fieldName, &o->fieldName));
|
#define OX_MODEL_FIELD(fieldName) OX_RETURN_ERROR(io->field(#fieldName, &o->fieldName));
|
||||||
#define OX_MODEL_FIELD_RENAME(objFieldName, serFieldName) OX_RETURN_ERROR(io->field(#serFieldName, &o->objFieldName));
|
#define OX_MODEL_FIELD_RENAME(objFieldName, serFieldName) OX_RETURN_ERROR(io->field(#serFieldName, &o->objFieldName));
|
||||||
#define OX_MODEL_FRIEND(modelName) friend constexpr ox::Error model(auto *io, ox::CommonPtrWith<modelName> auto *o) noexcept
|
#define OX_MODEL_FRIEND(modelName) friend constexpr ox::Error model(auto *io, ox::CommonPtrWith<modelName> auto *o) noexcept
|
||||||
|
@ -244,7 +244,7 @@ constexpr Error model(TypeDescReader<T> *io, CommonPtrWith<DescriptorField> auto
|
|||||||
// defaultValue is unused now, but placeholder for backwards compatibility
|
// defaultValue is unused now, but placeholder for backwards compatibility
|
||||||
int defaultValue = 0;
|
int defaultValue = 0;
|
||||||
oxReturnError(io->field("defaultValue", &defaultValue));
|
oxReturnError(io->field("defaultValue", &defaultValue));
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ constexpr Error TypeDescWriter::field(StringViewCR name, T const*, std::size_t,
|
|||||||
const auto t = type(p);
|
const auto t = type(p);
|
||||||
oxAssert(t != nullptr, "field(const char *name, T *val, std::size_t): Type not found or generated");
|
oxAssert(t != nullptr, "field(const char *name, T *val, std::size_t): Type not found or generated");
|
||||||
m_type->fieldList.emplace_back(t, String(name), detail::indirectionLevels_v<T> + 1, subscriptStack, buildTypeId(*t));
|
m_type->fieldList.emplace_back(t, String(name), detail::indirectionLevels_v<T> + 1, subscriptStack, buildTypeId(*t));
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
@ -220,7 +220,7 @@ constexpr Error TypeDescWriter::field(StringViewCR name, T const*, std::size_t)
|
|||||||
auto const lvls = detail::indirectionLevels_v<T> + 1;
|
auto const lvls = detail::indirectionLevels_v<T> + 1;
|
||||||
SubscriptStack subscriptStack{lvls};
|
SubscriptStack subscriptStack{lvls};
|
||||||
m_type->fieldList.emplace_back(t, String(name), lvls, subscriptStack, buildTypeId(*t));
|
m_type->fieldList.emplace_back(t, String(name), lvls, subscriptStack, buildTypeId(*t));
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
@ -231,7 +231,7 @@ constexpr Error TypeDescWriter::field(StringViewCR name, UnionView<T, force> val
|
|||||||
const auto t = type(val);
|
const auto t = type(val);
|
||||||
oxAssert(t != nullptr, "field(const char *name, T val): Type not found or generated");
|
oxAssert(t != nullptr, "field(const char *name, T val): Type not found or generated");
|
||||||
m_type->fieldList.emplace_back(t, String(name), 0, SubscriptStack{}, ox::String(t->typeName));
|
m_type->fieldList.emplace_back(t, String(name), 0, SubscriptStack{}, ox::String(t->typeName));
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
}
|
}
|
||||||
|
@ -31,25 +31,25 @@ class FieldCounter {
|
|||||||
template<typename U>
|
template<typename U>
|
||||||
constexpr ox::Error field(StringViewCR, U) noexcept {
|
constexpr ox::Error field(StringViewCR, U) noexcept {
|
||||||
++fields;
|
++fields;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U>
|
template<typename U>
|
||||||
constexpr ox::Error field(StringViewCR, U, std::size_t) noexcept {
|
constexpr ox::Error field(StringViewCR, U, std::size_t) noexcept {
|
||||||
++fields;
|
++fields;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U, typename Handler>
|
template<typename U, typename Handler>
|
||||||
constexpr Error field(StringViewCR, Handler) {
|
constexpr Error field(StringViewCR, Handler) {
|
||||||
++fields;
|
++fields;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
constexpr Error fieldCString(Args&&...) noexcept {
|
constexpr Error fieldCString(Args&&...) noexcept {
|
||||||
++fields;
|
++fields;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto opType() noexcept {
|
static constexpr auto opType() noexcept {
|
||||||
|
24
deps/nostalgia/deps/ox/src/ox/model/modelops.hpp
vendored
24
deps/nostalgia/deps/ox/src/ox/model/modelops.hpp
vendored
@ -56,19 +56,19 @@ class MemberList {
|
|||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error field(const char*, T *v) noexcept {
|
constexpr Error field(const char*, T *v) noexcept {
|
||||||
vars[m_i++] = static_cast<void*>(v);
|
vars[m_i++] = static_cast<void*>(v);
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error field(const char*, T *v, int) noexcept {
|
constexpr Error field(const char*, T *v, int) noexcept {
|
||||||
vars[m_i++] = static_cast<void*>(v);
|
vars[m_i++] = static_cast<void*>(v);
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U, bool force = false>
|
template<typename U, bool force = false>
|
||||||
constexpr Error field(const char*, UnionView<U, force> u) noexcept {
|
constexpr Error field(const char*, UnionView<U, force> u) noexcept {
|
||||||
vars[m_i++] = static_cast<void*>(u.get());
|
vars[m_i++] = static_cast<void*>(u.get());
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -107,7 +107,7 @@ class Copier {
|
|||||||
auto &dst = *cbit_cast<FT*>(m_dst->vars[m_i]);
|
auto &dst = *cbit_cast<FT*>(m_dst->vars[m_i]);
|
||||||
dst = src;
|
dst = src;
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ class Copier {
|
|||||||
dst = src;
|
dst = src;
|
||||||
}
|
}
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U, bool force = false>
|
template<typename U, bool force = false>
|
||||||
@ -128,7 +128,7 @@ class Copier {
|
|||||||
auto &src = *u.get();
|
auto &src = *u.get();
|
||||||
dst = src;
|
dst = src;
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T = void>
|
template<typename T = void>
|
||||||
@ -168,7 +168,7 @@ class Mover {
|
|||||||
dst = std::move(src);
|
dst = std::move(src);
|
||||||
src = FT{};
|
src = FT{};
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,7 +181,7 @@ class Mover {
|
|||||||
src = FT{};
|
src = FT{};
|
||||||
}
|
}
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U, bool force = false>
|
template<typename U, bool force = false>
|
||||||
@ -190,7 +190,7 @@ class Mover {
|
|||||||
auto &src = *u.get();
|
auto &src = *u.get();
|
||||||
dst = std::move(src);
|
dst = std::move(src);
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T = void>
|
template<typename T = void>
|
||||||
@ -228,7 +228,7 @@ class Equals {
|
|||||||
const auto &dst = std::bit_cast<FT>(*m_other->vars[m_i]);
|
const auto &dst = std::bit_cast<FT>(*m_other->vars[m_i]);
|
||||||
++m_i;
|
++m_i;
|
||||||
if (dst == src) {
|
if (dst == src) {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
this->value = false;
|
this->value = false;
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
@ -246,7 +246,7 @@ class Equals {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_i;
|
++m_i;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U, bool force = false>
|
template<typename U, bool force = false>
|
||||||
@ -255,7 +255,7 @@ class Equals {
|
|||||||
const auto &src = *u.get();
|
const auto &src = *u.get();
|
||||||
++m_i;
|
++m_i;
|
||||||
if (dst == src) {
|
if (dst == src) {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
} else {
|
} else {
|
||||||
this->value = false;
|
this->value = false;
|
||||||
return ox::Error(1);
|
return ox::Error(1);
|
||||||
|
@ -18,6 +18,6 @@ static_assert([]() -> ox::Error {
|
|||||||
}
|
}
|
||||||
//oxReturnError(v.set<int32_t>(5));
|
//oxReturnError(v.set<int32_t>(5));
|
||||||
return {};
|
return {};
|
||||||
}() == ox::Error(0));
|
}() == ox::Error{});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -972,7 +972,7 @@ constexpr Error model(auto *h, CommonPtrWith<ModelObject> auto *obj) noexcept {
|
|||||||
for (auto &f : obj->m_fieldsOrder) {
|
for (auto &f : obj->m_fieldsOrder) {
|
||||||
OX_RETURN_ERROR(h->field(f->name.c_str(), &f->value));
|
OX_RETURN_ERROR(h->field(f->name.c_str(), &f->value));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr Error model(auto *h, CommonPtrWith<ModelUnion> auto *obj) noexcept {
|
constexpr Error model(auto *h, CommonPtrWith<ModelUnion> auto *obj) noexcept {
|
||||||
@ -981,7 +981,7 @@ constexpr Error model(auto *h, CommonPtrWith<ModelUnion> auto *obj) noexcept {
|
|||||||
for (auto &f : obj->m_fieldsOrder) {
|
for (auto &f : obj->m_fieldsOrder) {
|
||||||
OX_RETURN_ERROR(h->field(f->name.c_str(), &f->value));
|
OX_RETURN_ERROR(h->field(f->name.c_str(), &f->value));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr ModelValue::ModelValue(const ModelValue &other) noexcept {
|
constexpr ModelValue::ModelValue(const ModelValue &other) noexcept {
|
||||||
@ -1129,7 +1129,7 @@ constexpr Error ModelValue::setType(
|
|||||||
OX_RETURN_ERROR(m_data.uni->setType(type));
|
OX_RETURN_ERROR(m_data.uni->setType(type));
|
||||||
}
|
}
|
||||||
oxAssert(m_type != Type::Undefined, "No type set");
|
oxAssert(m_type != Type::Undefined, "No type set");
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -1184,7 +1184,7 @@ constexpr Error ModelValue::set(const T &v) noexcept {
|
|||||||
safeDelete(&value);
|
safeDelete(&value);
|
||||||
}
|
}
|
||||||
value = v;
|
value = v;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -1199,7 +1199,7 @@ constexpr Error ModelValue::set(T &&v) noexcept {
|
|||||||
safeDelete(&value);
|
safeDelete(&value);
|
||||||
}
|
}
|
||||||
value = std::move(v);
|
value = std::move(v);
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr ModelValue &ModelValue::operator=(ModelValue &other) noexcept {
|
constexpr ModelValue &ModelValue::operator=(ModelValue &other) noexcept {
|
||||||
|
@ -38,17 +38,17 @@ struct TypeNameCatcher {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error field(const char*, T*, std::size_t) noexcept {
|
constexpr Error field(const char*, T*, std::size_t) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error field(const char*, T) noexcept {
|
constexpr Error field(const char*, T) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ...Args>
|
template<typename ...Args>
|
||||||
constexpr Error fieldCString(Args&&...) noexcept {
|
constexpr Error fieldCString(Args&&...) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto opType() noexcept {
|
static constexpr auto opType() noexcept {
|
||||||
@ -77,17 +77,17 @@ struct TypeInfoCatcher {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error field(const char*, T*, std::size_t) noexcept {
|
constexpr Error field(const char*, T*, std::size_t) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error field(const char*, T) noexcept {
|
constexpr Error field(const char*, T) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr Error fieldCString(const char*, T) noexcept {
|
constexpr Error fieldCString(const char*, T) noexcept {
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr auto opType() noexcept {
|
static constexpr auto opType() noexcept {
|
||||||
|
4
deps/nostalgia/deps/ox/src/ox/model/walk.hpp
vendored
4
deps/nostalgia/deps/ox/src/ox/model/walk.hpp
vendored
@ -127,7 +127,7 @@ static constexpr Error parseField(const DescriptorField &field, Reader *rdr, Dat
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
walker->popNamePath();
|
walker->popNamePath();
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Reader, typename FH>
|
template<typename Reader, typename FH>
|
||||||
@ -141,7 +141,7 @@ constexpr Error model(Reader *rdr, DataWalker<Reader, FH> *walker) noexcept {
|
|||||||
for (const auto &field : fields) {
|
for (const auto &field : fields) {
|
||||||
OX_RETURN_ERROR(parseField(field, rdr, walker));
|
OX_RETURN_ERROR(parseField(field, rdr, walker));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Reader, typename Handler>
|
template<typename Reader, typename Handler>
|
||||||
|
8
deps/nostalgia/deps/ox/src/ox/oc/read.cpp
vendored
8
deps/nostalgia/deps/ox/src/ox/oc/read.cpp
vendored
@ -37,7 +37,7 @@ OrganicClawReader::OrganicClawReader(Json::Value json, int unionIdx) noexcept:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Error OrganicClawReader::field(const char *key, bool *val) noexcept {
|
Error OrganicClawReader::field(const char *key, bool *val) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (jv.empty()) {
|
if (jv.empty()) {
|
||||||
@ -53,7 +53,7 @@ Error OrganicClawReader::field(const char *key, bool *val) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Error OrganicClawReader::fieldCString(const char *key, char *val, std::size_t buffLen) noexcept {
|
Error OrganicClawReader::fieldCString(const char *key, char *val, std::size_t buffLen) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
const char *begin = nullptr, *end = nullptr;
|
const char *begin = nullptr, *end = nullptr;
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
@ -81,7 +81,7 @@ Error OrganicClawReader::fieldCString(const char *key, char *val, std::size_t bu
|
|||||||
}
|
}
|
||||||
|
|
||||||
Error OrganicClawReader::fieldCString(const char *key, char **val) noexcept {
|
Error OrganicClawReader::fieldCString(const char *key, char **val) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
const char *begin = nullptr, *end = nullptr;
|
const char *begin = nullptr, *end = nullptr;
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
auto &data = *val;
|
auto &data = *val;
|
||||||
@ -106,7 +106,7 @@ Error OrganicClawReader::fieldCString(const char *key, char **val) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Error OrganicClawReader::fieldCString(const char *key, char **val, std::size_t buffLen) noexcept {
|
Error OrganicClawReader::fieldCString(const char *key, char **val, std::size_t buffLen) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
const char *begin = nullptr, *end = nullptr;
|
const char *begin = nullptr, *end = nullptr;
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
|
12
deps/nostalgia/deps/ox/src/ox/oc/read.hpp
vendored
12
deps/nostalgia/deps/ox/src/ox/oc/read.hpp
vendored
@ -137,7 +137,7 @@ class OrganicClawReader {
|
|||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
try {
|
try {
|
||||||
if constexpr (is_integer_v<T>) {
|
if constexpr (is_integer_v<T>) {
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
@ -190,7 +190,7 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
|||||||
|
|
||||||
template<typename U, bool force>
|
template<typename U, bool force>
|
||||||
Error OrganicClawReader::field(const char *key, UnionView<U, force> val) noexcept {
|
Error OrganicClawReader::field(const char *key, UnionView<U, force> val) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (jv.empty() || jv.isObject()) {
|
if (jv.empty() || jv.isObject()) {
|
||||||
@ -207,7 +207,7 @@ Error OrganicClawReader::field(const char *key, UnionView<U, force> val) noexcep
|
|||||||
|
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
Error OrganicClawReader::field(const char *key, BasicString<L> *val) noexcept {
|
Error OrganicClawReader::field(const char *key, BasicString<L> *val) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (jv.empty()) {
|
if (jv.empty()) {
|
||||||
@ -224,7 +224,7 @@ Error OrganicClawReader::field(const char *key, BasicString<L> *val) noexcept {
|
|||||||
|
|
||||||
template<std::size_t L>
|
template<std::size_t L>
|
||||||
Error OrganicClawReader::field(const char *key, IString<L> *val) noexcept {
|
Error OrganicClawReader::field(const char *key, IString<L> *val) noexcept {
|
||||||
auto err = ox::Error(0);
|
ox::Error err{};
|
||||||
if (targetValid()) {
|
if (targetValid()) {
|
||||||
const auto &jv = value(key);
|
const auto &jv = value(key);
|
||||||
if (jv.empty()) {
|
if (jv.empty()) {
|
||||||
@ -257,7 +257,7 @@ OX_ALLOW_UNSAFE_BUFFERS_BEGIN
|
|||||||
OX_RETURN_ERROR(handler.field("", &val[i]));
|
OX_RETURN_ERROR(handler.field("", &val[i]));
|
||||||
OX_ALLOW_UNSAFE_BUFFERS_END
|
OX_ALLOW_UNSAFE_BUFFERS_END
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -274,7 +274,7 @@ Error OrganicClawReader::field(const char *key, HashMap<String, T> *val) noexcep
|
|||||||
const auto k = keys[i].c_str();
|
const auto k = keys[i].c_str();
|
||||||
OX_RETURN_ERROR(handler.field(k, &val->operator[](k)));
|
OX_RETURN_ERROR(handler.field(k, &val->operator[](k)));
|
||||||
}
|
}
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error readOC(BufferView buff, auto &val) noexcept {
|
Error readOC(BufferView buff, auto &val) noexcept {
|
||||||
|
2
deps/nostalgia/deps/ox/src/ox/oc/write.cpp
vendored
2
deps/nostalgia/deps/ox/src/ox/oc/write.cpp
vendored
@ -23,7 +23,7 @@ Error OrganicClawWriter::fieldCString(const char *key, const char *const*val, in
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error OrganicClawWriter::fieldCString(const char *key, const char *const*val) noexcept {
|
Error OrganicClawWriter::fieldCString(const char *key, const char *const*val) noexcept {
|
||||||
|
24
deps/nostalgia/deps/ox/src/ox/oc/write.hpp
vendored
24
deps/nostalgia/deps/ox/src/ox/oc/write.hpp
vendored
@ -46,7 +46,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(const char *key, const int16_t *val) noexcept {
|
Error field(const char *key, const int16_t *val) noexcept {
|
||||||
@ -54,7 +54,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(const char *key, const int32_t *val) noexcept {
|
Error field(const char *key, const int32_t *val) noexcept {
|
||||||
@ -62,7 +62,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(const char *key, const int64_t *val) noexcept {
|
Error field(const char *key, const int64_t *val) noexcept {
|
||||||
@ -70,7 +70,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(const char *key, const uint16_t *val) noexcept {
|
Error field(const char *key, const uint16_t *val) noexcept {
|
||||||
@ -87,7 +87,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(const char *key, const uint32_t *val) noexcept {
|
Error field(const char *key, const uint32_t *val) noexcept {
|
||||||
@ -95,7 +95,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(const char *key, const uint64_t *val) noexcept {
|
Error field(const char *key, const uint64_t *val) noexcept {
|
||||||
@ -103,7 +103,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = *val;
|
value(key) = *val;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error field(char const*key, bool const*val) noexcept {
|
Error field(char const*key, bool const*val) noexcept {
|
||||||
@ -151,7 +151,7 @@ class OrganicClawWriter {
|
|||||||
value(key) = val->c_str();
|
value(key) = val->c_str();
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Error fieldCString(const char*, const char *const*val, int len) noexcept;
|
Error fieldCString(const char*, const char *const*val, int len) noexcept;
|
||||||
@ -211,7 +211,7 @@ OX_ALLOW_UNSAFE_BUFFERS_END
|
|||||||
value(key) = w.m_json;
|
value(key) = w.m_json;
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -237,7 +237,7 @@ Error OrganicClawWriter::field(const char *key, const T *val) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename U, bool force>
|
template<typename U, bool force>
|
||||||
@ -251,7 +251,7 @@ Error OrganicClawWriter::field(const char *key, UnionView<U, force> val) noexcep
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<ox::Buffer> writeOC(const auto &val) noexcept {
|
Result<ox::Buffer> writeOC(const auto &val) noexcept {
|
||||||
|
2
deps/nostalgia/deps/ox/src/ox/std/string.hpp
vendored
2
deps/nostalgia/deps/ox/src/ox/std/string.hpp
vendored
@ -182,7 +182,7 @@ class BasicString {
|
|||||||
// make sure last element is a null terminator
|
// make sure last element is a null terminator
|
||||||
m_buff[currentLen + strLen] = 0;
|
m_buff[currentLen + strLen] = 0;
|
||||||
// this can't fail, but it returns an Error to match BString::append
|
// this can't fail, but it returns an Error to match BString::append
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr Error append(ox::StringView sv) noexcept {
|
constexpr Error append(ox::StringView sv) noexcept {
|
||||||
|
6
deps/nostalgia/deps/ox/src/ox/std/vector.hpp
vendored
6
deps/nostalgia/deps/ox/src/ox/std/vector.hpp
vendored
@ -311,7 +311,7 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
|
|||||||
*/
|
*/
|
||||||
constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept);
|
constexpr Error unordered_erase(std::size_t pos) noexcept(useNoexcept);
|
||||||
|
|
||||||
constexpr Error remove(T const &val);
|
constexpr Error remove(MaybeView_t<T> const &val);
|
||||||
|
|
||||||
constexpr void reserve(std::size_t cap) noexcept(useNoexcept);
|
constexpr void reserve(std::size_t cap) noexcept(useNoexcept);
|
||||||
|
|
||||||
@ -658,11 +658,11 @@ constexpr Error Vector<T, SmallVectorSize, Allocator>::unordered_erase(std::size
|
|||||||
--m_size;
|
--m_size;
|
||||||
m_items[pos] = std::move(m_items[m_size]);
|
m_items[pos] = std::move(m_items[m_size]);
|
||||||
m_items[m_size].~T();
|
m_items[m_size].~T();
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr ox::Error Vector<T, SmallVectorSize, Allocator>::remove(T const &val) {
|
constexpr ox::Error Vector<T, SmallVectorSize, Allocator>::remove(MaybeView_t<T> const &val) {
|
||||||
for (size_t i{}; auto const &v : *this) {
|
for (size_t i{}; auto const &v : *this) {
|
||||||
if (v == val) {
|
if (v == val) {
|
||||||
return erase(i).error;
|
return erase(i).error;
|
||||||
|
1
deps/nostalgia/release-notes.md
vendored
1
deps/nostalgia/release-notes.md
vendored
@ -1,5 +1,6 @@
|
|||||||
# d2025.06.0
|
# d2025.06.0
|
||||||
|
|
||||||
|
* Add ability to remember recent projects in config
|
||||||
* PaletteEditor: Add RGB key shortcuts for focusing color channels
|
* PaletteEditor: Add RGB key shortcuts for focusing color channels
|
||||||
|
|
||||||
# d2025.05.1
|
# d2025.05.1
|
||||||
|
@ -38,7 +38,7 @@ OX_MODEL_BEGIN(TileSheetEditorConfig)
|
|||||||
OX_MODEL_END()
|
OX_MODEL_END()
|
||||||
|
|
||||||
static ox::Vector<uint32_t> normalizePixelSizes(
|
static ox::Vector<uint32_t> normalizePixelSizes(
|
||||||
ox::Vector<uint8_t> const&inPixels) noexcept {
|
ox::Vector<uint8_t> const &inPixels) noexcept {
|
||||||
ox::Vector<uint32_t> outPixels;
|
ox::Vector<uint32_t> outPixels;
|
||||||
outPixels.reserve(inPixels.size());
|
outPixels.reserve(inPixels.size());
|
||||||
outPixels.resize(inPixels.size());
|
outPixels.resize(inPixels.size());
|
||||||
@ -49,7 +49,7 @@ static ox::Vector<uint32_t> normalizePixelSizes(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ox::Vector<uint32_t> normalizePixelArrangement(
|
static ox::Vector<uint32_t> normalizePixelArrangement(
|
||||||
ox::Vector<uint32_t> const&inPixels,
|
ox::Vector<uint32_t> const &inPixels,
|
||||||
int const cols,
|
int const cols,
|
||||||
int const scale) {
|
int const scale) {
|
||||||
auto const scalePt = ox::Point{scale, scale};
|
auto const scalePt = ox::Point{scale, scale};
|
||||||
@ -69,10 +69,10 @@ static ox::Vector<uint32_t> normalizePixelArrangement(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static ox::Error toPngFile(
|
static ox::Error toPngFile(
|
||||||
ox::CStringView const&path,
|
ox::CStringViewCR path,
|
||||||
ox::Vector<uint32_t> &&pixels,
|
ox::Vector<uint32_t> &&pixels,
|
||||||
Palette const&pal,
|
Palette const &pal,
|
||||||
size_t page,
|
size_t const page,
|
||||||
unsigned const width,
|
unsigned const width,
|
||||||
unsigned const height) noexcept {
|
unsigned const height) noexcept {
|
||||||
for (auto &c : pixels) {
|
for (auto &c : pixels) {
|
||||||
@ -90,7 +90,7 @@ static ox::Error toPngFile(
|
|||||||
}
|
}
|
||||||
|
|
||||||
TileSheetEditorImGui::TileSheetEditorImGui(studio::Context &sctx, ox::StringParam path):
|
TileSheetEditorImGui::TileSheetEditorImGui(studio::Context &sctx, ox::StringParam path):
|
||||||
Editor(sctx, std::move(path)),
|
Editor{sctx, std::move(path)},
|
||||||
m_sctx{sctx},
|
m_sctx{sctx},
|
||||||
m_tctx{m_sctx.tctx},
|
m_tctx{m_sctx.tctx},
|
||||||
m_palPicker{"Palette Chooser", keelCtx(sctx), FileExt_npal},
|
m_palPicker{"Palette Chooser", keelCtx(sctx), FileExt_npal},
|
||||||
@ -100,8 +100,11 @@ TileSheetEditorImGui::TileSheetEditorImGui(studio::Context &sctx, ox::StringPara
|
|||||||
m_subsheetEditor.inputSubmitted.connect(this, &TileSheetEditorImGui::updateActiveSubsheet);
|
m_subsheetEditor.inputSubmitted.connect(this, &TileSheetEditorImGui::updateActiveSubsheet);
|
||||||
m_exportMenu.inputSubmitted.connect(this, &TileSheetEditorImGui::exportSubsheetToPng);
|
m_exportMenu.inputSubmitted.connect(this, &TileSheetEditorImGui::exportSubsheetToPng);
|
||||||
// load config
|
// load config
|
||||||
auto const&config = studio::readConfig<TileSheetEditorConfig>(
|
auto &kctx = keelCtx(m_sctx);
|
||||||
keelCtx(m_sctx), itemPath());
|
auto const ip = itemPath();
|
||||||
|
oxLogError(studio::headerizeConfigFile<TileSheetEditorConfig>(kctx, ip));
|
||||||
|
auto const &config =
|
||||||
|
studio::readConfig<TileSheetEditorConfig>(kctx, ip);
|
||||||
if (config.ok()) {
|
if (config.ok()) {
|
||||||
m_model.setActiveSubsheet(validateSubSheetIdx(m_model.img(), config.value.activeSubsheet));
|
m_model.setActiveSubsheet(validateSubSheetIdx(m_model.img(), config.value.activeSubsheet));
|
||||||
}
|
}
|
||||||
@ -194,7 +197,7 @@ void TileSheetEditorImGui::draw(studio::Context&) noexcept {
|
|||||||
if (ig::mainWinHasFocus() && m_tool == TileSheetTool::Select) {
|
if (ig::mainWinHasFocus() && m_tool == TileSheetTool::Select) {
|
||||||
if (ImGui::IsKeyDown(ImGuiKey_ModCtrl) && !m_palPathFocused) {
|
if (ImGui::IsKeyDown(ImGuiKey_ModCtrl) && !m_palPathFocused) {
|
||||||
if (ImGui::IsKeyPressed(ImGuiKey_A)) {
|
if (ImGui::IsKeyPressed(ImGuiKey_A)) {
|
||||||
auto const&img = m_model.activeSubSheet();
|
auto const &img = m_model.activeSubSheet();
|
||||||
m_model.setSelection({{}, {img.columns * TileWidth - 1, img.rows * TileHeight - 1}});
|
m_model.setSelection({{}, {img.columns * TileWidth - 1, img.rows * TileHeight - 1}});
|
||||||
} else if (ImGui::IsKeyPressed(ImGuiKey_G)) {
|
} else if (ImGui::IsKeyPressed(ImGuiKey_G)) {
|
||||||
m_model.clearSelection();
|
m_model.clearSelection();
|
||||||
@ -273,14 +276,14 @@ void TileSheetEditorImGui::draw(studio::Context&) noexcept {
|
|||||||
auto constexpr btnSize = ImVec2{btnHeight, btnHeight};
|
auto constexpr btnSize = ImVec2{btnHeight, btnHeight};
|
||||||
if (ig::PushButton("+", btnSize)) {
|
if (ig::PushButton("+", btnSize)) {
|
||||||
auto insertOnIdx = m_model.activeSubSheetIdx();
|
auto insertOnIdx = m_model.activeSubSheetIdx();
|
||||||
auto const&parent = m_model.activeSubSheet();
|
auto const &parent = m_model.activeSubSheet();
|
||||||
m_model.addSubsheet(insertOnIdx);
|
m_model.addSubsheet(insertOnIdx);
|
||||||
insertOnIdx.emplace_back(parent.subsheets.size() - 1);
|
insertOnIdx.emplace_back(parent.subsheets.size() - 1);
|
||||||
setActiveSubsheet(insertOnIdx);
|
setActiveSubsheet(insertOnIdx);
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ig::PushButton("-", btnSize)) {
|
if (ig::PushButton("-", btnSize)) {
|
||||||
auto const&activeSubsheetIdx = m_model.activeSubSheetIdx();
|
auto const &activeSubsheetIdx = m_model.activeSubSheetIdx();
|
||||||
if (!activeSubsheetIdx.empty()) {
|
if (!activeSubsheetIdx.empty()) {
|
||||||
m_model.rmSubsheet(activeSubsheetIdx);
|
m_model.rmSubsheet(activeSubsheetIdx);
|
||||||
}
|
}
|
||||||
@ -380,7 +383,7 @@ void TileSheetEditorImGui::drawSubsheetSelector(
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
ox::Vec2 TileSheetEditorImGui::clickPos(ImVec2 const&winPos, ox::Vec2 clickPos) noexcept {
|
ox::Vec2 TileSheetEditorImGui::clickPos(ImVec2 const &winPos, ox::Vec2 clickPos) noexcept {
|
||||||
clickPos.x -= winPos.x + 10;
|
clickPos.x -= winPos.x + 10;
|
||||||
clickPos.y -= winPos.y + 10;
|
clickPos.y -= winPos.y + 10;
|
||||||
return clickPos;
|
return clickPos;
|
||||||
@ -402,7 +405,7 @@ void TileSheetEditorImGui::navigateTo(ox::StringViewCR arg) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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()) {
|
||||||
m_subsheetEditor.show(sheet.name, -1, -1);
|
m_subsheetEditor.show(sheet.name, -1, -1);
|
||||||
} else {
|
} else {
|
||||||
@ -413,8 +416,8 @@ void TileSheetEditorImGui::showSubsheetEditor() noexcept {
|
|||||||
ox::Error TileSheetEditorImGui::exportSubsheetToPng(int const scale) const noexcept {
|
ox::Error TileSheetEditorImGui::exportSubsheetToPng(int const scale) const noexcept {
|
||||||
OX_REQUIRE(path, studio::saveFile({{"PNG", "png"}}));
|
OX_REQUIRE(path, studio::saveFile({{"PNG", "png"}}));
|
||||||
// subsheet to png
|
// subsheet to png
|
||||||
auto const&s = m_model.activeSubSheet();
|
auto const &s = m_model.activeSubSheet();
|
||||||
auto const&pal = m_model.pal();
|
auto const &pal = m_model.pal();
|
||||||
auto const width = s.columns * TileWidth;
|
auto const width = s.columns * TileWidth;
|
||||||
auto const height = s.rows * TileHeight;
|
auto const height = s.rows * TileHeight;
|
||||||
auto pixels = normalizePixelSizes(s.pixels);
|
auto pixels = normalizePixelSizes(s.pixels);
|
||||||
@ -432,7 +435,7 @@ ox::Error TileSheetEditorImGui::exportSubsheetToPng(int const scale) const noexc
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept {
|
void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const &fbSize) noexcept {
|
||||||
auto const winPos = ImGui::GetWindowPos();
|
auto const winPos = ImGui::GetWindowPos();
|
||||||
auto const fbSizei = ox::Size{static_cast<int>(fbSize.x), static_cast<int>(fbSize.y)};
|
auto const fbSizei = ox::Size{static_cast<int>(fbSize.x), static_cast<int>(fbSize.y)};
|
||||||
if (m_framebuffer.width != fbSizei.width || m_framebuffer.height != fbSizei.height) {
|
if (m_framebuffer.width != fbSizei.width || m_framebuffer.height != fbSizei.height) {
|
||||||
@ -453,7 +456,7 @@ void TileSheetEditorImGui::drawTileSheet(ox::Vec2 const&fbSize) noexcept {
|
|||||||
{0, 1},
|
{0, 1},
|
||||||
{1, 0});
|
{1, 0});
|
||||||
// handle input, this must come after drawing
|
// handle input, this must come after drawing
|
||||||
auto const&io = ImGui::GetIO();
|
auto const &io = ImGui::GetIO();
|
||||||
auto const mousePos = ox::Vec2{ImGui::GetMousePos()};
|
auto const mousePos = ox::Vec2{ImGui::GetMousePos()};
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
auto const wheel = io.MouseWheel;
|
auto const wheel = io.MouseWheel;
|
||||||
@ -558,9 +561,9 @@ void TileSheetEditorImGui::drawPaletteMenu() noexcept {
|
|||||||
ImGui::TableSetupColumn("Color16", 0, 3);
|
ImGui::TableSetupColumn("Color16", 0, 3);
|
||||||
ImGui::TableHeadersRow();
|
ImGui::TableHeadersRow();
|
||||||
{
|
{
|
||||||
auto const&pal = m_model.pal();
|
auto const &pal = m_model.pal();
|
||||||
if (pal.pages.size() > m_model.palettePage()) {
|
if (pal.pages.size() > m_model.palettePage()) {
|
||||||
for (auto i = 0u; auto const&c: pal.pages[m_model.palettePage()].colors) {
|
for (auto i = 0u; auto const &c: pal.pages[m_model.palettePage()].colors) {
|
||||||
ImGui::TableNextRow();
|
ImGui::TableNextRow();
|
||||||
ImGui::PushID(static_cast<int>(i));
|
ImGui::PushID(static_cast<int>(i));
|
||||||
// Column: color idx
|
// Column: color idx
|
||||||
@ -582,7 +585,7 @@ void TileSheetEditorImGui::drawPaletteMenu() noexcept {
|
|||||||
auto const ic = ImGui::GetColorU32({redf(c), greenf(c), bluef(c), 1});
|
auto const ic = ImGui::GetColorU32({redf(c), greenf(c), bluef(c), 1});
|
||||||
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic);
|
ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ic);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
auto const&name = i < pal.colorNames.size() ? pal.colorNames[i].c_str() : "";
|
auto const &name = i < pal.colorNames.size() ? pal.colorNames[i].c_str() : "";
|
||||||
ImGui::Text("%s", name);
|
ImGui::Text("%s", name);
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("(%02d, %02d, %02d)", red16(c), green16(c), blue16(c));
|
ImGui::Text("(%02d, %02d, %02d)", red16(c), green16(c), blue16(c));
|
||||||
@ -596,7 +599,7 @@ void TileSheetEditorImGui::drawPaletteMenu() noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ox::Error TileSheetEditorImGui::updateActiveSubsheet(
|
ox::Error TileSheetEditorImGui::updateActiveSubsheet(
|
||||||
ox::StringView const&name, int const cols, int const rows) noexcept {
|
ox::StringViewCR name, int const cols, int const rows) noexcept {
|
||||||
return m_model.updateSubsheet(m_model.activeSubSheetIdx(), name, cols, rows);
|
return m_model.updateSubsheet(m_model.activeSubSheetIdx(), name, cols, rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ class TileSheetEditorImGui: public studio::Editor {
|
|||||||
void drawSubsheetSelector(TileSheet::SubSheet&, TileSheet::SubSheetIdx &path);
|
void drawSubsheetSelector(TileSheet::SubSheet&, TileSheet::SubSheetIdx &path);
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static ox::Vec2 clickPos(ImVec2 const&winPos, ox::Vec2 clickPos) noexcept;
|
static ox::Vec2 clickPos(ImVec2 const &winPos, ox::Vec2 clickPos) noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ox::Error saveItem() noexcept override;
|
ox::Error saveItem() noexcept override;
|
||||||
@ -94,11 +94,11 @@ class TileSheetEditorImGui: public studio::Editor {
|
|||||||
|
|
||||||
ox::Error exportSubsheetToPng(int scale) const noexcept;
|
ox::Error exportSubsheetToPng(int scale) const noexcept;
|
||||||
|
|
||||||
void drawTileSheet(ox::Vec2 const&fbSize) noexcept;
|
void drawTileSheet(ox::Vec2 const &fbSize) noexcept;
|
||||||
|
|
||||||
void drawPaletteMenu() noexcept;
|
void drawPaletteMenu() noexcept;
|
||||||
|
|
||||||
ox::Error updateActiveSubsheet(ox::StringView const&name, int cols, int rows) noexcept;
|
ox::Error updateActiveSubsheet(ox::StringViewCR name, int cols, int rows) noexcept;
|
||||||
|
|
||||||
void setActiveSubsheet(TileSheet::SubSheetIdx path) noexcept;
|
void setActiveSubsheet(TileSheet::SubSheetIdx path) noexcept;
|
||||||
|
|
||||||
|
@ -154,7 +154,7 @@ class AssetRef: public ox::SignalHandler {
|
|||||||
private:
|
private:
|
||||||
constexpr ox::Error emitUpdated() const noexcept {
|
constexpr ox::Error emitUpdated() const noexcept {
|
||||||
updated.emit();
|
updated.emit();
|
||||||
return ox::Error(0);
|
return {};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ ox::Result<DstType> convertObjToObj(
|
|||||||
template<typename DstType>
|
template<typename DstType>
|
||||||
ox::Result<DstType> convert(Context &ctx, ox::BufferView const&src) noexcept {
|
ox::Result<DstType> convert(Context &ctx, ox::BufferView const&src) noexcept {
|
||||||
OX_REQUIRE(out, convert(ctx, src, ox::ModelTypeName_v<DstType>, ox::ModelTypeVersion_v<DstType>));
|
OX_REQUIRE(out, convert(ctx, src, ox::ModelTypeName_v<DstType>, ox::ModelTypeVersion_v<DstType>));
|
||||||
return std::move(wrapCast<DstType>(out));
|
return std::move(wrapCast<DstType>(*out));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename DstType>
|
template<typename DstType>
|
||||||
|
@ -43,7 +43,7 @@ static ox::Error runApp(
|
|||||||
oxLogError(turbine::setWindowIcon(*ctx, WindowIcons()));
|
oxLogError(turbine::setWindowIcon(*ctx, WindowIcons()));
|
||||||
turbine::setWindowTitle(*ctx, keelCtx(*ctx).appName);
|
turbine::setWindowTitle(*ctx, keelCtx(*ctx).appName);
|
||||||
turbine::setKeyEventHandler(*ctx, keyEventHandler);
|
turbine::setKeyEventHandler(*ctx, keyEventHandler);
|
||||||
turbine::setRefreshWithin(*ctx, 0);
|
turbine::requireRefreshWithin(*ctx, 0);
|
||||||
StudioUI ui(*ctx, projectDataDir);
|
StudioUI ui(*ctx, projectDataDir);
|
||||||
StudioUIDrawer drawer(ui);
|
StudioUIDrawer drawer(ui);
|
||||||
turbine::gl::addDrawer(*ctx, &drawer);
|
turbine::gl::addDrawer(*ctx, &drawer);
|
||||||
@ -71,9 +71,9 @@ static ox::Error run(
|
|||||||
}
|
}
|
||||||
|
|
||||||
ox::Error run(
|
ox::Error run(
|
||||||
ox::StringView project,
|
ox::StringView const project,
|
||||||
ox::StringView appName,
|
ox::StringView const appName,
|
||||||
ox::StringView projectDataDir,
|
ox::StringView const projectDataDir,
|
||||||
ox::SpanView<ox::CString> args) noexcept {
|
ox::SpanView<ox::CString> args) noexcept {
|
||||||
return studio::run(ox::sfmt("{} {}", project, appName), projectDataDir, args);
|
return studio::run(ox::sfmt("{} {}", project, appName), projectDataDir, args);
|
||||||
}
|
}
|
||||||
|
@ -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 <turbine/gfx.hpp>
|
||||||
|
|
||||||
#include <studio/imguiutil.hpp>
|
#include <studio/imguiutil.hpp>
|
||||||
|
|
||||||
#include "deleteconfirmation.hpp"
|
#include "deleteconfirmation.hpp"
|
||||||
@ -43,6 +45,9 @@ void DeleteConfirmation::draw(Context &ctx) noexcept {
|
|||||||
ImGui::OpenPopup(title().c_str());
|
ImGui::OpenPopup(title().c_str());
|
||||||
m_stage = Stage::Open;
|
m_stage = Stage::Open;
|
||||||
m_open = true;
|
m_open = true;
|
||||||
|
// require extended refresh in case new contents require resize
|
||||||
|
// this can take around a second
|
||||||
|
turbine::requireRefreshFor(ctx.tctx, 1000);
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case Stage::Open:
|
case Stage::Open:
|
||||||
drawWindow(ctx.tctx, m_open, [this] {
|
drawWindow(ctx.tctx, m_open, [this] {
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
|
||||||
|
#include <ox/std/def.hpp>
|
||||||
|
|
||||||
#include <keel/media.hpp>
|
#include <keel/media.hpp>
|
||||||
#include <glutils/glutils.hpp>
|
#include <glutils/glutils.hpp>
|
||||||
#include <turbine/turbine.hpp>
|
#include <turbine/turbine.hpp>
|
||||||
@ -17,6 +19,8 @@
|
|||||||
#include "font.hpp"
|
#include "font.hpp"
|
||||||
#include "studioui.hpp"
|
#include "studioui.hpp"
|
||||||
|
|
||||||
|
#include <complex>
|
||||||
|
|
||||||
#ifdef OX_OS_Darwin
|
#ifdef OX_OS_Darwin
|
||||||
#define STUDIO_CTRL "Cmd"
|
#define STUDIO_CTRL "Cmd"
|
||||||
#else
|
#else
|
||||||
@ -54,7 +58,7 @@ void registerModule(Module const*mod) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct StudioConfig {
|
struct StudioConfigV1 {
|
||||||
static constexpr auto TypeName = "net.drinkingtea.studio.StudioConfig";
|
static constexpr auto TypeName = "net.drinkingtea.studio.StudioConfig";
|
||||||
static constexpr auto TypeVersion = 1;
|
static constexpr auto TypeVersion = 1;
|
||||||
ox::String projectPath;
|
ox::String projectPath;
|
||||||
@ -63,13 +67,65 @@ struct StudioConfig {
|
|||||||
bool showProjectExplorer = true;
|
bool showProjectExplorer = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
OX_MODEL_BEGIN(StudioConfig)
|
OX_MODEL_BEGIN(StudioConfigV1)
|
||||||
OX_MODEL_FIELD_RENAME(activeTabItemName, active_tab_item_name)
|
OX_MODEL_FIELD_RENAME(activeTabItemName, active_tab_item_name)
|
||||||
OX_MODEL_FIELD_RENAME(projectPath, project_path)
|
OX_MODEL_FIELD_RENAME(projectPath, project_path)
|
||||||
OX_MODEL_FIELD_RENAME(openFiles, open_files)
|
OX_MODEL_FIELD_RENAME(openFiles, open_files)
|
||||||
OX_MODEL_FIELD_RENAME(showProjectExplorer, show_project_explorer)
|
OX_MODEL_FIELD_RENAME(showProjectExplorer, show_project_explorer)
|
||||||
OX_MODEL_END()
|
OX_MODEL_END()
|
||||||
|
|
||||||
|
|
||||||
|
struct StudioConfigV2 {
|
||||||
|
static constexpr auto TypeName = "net.drinkingtea.studio.StudioConfig";
|
||||||
|
static constexpr auto TypeVersion = 2;
|
||||||
|
struct ProjectConfig {
|
||||||
|
static constexpr auto TypeName = "net.drinkingtea.studio.ProjectConfig";
|
||||||
|
static constexpr auto TypeVersion = 2;
|
||||||
|
ox::String projectPath;
|
||||||
|
ox::String activeTabItemName;
|
||||||
|
ox::Vector<ox::String> openFiles;
|
||||||
|
};
|
||||||
|
ox::Vector<ProjectConfig> projects;
|
||||||
|
bool showProjectExplorer = true;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr ProjectConfig const *project() const {
|
||||||
|
return projects.empty() ? nullptr : &projects[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr ProjectConfig *project() {
|
||||||
|
return projects.empty() ? nullptr : &projects[0];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
OX_MODEL_BEGIN(StudioConfigV2::ProjectConfig)
|
||||||
|
OX_MODEL_FIELD_RENAME(activeTabItemName, active_tab_item_name)
|
||||||
|
OX_MODEL_FIELD_RENAME(projectPath, project_path)
|
||||||
|
OX_MODEL_FIELD_RENAME(openFiles, open_files)
|
||||||
|
OX_MODEL_END()
|
||||||
|
|
||||||
|
OX_MODEL_BEGIN(StudioConfigV2)
|
||||||
|
OX_MODEL_FIELD(projects)
|
||||||
|
OX_MODEL_FIELD_RENAME(showProjectExplorer, show_project_explorer)
|
||||||
|
OX_MODEL_END()
|
||||||
|
|
||||||
|
static ox::Error convertStudioConfigV1ToStudioConfigV2(
|
||||||
|
keel::Context&,
|
||||||
|
StudioConfigV1 &src,
|
||||||
|
StudioConfigV2 &dst) noexcept {
|
||||||
|
dst.projects.emplace_back(StudioConfigV2::ProjectConfig{
|
||||||
|
.projectPath = std::move(src.projectPath),
|
||||||
|
.activeTabItemName = std::move(src.activeTabItemName),
|
||||||
|
.openFiles = std::move(src.openFiles),
|
||||||
|
});
|
||||||
|
dst.showProjectExplorer = src.showProjectExplorer;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
using StudioConfig = StudioConfigV2;
|
||||||
|
|
||||||
|
|
||||||
StudioUI::StudioUI(turbine::Context &ctx, ox::StringParam projectDataDir) noexcept:
|
StudioUI::StudioUI(turbine::Context &ctx, ox::StringParam projectDataDir) noexcept:
|
||||||
m_sctx{*this, ctx},
|
m_sctx{*this, ctx},
|
||||||
m_tctx{ctx},
|
m_tctx{ctx},
|
||||||
@ -87,6 +143,9 @@ StudioUI::StudioUI(turbine::Context &ctx, ox::StringParam projectDataDir) noexce
|
|||||||
// and hopefully it will change at some point.
|
// and hopefully it will change at some point.
|
||||||
io.Fonts->AddFontFromMemoryTTF(const_cast<uint8_t*>(font.data()), static_cast<int>(font.size()), 13, &fontCfg);
|
io.Fonts->AddFontFromMemoryTTF(const_cast<uint8_t*>(font.data()), static_cast<int>(font.size()), 13, &fontCfg);
|
||||||
}
|
}
|
||||||
|
auto &kctx = keelCtx(m_tctx);
|
||||||
|
kctx.converters.emplace_back(keel::Converter::make<convertStudioConfigV1ToStudioConfigV2>());
|
||||||
|
oxLogError(headerizeConfigFile<StudioConfigV1>(kctx));
|
||||||
turbine::setApplicationData(m_tctx, &m_sctx);
|
turbine::setApplicationData(m_tctx, &m_sctx);
|
||||||
turbine::setShutdownHandler(m_tctx, shutdownHandler);
|
turbine::setShutdownHandler(m_tctx, shutdownHandler);
|
||||||
m_projectExplorer.fileChosen.connect(this, &StudioUI::openFile);
|
m_projectExplorer.fileChosen.connect(this, &StudioUI::openFile);
|
||||||
@ -102,21 +161,14 @@ StudioUI::StudioUI(turbine::Context &ctx, ox::StringParam projectDataDir) noexce
|
|||||||
m_newMenu.finished.connect(this, &StudioUI::openFile);
|
m_newMenu.finished.connect(this, &StudioUI::openFile);
|
||||||
m_closeAppConfirm.response.connect(this, &StudioUI::handleCloseAppResponse);
|
m_closeAppConfirm.response.connect(this, &StudioUI::handleCloseAppResponse);
|
||||||
m_closeFileConfirm.response.connect(this, &StudioUI::handleCloseFileResponse);
|
m_closeFileConfirm.response.connect(this, &StudioUI::handleCloseFileResponse);
|
||||||
|
m_removeRecentProject.dlg.response.connect(this, &StudioUI::handleRemoveRecentProjectResponse);
|
||||||
loadModules();
|
loadModules();
|
||||||
// open project and files
|
// open project and files
|
||||||
auto const [config, err] = studio::readConfig<StudioConfig>(keelCtx(m_tctx));
|
auto const [config, err] = studio::readConfig<StudioConfig>(keelCtx(m_tctx));
|
||||||
m_showProjectExplorer = config.showProjectExplorer;
|
m_showProjectExplorer = config.showProjectExplorer;
|
||||||
if (!err) {
|
if (!err) {
|
||||||
auto const openProjErr = openProjectPath(config.projectPath);
|
if (auto const pc = config.project()) {
|
||||||
if (!openProjErr) {
|
oxLogError(openProjectPath(pc->projectPath));
|
||||||
for (auto const&f: config.openFiles) {
|
|
||||||
auto const openFileErr = openFileActiveTab(f, config.activeTabItemName == f);
|
|
||||||
if (openFileErr) {
|
|
||||||
oxErrorf("\nCould not open editor for file:\n\t{}\nReason:\n\t{}\n", f, toStr(openFileErr));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
m_activeEditor = m_editors.back().value->get();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if constexpr(!ox::defines::Debug) {
|
if constexpr(!ox::defines::Debug) {
|
||||||
@ -142,7 +194,7 @@ void StudioUI::navigateTo(ox::StringParam path, ox::StringParam navArgs) noexcep
|
|||||||
void StudioUI::draw() noexcept {
|
void StudioUI::draw() noexcept {
|
||||||
glutils::clearScreen();
|
glutils::clearScreen();
|
||||||
drawMenu();
|
drawMenu();
|
||||||
auto const&viewport = *ImGui::GetMainViewport();
|
auto const &viewport = *ImGui::GetMainViewport();
|
||||||
ImGui::SetNextWindowPos(viewport.WorkPos);
|
ImGui::SetNextWindowPos(viewport.WorkPos);
|
||||||
ImGui::SetNextWindowSize(viewport.WorkSize);
|
ImGui::SetNextWindowSize(viewport.WorkSize);
|
||||||
ImGui::SetNextWindowViewport(viewport.ID);
|
ImGui::SetNextWindowViewport(viewport.ID);
|
||||||
@ -194,6 +246,18 @@ void StudioUI::drawMenu() noexcept {
|
|||||||
if (ImGui::MenuItem("Open Project...", STUDIO_CTRL "+O")) {
|
if (ImGui::MenuItem("Open Project...", STUDIO_CTRL "+O")) {
|
||||||
m_taskRunner.add(*ox::make<FileDialogManager>(this, &StudioUI::openProjectPath));
|
m_taskRunner.add(*ox::make<FileDialogManager>(this, &StudioUI::openProjectPath));
|
||||||
}
|
}
|
||||||
|
if (ImGui::BeginMenu("Recent Projects", m_recentProjects.size() > 1)) {
|
||||||
|
for (size_t i = 1; i < m_recentProjects.size(); ++i) {
|
||||||
|
auto const &p = m_recentProjects[i];
|
||||||
|
if (ImGui::MenuItem(p.c_str())) {
|
||||||
|
if (openProjectPath(p)) {
|
||||||
|
m_removeRecentProject.idx = i;
|
||||||
|
m_removeRecentProject.dlg.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
if (ImGui::MenuItem(
|
if (ImGui::MenuItem(
|
||||||
"Save",
|
"Save",
|
||||||
STUDIO_CTRL "+S",
|
STUDIO_CTRL "+S",
|
||||||
@ -270,7 +334,7 @@ void StudioUI::drawTabBar() noexcept {
|
|||||||
|
|
||||||
void StudioUI::drawTabs() noexcept {
|
void StudioUI::drawTabs() noexcept {
|
||||||
for (auto it = m_editors.begin(); it != m_editors.end();) {
|
for (auto it = m_editors.begin(); it != m_editors.end();) {
|
||||||
auto const&e = *it;
|
auto const &e = *it;
|
||||||
auto open = true;
|
auto open = true;
|
||||||
auto const unsavedChanges = e->unsavedChanges() ? ImGuiTabItemFlags_UnsavedDocument : 0;
|
auto const unsavedChanges = e->unsavedChanges() ? ImGuiTabItemFlags_UnsavedDocument : 0;
|
||||||
auto const selected = m_activeEditorUpdatePending == e.get() ? ImGuiTabItemFlags_SetSelected : 0;
|
auto const selected = m_activeEditorUpdatePending == e.get() ? ImGuiTabItemFlags_SetSelected : 0;
|
||||||
@ -279,9 +343,11 @@ void StudioUI::drawTabs() noexcept {
|
|||||||
if (m_activeEditor != e.get()) [[unlikely]] {
|
if (m_activeEditor != e.get()) [[unlikely]] {
|
||||||
m_activeEditor = e.get();
|
m_activeEditor = e.get();
|
||||||
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&](StudioConfig &config) {
|
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&](StudioConfig &config) {
|
||||||
config.activeTabItemName = m_activeEditor->itemPath();
|
if (auto const pc = config.project()) {
|
||||||
|
pc->activeTabItemName = m_activeEditor->itemPath();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
turbine::setRefreshWithin(m_tctx, 0);
|
turbine::requireRefreshWithin(m_tctx, 0);
|
||||||
} else [[likely]] {
|
} else [[likely]] {
|
||||||
if (m_activeEditorUpdatePending == e.get()) [[unlikely]] {
|
if (m_activeEditorUpdatePending == e.get()) [[unlikely]] {
|
||||||
m_activeEditorUpdatePending = nullptr;
|
m_activeEditorUpdatePending = nullptr;
|
||||||
@ -337,14 +403,14 @@ void StudioUI::drawTabs() noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StudioUI::loadEditorMaker(EditorMaker const&editorMaker) noexcept {
|
void StudioUI::loadEditorMaker(EditorMaker const &editorMaker) noexcept {
|
||||||
for (auto const&ext : editorMaker.fileTypes) {
|
for (auto const &ext : editorMaker.fileTypes) {
|
||||||
m_editorMakers[ext] = editorMaker.make;
|
m_editorMakers[ext] = editorMaker.make;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StudioUI::loadModule(Module const&mod) noexcept {
|
void StudioUI::loadModule(Module const &mod) noexcept {
|
||||||
for (auto const&editorMaker : mod.editors(m_sctx)) {
|
for (auto const &editorMaker : mod.editors(m_sctx)) {
|
||||||
loadEditorMaker(editorMaker);
|
loadEditorMaker(editorMaker);
|
||||||
}
|
}
|
||||||
for (auto &im : mod.itemMakers(m_sctx)) {
|
for (auto &im : mod.itemMakers(m_sctx)) {
|
||||||
@ -464,14 +530,16 @@ ox::Error StudioUI::renameFile(ox::StringViewCR path) noexcept {
|
|||||||
return m_renameFile.openPath(path);
|
return m_renameFile.openPath(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Error StudioUI::handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const&) noexcept {
|
ox::Error StudioUI::handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const &) noexcept {
|
||||||
for (auto &f : m_openFiles) {
|
for (auto &f : m_openFiles) {
|
||||||
if (f == oldPath) {
|
if (f == oldPath) {
|
||||||
f = newPath;
|
f = newPath;
|
||||||
editConfig<StudioConfig>(keelCtx(m_sctx), [&](StudioConfig &cfg) {
|
editConfig<StudioConfig>(keelCtx(m_sctx), [&](StudioConfig &cfg) {
|
||||||
auto p = find(cfg.openFiles.begin(), cfg.openFiles.end(), oldPath);
|
if (auto const pc = cfg.project()) {
|
||||||
*p = newPath;
|
auto p = find(pc->openFiles.begin(), pc->openFiles.end(), oldPath);
|
||||||
cfg.activeTabItemName = newPath;
|
*p = newPath;
|
||||||
|
pc->activeTabItemName = newPath;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -546,8 +614,36 @@ ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept {
|
|||||||
m_openFiles.clear();
|
m_openFiles.clear();
|
||||||
m_editors.clear();
|
m_editors.clear();
|
||||||
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&](StudioConfig &config) {
|
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&](StudioConfig &config) {
|
||||||
config.projectPath = ox::String(m_project->projectPath());
|
auto const pcIt = std::find_if(
|
||||||
config.openFiles.clear();
|
config.projects.begin(), config.projects.end(),
|
||||||
|
[this](StudioConfig::ProjectConfig const &pc) {
|
||||||
|
return pc.projectPath == m_project->projectPath();
|
||||||
|
});
|
||||||
|
if (pcIt != config.projects.end()) {
|
||||||
|
auto p = std::move(*pcIt);
|
||||||
|
std::ignore = config.projects.erase(pcIt);
|
||||||
|
auto &pc = *config.projects.emplace(0, std::move(p));
|
||||||
|
for (auto const &f: pc.openFiles) {
|
||||||
|
auto const openFileErr = openFileActiveTab(f, pc.activeTabItemName == f);
|
||||||
|
if (openFileErr) {
|
||||||
|
oxErrorf("\nCould not open editor for file:\n\t{}\nReason:\n\t{}\n", f, toStr(openFileErr));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
m_activeEditor = m_editors.back().value->get();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
config.projects.emplace(0, StudioConfig::ProjectConfig{
|
||||||
|
.projectPath = ox::String{m_project->projectPath()},
|
||||||
|
.activeTabItemName = {},
|
||||||
|
.openFiles = {},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
config.projects.resize(ox::min<size_t>(10, config.projects.size()));
|
||||||
|
m_recentProjects.clear();
|
||||||
|
m_recentProjects.reserve(config.projects.size());
|
||||||
|
for (auto const &p : config.projects) {
|
||||||
|
m_recentProjects.emplace_back(p.projectPath);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return m_projectExplorer.refreshProjectTreeModel();
|
return m_projectExplorer.refreshProjectTreeModel();
|
||||||
}
|
}
|
||||||
@ -593,8 +689,10 @@ ox::Error StudioUI::openFileActiveTab(ox::StringViewCR path, bool const makeActi
|
|||||||
}
|
}
|
||||||
// save to config
|
// save to config
|
||||||
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&path](StudioConfig &config) {
|
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&path](StudioConfig &config) {
|
||||||
if (!config.openFiles.contains(path)) {
|
if (auto const pc = config.project()) {
|
||||||
config.openFiles.emplace_back(path);
|
if (!pc->openFiles.contains(path)) {
|
||||||
|
pc->openFiles.emplace_back(path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return {};
|
return {};
|
||||||
@ -618,6 +716,22 @@ ox::Error StudioUI::handleCloseFileResponse(ig::PopupResponse const response) no
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ox::Error StudioUI::handleRemoveRecentProjectResponse(ig::PopupResponse const response) noexcept {
|
||||||
|
if (response == ig::PopupResponse::OK) {
|
||||||
|
auto const p = std::move(m_recentProjects[m_removeRecentProject.idx]);
|
||||||
|
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&p](StudioConfig &config) {
|
||||||
|
std::ignore = config.projects.erase(
|
||||||
|
std::remove_if(
|
||||||
|
config.projects.begin(), config.projects.end(),
|
||||||
|
[&p](StudioConfig::ProjectConfig const &pc) {
|
||||||
|
return pc.projectPath == p;
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
return m_recentProjects.erase(m_removeRecentProject.idx).error;
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
ox::Error StudioUI::closeCurrentFile() noexcept {
|
ox::Error StudioUI::closeCurrentFile() noexcept {
|
||||||
for (auto &e : m_editors) {
|
for (auto &e : m_editors) {
|
||||||
if (m_activeEditor == e.get()) {
|
if (m_activeEditor == e.get()) {
|
||||||
@ -636,7 +750,9 @@ ox::Error StudioUI::closeFile(ox::StringViewCR path) noexcept {
|
|||||||
std::ignore = m_openFiles.erase(std::remove(m_openFiles.begin(), m_openFiles.end(), path));
|
std::ignore = m_openFiles.erase(std::remove(m_openFiles.begin(), m_openFiles.end(), path));
|
||||||
// save to config
|
// save to config
|
||||||
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&](StudioConfig &config) {
|
studio::editConfig<StudioConfig>(keelCtx(m_tctx), [&](StudioConfig &config) {
|
||||||
std::ignore = config.openFiles.erase(std::remove(config.openFiles.begin(), config.openFiles.end(), path));
|
if (auto const pc = config.project()) {
|
||||||
|
std::ignore = pc->openFiles.erase(std::remove(pc->openFiles.begin(), pc->openFiles.end(), path));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -44,6 +44,7 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
bool m_closeActiveTab{};
|
bool m_closeActiveTab{};
|
||||||
ox::Vector<ox::Pair<ox::String>> m_queuedMoves;
|
ox::Vector<ox::Pair<ox::String>> m_queuedMoves;
|
||||||
ox::Vector<ox::Pair<ox::String>> m_queuedDirMoves;
|
ox::Vector<ox::Pair<ox::String>> m_queuedDirMoves;
|
||||||
|
ox::Vector<ox::String> m_recentProjects;
|
||||||
NewMenu m_newMenu{keelCtx(m_tctx)};
|
NewMenu m_newMenu{keelCtx(m_tctx)};
|
||||||
AboutPopup m_aboutPopup{m_tctx};
|
AboutPopup m_aboutPopup{m_tctx};
|
||||||
DeleteConfirmation m_deleteConfirmation;
|
DeleteConfirmation m_deleteConfirmation;
|
||||||
@ -57,7 +58,11 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
MakeCopyPopup m_copyFilePopup;
|
MakeCopyPopup m_copyFilePopup;
|
||||||
RenameFile m_renameFile;
|
RenameFile m_renameFile;
|
||||||
NewProject m_newProject{m_projectDataDir};
|
NewProject m_newProject{m_projectDataDir};
|
||||||
ox::Array<Widget*, 10> const m_widgets {
|
struct {
|
||||||
|
ig::QuestionPopup dlg{"Remove From Recents?", "Unable to load project. Remove from recent projects?"};
|
||||||
|
size_t idx{};
|
||||||
|
} m_removeRecentProject;
|
||||||
|
ox::Array<Widget*, 11> const m_widgets {
|
||||||
&m_closeFileConfirm,
|
&m_closeFileConfirm,
|
||||||
&m_closeAppConfirm,
|
&m_closeAppConfirm,
|
||||||
&m_copyFilePopup,
|
&m_copyFilePopup,
|
||||||
@ -68,6 +73,7 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
&m_newDirDialog,
|
&m_newDirDialog,
|
||||||
&m_renameFile,
|
&m_renameFile,
|
||||||
&m_messagePopup,
|
&m_messagePopup,
|
||||||
|
&m_removeRecentProject.dlg,
|
||||||
};
|
};
|
||||||
bool m_showProjectExplorer = true;
|
bool m_showProjectExplorer = true;
|
||||||
struct NavAction {
|
struct NavAction {
|
||||||
@ -100,9 +106,9 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
|
|
||||||
void drawTabs() noexcept;
|
void drawTabs() noexcept;
|
||||||
|
|
||||||
void loadEditorMaker(EditorMaker const&editorMaker) noexcept;
|
void loadEditorMaker(EditorMaker const &editorMaker) noexcept;
|
||||||
|
|
||||||
void loadModule(Module const&mod) noexcept;
|
void loadModule(Module const &mod) noexcept;
|
||||||
|
|
||||||
void loadModules() noexcept;
|
void loadModules() noexcept;
|
||||||
|
|
||||||
@ -124,7 +130,7 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
|
|
||||||
ox::Error renameFile(ox::StringViewCR path) noexcept;
|
ox::Error renameFile(ox::StringViewCR path) noexcept;
|
||||||
|
|
||||||
ox::Error handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const&id) noexcept;
|
ox::Error handleMoveFile(ox::StringViewCR oldPath, ox::StringViewCR newPath, ox::UUID const &id) noexcept;
|
||||||
|
|
||||||
ox::Error handleDeleteDir(ox::StringViewCR path) noexcept;
|
ox::Error handleDeleteDir(ox::StringViewCR path) noexcept;
|
||||||
|
|
||||||
@ -144,6 +150,8 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
|
|
||||||
ox::Error handleCloseFileResponse(ig::PopupResponse response) noexcept;
|
ox::Error handleCloseFileResponse(ig::PopupResponse response) noexcept;
|
||||||
|
|
||||||
|
ox::Error handleRemoveRecentProjectResponse(ig::PopupResponse response) noexcept;
|
||||||
|
|
||||||
ox::Error closeCurrentFile() noexcept;
|
ox::Error closeCurrentFile() noexcept;
|
||||||
|
|
||||||
ox::Error closeFile(ox::StringViewCR path) noexcept;
|
ox::Error closeFile(ox::StringViewCR path) noexcept;
|
||||||
|
@ -4,21 +4,21 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <ox/claw/claw.hpp>
|
||||||
#include <ox/fs/fs.hpp>
|
#include <ox/fs/fs.hpp>
|
||||||
#include <ox/model/typenamecatcher.hpp>
|
#include <ox/model/typenamecatcher.hpp>
|
||||||
#include <ox/oc/oc.hpp>
|
|
||||||
#include <ox/std/buffer.hpp>
|
#include <ox/std/buffer.hpp>
|
||||||
#include <ox/std/defines.hpp>
|
#include <ox/std/defines.hpp>
|
||||||
#include <ox/std/fmt.hpp>
|
#include <ox/std/fmt.hpp>
|
||||||
#include <ox/std/trace.hpp>
|
|
||||||
#include <ox/std/string.hpp>
|
#include <ox/std/string.hpp>
|
||||||
|
#include <ox/std/trace.hpp>
|
||||||
|
|
||||||
#include <keel/context.hpp>
|
#include <keel/context.hpp>
|
||||||
|
|
||||||
namespace studio {
|
namespace studio {
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
inline ox::String slashesToPct(ox::StringView str) noexcept {
|
inline ox::String slashesToPct(ox::StringViewCR str) noexcept {
|
||||||
auto out = ox::String{str};
|
auto out = ox::String{str};
|
||||||
for (auto&c: out) {
|
for (auto&c: out) {
|
||||||
if (c == '/' || c == '\\') {
|
if (c == '/' || c == '\\') {
|
||||||
@ -30,78 +30,102 @@ inline ox::String slashesToPct(ox::StringView str) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
ox::String configPath(keel::Context const&ctx) noexcept;
|
ox::String configPath(keel::Context const&kctx) noexcept;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ox::Result<T> readConfig(keel::Context &ctx, ox::StringViewCR name) noexcept {
|
ox::Result<T> readConfig(keel::Context &kctx, ox::StringViewCR name) noexcept {
|
||||||
oxAssert(name != "", "Config type has no TypeName");
|
oxAssert(name != "", "Config type has no TypeName");
|
||||||
auto const path = ox::sfmt("/{}.json", detail::slashesToPct(name));
|
auto const path = ox::sfmt("/{}.json", detail::slashesToPct(name));
|
||||||
ox::PassThroughFS fs(configPath(ctx));
|
ox::PassThroughFS fs(configPath(kctx));
|
||||||
auto const [buff, err] = fs.read(path);
|
auto const [buff, err] = fs.read(path);
|
||||||
if (err) {
|
if (err) {
|
||||||
//oxErrf("Could not read config file: {} - {}\n", path, toStr(err));
|
//oxErrf("Could not read config file: {} - {}\n", path, toStr(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
return ox::readOC<T>(buff);
|
OX_REQUIRE(id, ox::readClawTypeId(buff));
|
||||||
|
ox::Result<T> out;
|
||||||
|
if (id != ox::ModelTypeId_v<T>) {
|
||||||
|
out = keel::convert<T>(kctx, buff);
|
||||||
|
} else {
|
||||||
|
out = ox::readClaw<T>(buff);
|
||||||
|
}
|
||||||
|
OX_RETURN_ERROR(out);
|
||||||
|
OX_RETURN_ERROR(keel::ensureValid(out.value));
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ox::Result<T> readConfig(keel::Context &ctx) noexcept {
|
ox::Result<T> readConfig(keel::Context &kctx) noexcept {
|
||||||
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
||||||
return readConfig<T>(ctx, TypeName);
|
return readConfig<T>(kctx, TypeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ox::Error writeConfig(keel::Context &ctx, ox::StringViewCR name, T const&data) noexcept {
|
ox::Error writeConfig(keel::Context &kctx, ox::StringViewCR name, T const&data) noexcept {
|
||||||
oxAssert(name != "", "Config type has no TypeName");
|
oxAssert(name != "", "Config type has no TypeName");
|
||||||
auto const path = ox::sfmt("/{}.json", detail::slashesToPct(name));
|
auto const path = ox::sfmt("/{}.json", detail::slashesToPct(name));
|
||||||
ox::PassThroughFS fs(configPath(ctx));
|
ox::PassThroughFS fs(configPath(kctx));
|
||||||
if (auto const err = fs.mkdir("/", true)) {
|
if (auto const err = fs.mkdir("/", true)) {
|
||||||
//oxErrf("Could not create config directory: {} - {}\n", path, toStr(err));
|
//oxErrf("Could not create config directory: {} - {}\n", path, toStr(err));
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
OX_REQUIRE_M(buff, ox::writeOC(data));
|
OX_REQUIRE_M(buff, ox::writeClaw(data, ox::ClawFormat::Organic));
|
||||||
*buff.back().value = '\n';
|
*buff.back().value = '\n';
|
||||||
if (auto const err = fs.write(path, buff.data(), buff.size())) {
|
if (auto const err = fs.write(path, buff.data(), buff.size())) {
|
||||||
//oxErrf("Could not read config file: {} - {}\n", path, toStr(err));
|
//oxErrf("Could not read config file: {} - {}\n", path, toStr(err));
|
||||||
return ox::Error(2, "Could not read config file");
|
return ox::Error{2, "Could not read config file"};
|
||||||
}
|
}
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
ox::Error writeConfig(keel::Context &ctx, T const&data) noexcept {
|
ox::Error writeConfig(keel::Context &kctx, T const&data) noexcept {
|
||||||
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
||||||
return writeConfig(ctx, TypeName, data);
|
return writeConfig(kctx, TypeName, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename Func>
|
template<typename T, typename Func>
|
||||||
void openConfig(keel::Context &ctx, ox::StringViewCR name, Func f) noexcept {
|
void openConfig(keel::Context &kctx, ox::StringViewCR name, Func f) noexcept {
|
||||||
oxAssert(name != "", "Config type has no TypeName");
|
oxAssert(name != "", "Config type has no TypeName");
|
||||||
auto const [c, err] = readConfig<T>(ctx, name);
|
auto const [c, err] = readConfig<T>(kctx, name);
|
||||||
oxLogError(err);
|
oxLogError(err);
|
||||||
f(c);
|
f(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename Func>
|
template<typename T, typename Func>
|
||||||
void openConfig(keel::Context &ctx, Func f) noexcept {
|
void openConfig(keel::Context &kctx, Func f) noexcept {
|
||||||
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
||||||
openConfig<T>(ctx, TypeName, f);
|
openConfig<T>(kctx, TypeName, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename Func>
|
template<typename T, typename Func>
|
||||||
void editConfig(keel::Context &ctx, ox::StringViewCR name, Func f) noexcept {
|
void editConfig(keel::Context &kctx, ox::StringViewCR name, Func f) noexcept {
|
||||||
oxAssert(name != "", "Config type has no TypeName");
|
oxAssert(name != "", "Config type has no TypeName");
|
||||||
auto [c, err] = readConfig<T>(ctx, name);
|
auto [c, err] = readConfig<T>(kctx, name);
|
||||||
oxLogError(err);
|
oxLogError(err);
|
||||||
f(c);
|
f(c);
|
||||||
oxLogError(writeConfig(ctx, name, c));
|
oxLogError(writeConfig(kctx, name, c));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename Func>
|
template<typename T, typename Func>
|
||||||
void editConfig(keel::Context &ctx, Func f) noexcept {
|
void editConfig(keel::Context &kctx, Func f) noexcept {
|
||||||
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
constexpr auto TypeName = ox::requireModelTypeName<T>();
|
||||||
editConfig<T>(ctx, TypeName, f);
|
editConfig<T>(kctx, TypeName, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Older config files didn't use ClawHeaders, so they can't
|
||||||
|
* use the normal conversion system.
|
||||||
|
* Functions like this shouldn't be necessary moving forward.
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
ox::Error headerizeConfigFile(keel::Context &kctx, ox::StringViewCR name = ox::ModelTypeName_v<T>) noexcept {
|
||||||
|
auto const path = ox::sfmt("/{}.json", name);
|
||||||
|
ox::PassThroughFS fs(configPath(kctx));
|
||||||
|
OX_REQUIRE_M(buff, fs.read(path));
|
||||||
|
OX_REQUIRE_M(cv1, ox::readOC<T>(buff));
|
||||||
|
OX_RETURN_ERROR(ox::writeClaw(cv1, ox::ClawFormat::Organic).moveTo(buff));
|
||||||
|
return fs.write(path, buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -275,6 +275,9 @@ void QuestionPopup::draw(Context &ctx) noexcept {
|
|||||||
ImGui::OpenPopup(m_title.c_str());
|
ImGui::OpenPopup(m_title.c_str());
|
||||||
m_stage = Stage::Open;
|
m_stage = Stage::Open;
|
||||||
m_open = true;
|
m_open = true;
|
||||||
|
// require extended refresh in case new contents require resize
|
||||||
|
// this can take around a second
|
||||||
|
turbine::requireRefreshFor(ctx.tctx, 1000);
|
||||||
[[fallthrough]];
|
[[fallthrough]];
|
||||||
case Stage::Open:
|
case Stage::Open:
|
||||||
centerNextWindow(ctx.tctx);
|
centerNextWindow(ctx.tctx);
|
||||||
|
@ -49,6 +49,19 @@ ox::Error setWindowBounds(Context &ctx, ox::Bounds const&bnds) noexcept;
|
|||||||
* @param ctx - Context
|
* @param ctx - Context
|
||||||
* @param ms - milliseconds
|
* @param ms - milliseconds
|
||||||
*/
|
*/
|
||||||
void setRefreshWithin(Context &ctx, int ms) noexcept;
|
void requireRefreshWithin(Context &ctx, int ms) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stimulates screen to draw for a period of a short period of
|
||||||
|
* time (168 ms on GLFW implementation).
|
||||||
|
* @param ctx - Context
|
||||||
|
*/
|
||||||
|
void requireRefresh(Context &ctx) noexcept;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stimulates screen to draw for a specified period of time.
|
||||||
|
* @param ctx - Context
|
||||||
|
*/
|
||||||
|
void requireRefreshFor(Context &ctx, int ms) noexcept;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -155,6 +155,10 @@ static ox::Result<IconData> toGlfwImgPixels(ox::SpanView<uint8_t> const &iconPng
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setMandatoryRefreshPeriod(Context &ctx, TimeMs const newVal) {
|
||||||
|
ctx.mandatoryRefreshPeriodEnd = ox::max(ctx.mandatoryRefreshPeriodEnd, newVal);
|
||||||
|
}
|
||||||
|
|
||||||
ox::Error setWindowIcon(Context &ctx, ox::SpanView<ox::SpanView<uint8_t>> const &iconPngs) noexcept {
|
ox::Error setWindowIcon(Context &ctx, ox::SpanView<ox::SpanView<uint8_t>> const &iconPngs) noexcept {
|
||||||
if constexpr(ox::defines::OS != ox::OS::Darwin) {
|
if constexpr(ox::defines::OS != ox::OS::Darwin) {
|
||||||
ox::Vector<IconData, 8> src;
|
ox::Vector<IconData, 8> src;
|
||||||
@ -216,10 +220,19 @@ ox::Error setWindowBounds(Context &ctx, ox::Bounds const&bnds) noexcept {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRefreshWithin(Context &ctx, int ms) noexcept {
|
void requireRefreshWithin(Context &ctx, int const ms) noexcept {
|
||||||
ctx.refreshWithinMs = ox::min(ms, ctx.refreshWithinMs);
|
ctx.refreshWithinMs = ox::min(ms, ctx.refreshWithinMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void requireRefresh(Context &ctx) noexcept {
|
||||||
|
setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + config::MandatoryRefreshPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
void requireRefreshFor(Context &ctx, int ms) noexcept {
|
||||||
|
ms = ox::max(0, ms);
|
||||||
|
setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + static_cast<TimeMs>(ms));
|
||||||
|
}
|
||||||
|
|
||||||
static void draw(Context &ctx) noexcept {
|
static void draw(Context &ctx) noexcept {
|
||||||
// draw start
|
// draw start
|
||||||
#if TURBINE_USE_IMGUI
|
#if TURBINE_USE_IMGUI
|
||||||
@ -288,12 +301,12 @@ static void handleGlfwCursorPosEvent(GLFWwindow*, double, double) noexcept {
|
|||||||
|
|
||||||
static void handleGlfwMouseButtonEvent(GLFWwindow *window, int, int, int) noexcept {
|
static void handleGlfwMouseButtonEvent(GLFWwindow *window, int, int, int) noexcept {
|
||||||
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
|
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
|
||||||
ctx.mandatoryRefreshPeriodEnd = ticksMs(ctx) + config::MandatoryRefreshPeriod;
|
setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + config::MandatoryRefreshPeriod);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handleGlfwKeyEvent(GLFWwindow *window, int const key, int, int const action, int) noexcept {
|
static void handleGlfwKeyEvent(GLFWwindow *window, int const key, int, int const action, int) noexcept {
|
||||||
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
|
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
|
||||||
ctx.mandatoryRefreshPeriodEnd = ticksMs(ctx) + config::MandatoryRefreshPeriod;
|
setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + config::MandatoryRefreshPeriod);
|
||||||
if (action == GLFW_PRESS) {
|
if (action == GLFW_PRESS) {
|
||||||
handleKeyPress(ctx, key, true);
|
handleKeyPress(ctx, key, true);
|
||||||
} else if (action == GLFW_RELEASE) {
|
} else if (action == GLFW_RELEASE) {
|
||||||
@ -303,7 +316,7 @@ static void handleGlfwKeyEvent(GLFWwindow *window, int const key, int, int const
|
|||||||
|
|
||||||
static void handleGlfwWindowCloseEvent(GLFWwindow *window) noexcept {
|
static void handleGlfwWindowCloseEvent(GLFWwindow *window) noexcept {
|
||||||
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
|
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
|
||||||
ctx.mandatoryRefreshPeriodEnd = ticksMs(ctx) + config::MandatoryRefreshPeriod;
|
setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + config::MandatoryRefreshPeriod);
|
||||||
ctx.running = ctx.shutdownHandler ? !ctx.shutdownHandler(ctx) : false;
|
ctx.running = ctx.shutdownHandler ? !ctx.shutdownHandler(ctx) : false;
|
||||||
glfwSetWindowShouldClose(window, !ctx.running);
|
glfwSetWindowShouldClose(window, !ctx.running);
|
||||||
glfwPostEmptyEvent();
|
glfwPostEmptyEvent();
|
||||||
@ -316,7 +329,7 @@ ox::Result<ox::UPtr<Context>> init(
|
|||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
ctx->startTime = static_cast<TimeMs>(
|
ctx->startTime = static_cast<TimeMs>(
|
||||||
duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count());
|
duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count());
|
||||||
ctx->mandatoryRefreshPeriodEnd = ticksMs(*ctx) + config::MandatoryRefreshPeriod;
|
setMandatoryRefreshPeriod(*ctx, ticksMs(*ctx) + config::MandatoryRefreshPeriod);
|
||||||
// init GLFW context
|
// init GLFW context
|
||||||
glfwInit();
|
glfwInit();
|
||||||
glfwSetErrorCallback(handleGlfwError);
|
glfwSetErrorCallback(handleGlfwError);
|
||||||
|
@ -48,7 +48,7 @@ void WorldEditorView::draw(ox::Size const&targetSz) noexcept {
|
|||||||
if (m_animateWorld) {
|
if (m_animateWorld) {
|
||||||
auto const wakeUp = m_world.update();
|
auto const wakeUp = m_world.update();
|
||||||
if (wakeUp.ok()) {
|
if (wakeUp.ok()) {
|
||||||
turbine::setRefreshWithin(m_sctx.tctx, wakeUp.value);
|
turbine::requireRefreshWithin(m_sctx.tctx, wakeUp.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ngfx::gl::draw(*m_nctx, m_scale);
|
ngfx::gl::draw(*m_nctx, m_scale);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user