Squashed 'deps/nostalgia/' changes from 04f3d6b4..6a523191
6a523191 [turbine] Cleanup applicationData 205f2a69 [turbine] Fix applicationData to properly return null 82f02896 [turbine] Cleanup type safety code for application data aa43cb3d [turbine] Add some type safety to application data 05d08a76 Merge commit 'd6403991d49292d4f2b7d441636949472ca2b249' c6750d50 [studio/modlib] Add ig::ChildStackItem dade484d [olympic/studio] Make StudioContext::ui a ref instead of ptr b015fe88 [ox/std] Make ranges predicates const refs git-subtree-dir: deps/nostalgia git-subtree-split: 6a523191561cf76db3d734e42199aaae0af7d21b
This commit is contained in:
parent
d6403991d4
commit
5627a63572
4
deps/ox/src/ox/std/ranges.hpp
vendored
4
deps/ox/src/ox/std/ranges.hpp
vendored
@ -11,7 +11,7 @@
|
|||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr bool all_of(auto begin, auto end, auto pred) noexcept {
|
constexpr bool all_of(auto begin, auto end, auto const&pred) noexcept {
|
||||||
while (begin != end) {
|
while (begin != end) {
|
||||||
if (!pred(*begin)) {
|
if (!pred(*begin)) {
|
||||||
return false;
|
return false;
|
||||||
@ -22,7 +22,7 @@ constexpr bool all_of(auto begin, auto end, auto pred) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr bool any_of(auto begin, auto end, auto pred) noexcept {
|
constexpr bool any_of(auto begin, auto end, auto const&pred) noexcept {
|
||||||
while (begin != end) {
|
while (begin != end) {
|
||||||
if (pred(*begin)) {
|
if (pred(*begin)) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -30,13 +30,13 @@ class StudioUIDrawer: public turbine::gl::Drawer {
|
|||||||
|
|
||||||
static int updateHandler(turbine::Context &ctx) noexcept {
|
static int updateHandler(turbine::Context &ctx) noexcept {
|
||||||
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
|
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
|
||||||
sctx->ui->update();
|
sctx->ui.update();
|
||||||
return 16;
|
return 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyEventHandler(turbine::Context &ctx, turbine::Key key, bool down) noexcept {
|
static void keyEventHandler(turbine::Context &ctx, turbine::Key key, bool down) noexcept {
|
||||||
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
|
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
|
||||||
sctx->ui->handleKeyEvent(key, down);
|
sctx->ui.handleKeyEvent(key, down);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ox::Error runApp(
|
static ox::Error runApp(
|
||||||
@ -48,10 +48,7 @@ static ox::Error runApp(
|
|||||||
turbine::setUpdateHandler(*ctx, updateHandler);
|
turbine::setUpdateHandler(*ctx, updateHandler);
|
||||||
turbine::setKeyEventHandler(*ctx, keyEventHandler);
|
turbine::setKeyEventHandler(*ctx, keyEventHandler);
|
||||||
turbine::setConstantRefresh(*ctx, false);
|
turbine::setConstantRefresh(*ctx, false);
|
||||||
studio::StudioContext studioCtx(*ctx);
|
StudioUI ui(*ctx, projectDataDir);
|
||||||
turbine::setApplicationData(*ctx, &studioCtx);
|
|
||||||
StudioUI ui(studioCtx, projectDataDir);
|
|
||||||
studioCtx.ui = &ui;
|
|
||||||
StudioUIDrawer drawer(ui);
|
StudioUIDrawer drawer(ui);
|
||||||
turbine::gl::addDrawer(*ctx, &drawer);
|
turbine::gl::addDrawer(*ctx, &drawer);
|
||||||
auto const err = turbine::run(*ctx);
|
auto const err = turbine::run(*ctx);
|
||||||
|
@ -10,8 +10,11 @@
|
|||||||
|
|
||||||
namespace studio {
|
namespace studio {
|
||||||
|
|
||||||
static ox::Result<ox::UniquePtr<ProjectTreeModel>>
|
static ox::Result<ox::UniquePtr<ProjectTreeModel>> buildProjectTreeModel(
|
||||||
buildProjectTreeModel(ProjectExplorer &explorer, ox::StringView name, ox::CRStringView path, ProjectTreeModel *parent) noexcept {
|
ProjectExplorer &explorer,
|
||||||
|
ox::StringView name,
|
||||||
|
ox::StringView path,
|
||||||
|
ProjectTreeModel *parent) noexcept {
|
||||||
auto const fs = explorer.romFs();
|
auto const fs = explorer.romFs();
|
||||||
oxRequire(stat, fs->stat(path));
|
oxRequire(stat, fs->stat(path));
|
||||||
auto out = ox::make_unique<ProjectTreeModel>(explorer, ox::String(name), parent);
|
auto out = ox::make_unique<ProjectTreeModel>(explorer, ox::String(name), parent);
|
||||||
|
@ -40,13 +40,14 @@ oxModelBegin(StudioConfig)
|
|||||||
oxModelFieldRename(showProjectExplorer, show_project_explorer)
|
oxModelFieldRename(showProjectExplorer, show_project_explorer)
|
||||||
oxModelEnd()
|
oxModelEnd()
|
||||||
|
|
||||||
StudioUI::StudioUI(studio::StudioContext &ctx, ox::StringView projectDataDir) noexcept:
|
StudioUI::StudioUI(turbine::Context &ctx, ox::StringView projectDataDir) noexcept:
|
||||||
m_sctx(ctx),
|
m_sctx(*this, ctx),
|
||||||
m_ctx(ctx.tctx),
|
m_ctx(ctx),
|
||||||
m_projectDataDir(projectDataDir),
|
m_projectDataDir(projectDataDir),
|
||||||
m_projectExplorer(m_ctx),
|
m_projectExplorer(m_ctx),
|
||||||
m_newProject(ox::String(projectDataDir)),
|
m_newProject(ox::String(projectDataDir)),
|
||||||
m_aboutPopup(m_ctx) {
|
m_aboutPopup(m_ctx) {
|
||||||
|
turbine::setApplicationData(m_ctx, &m_sctx);
|
||||||
m_projectExplorer.fileChosen.connect(this, &StudioUI::openFile);
|
m_projectExplorer.fileChosen.connect(this, &StudioUI::openFile);
|
||||||
m_newProject.finished.connect(this, &StudioUI::createOpenProject);
|
m_newProject.finished.connect(this, &StudioUI::createOpenProject);
|
||||||
m_newMenu.finished.connect(this, &StudioUI::openFile);
|
m_newMenu.finished.connect(this, &StudioUI::openFile);
|
||||||
|
@ -24,7 +24,7 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
friend class StudioUIDrawer;
|
friend class StudioUIDrawer;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
studio::StudioContext &m_sctx;
|
studio::StudioContext m_sctx;
|
||||||
turbine::Context &m_ctx;
|
turbine::Context &m_ctx;
|
||||||
ox::String m_projectDataDir;
|
ox::String m_projectDataDir;
|
||||||
ox::UPtr<studio::Project> m_project;
|
ox::UPtr<studio::Project> m_project;
|
||||||
@ -48,7 +48,7 @@ class StudioUI: public ox::SignalHandler {
|
|||||||
bool m_showProjectExplorer = true;
|
bool m_showProjectExplorer = true;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit StudioUI(studio::StudioContext &ctx, ox::StringView projectDataDir) noexcept;
|
explicit StudioUI(turbine::Context &ctx, ox::StringView projectDataDir) noexcept;
|
||||||
|
|
||||||
void update() noexcept;
|
void update() noexcept;
|
||||||
|
|
||||||
|
@ -12,11 +12,14 @@
|
|||||||
|
|
||||||
namespace studio {
|
namespace studio {
|
||||||
|
|
||||||
|
class StudioUI;
|
||||||
|
|
||||||
struct StudioContext {
|
struct StudioContext {
|
||||||
class StudioUI *ui = nullptr;
|
StudioUI &ui;
|
||||||
Project *project = nullptr;
|
Project *project = nullptr;
|
||||||
turbine::Context &tctx;
|
turbine::Context &tctx;
|
||||||
inline explicit StudioContext(turbine::Context &pTctx) noexcept: tctx(pTctx) {}
|
inline StudioContext(StudioUI &pUi, turbine::Context &pTctx) noexcept:
|
||||||
|
ui(pUi), tctx(pTctx) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,12 @@ namespace studio::ig {
|
|||||||
|
|
||||||
inline constexpr auto BtnSz = ImVec2{52, 22};
|
inline constexpr auto BtnSz = ImVec2{52, 22};
|
||||||
|
|
||||||
|
class ChildStackItem {
|
||||||
|
public:
|
||||||
|
explicit ChildStackItem(ox::CStringView id, ImVec2 const&sz = {}) noexcept;
|
||||||
|
~ChildStackItem() noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
class IDStackItem {
|
class IDStackItem {
|
||||||
public:
|
public:
|
||||||
explicit IDStackItem(int id) noexcept;
|
explicit IDStackItem(int id) noexcept;
|
||||||
@ -98,4 +104,4 @@ class FilePicker {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,14 @@
|
|||||||
|
|
||||||
namespace studio::ig {
|
namespace studio::ig {
|
||||||
|
|
||||||
|
ChildStackItem::ChildStackItem(ox::CStringView id, ImVec2 const&sz) noexcept {
|
||||||
|
ImGui::BeginChild(id.c_str(), sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChildStackItem::~ChildStackItem() noexcept {
|
||||||
|
ImGui::EndChild();
|
||||||
|
}
|
||||||
|
|
||||||
IDStackItem::IDStackItem(int id) noexcept {
|
IDStackItem::IDStackItem(int id) noexcept {
|
||||||
ImGui::PushID(id);
|
ImGui::PushID(id);
|
||||||
}
|
}
|
||||||
|
@ -37,15 +37,78 @@ inline ox::FileSystem *rom(Context &ctx) noexcept {
|
|||||||
return keelCtx(ctx).rom.get();
|
return keelCtx(ctx).rom.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void setApplicationData(Context &ctx, void *applicationData) noexcept;
|
struct WrapBase {
|
||||||
|
virtual ~WrapBase() = default;
|
||||||
|
virtual WrapBase *copyTo(ox::Span<char> s) noexcept = 0;
|
||||||
|
virtual operator bool() const noexcept = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
struct Wrap: public WrapBase {
|
||||||
|
T *data{};
|
||||||
|
Wrap(T *pData) noexcept: data(pData) {
|
||||||
|
}
|
||||||
|
WrapBase *copyTo(ox::Span<char> s) noexcept override {
|
||||||
|
oxAssert(s.size() >= sizeof(Wrap), "too small buffer");
|
||||||
|
return new(s.data()) Wrap{data};
|
||||||
|
}
|
||||||
|
operator bool() const noexcept override {
|
||||||
|
return data != nullptr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class WrapPtr {
|
||||||
|
private:
|
||||||
|
WrapBase *m_wrapPtr{};
|
||||||
|
ox::Array<char, sizeof(Wrap<void*>)> m_wrapData;
|
||||||
|
public:
|
||||||
|
template<typename T>
|
||||||
|
inline WrapPtr &operator=(T *ptr) noexcept {
|
||||||
|
m_wrapPtr = new(m_wrapData.data()) Wrap(ptr);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
inline WrapPtr &operator=(WrapBase &ptr) noexcept {
|
||||||
|
if (ptr) {
|
||||||
|
m_wrapPtr = ptr.copyTo(m_wrapData);
|
||||||
|
} else {
|
||||||
|
m_wrapPtr = nullptr;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
inline operator bool() const noexcept {
|
||||||
|
return m_wrapPtr && *m_wrapPtr;
|
||||||
|
}
|
||||||
|
[[nodiscard]]
|
||||||
|
inline WrapBase *getWrapBase() const noexcept {
|
||||||
|
return m_wrapPtr;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void setApplicationData(Context &ctx, T *applicationData) noexcept {
|
||||||
|
Wrap w(applicationData);
|
||||||
|
setApplicationDataRaw(ctx, w);
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
void *applicationDataRaw(Context &ctx) noexcept;
|
WrapBase *applicationDataRaw(Context &ctx) noexcept;
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
T *applicationData(Context &ctx) noexcept {
|
T *applicationData(Context &ctx) noexcept {
|
||||||
return static_cast<T*>(applicationDataRaw(ctx));
|
auto const raw = applicationDataRaw(ctx);
|
||||||
|
if (!raw) [[unlikely]] {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
#ifdef OX_BARE_METAL
|
||||||
|
auto const out = static_cast<Wrap<T>*>(raw);
|
||||||
|
#else
|
||||||
|
auto const out = dynamic_cast<Wrap<T>*>(raw);
|
||||||
|
#endif
|
||||||
|
oxAssert(out, "Cast failed - wrong type");
|
||||||
|
return out->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept;
|
void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept;
|
||||||
|
@ -18,12 +18,12 @@ keel::Context &keelCtx(Context &ctx) noexcept {
|
|||||||
return ctx.keelCtx;
|
return ctx.keelCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setApplicationData(Context &ctx, void *applicationData) noexcept {
|
void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept {
|
||||||
ctx.applicationData = applicationData;
|
ctx.applicationData = applicationData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *applicationDataRaw(Context &ctx) noexcept {
|
WrapBase *applicationDataRaw(Context &ctx) noexcept {
|
||||||
return ctx.applicationData;
|
return ctx.applicationData.getWrapBase();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ class Context {
|
|||||||
UpdateHandler updateHandler = [](Context&) -> int {return 0;};
|
UpdateHandler updateHandler = [](Context&) -> int {return 0;};
|
||||||
keel::Context keelCtx;
|
keel::Context keelCtx;
|
||||||
KeyEventHandler keyEventHandler = nullptr;
|
KeyEventHandler keyEventHandler = nullptr;
|
||||||
void *applicationData = nullptr;
|
WrapPtr applicationData;
|
||||||
|
|
||||||
// GBA impl data /////////////////////////////////////////////////////////
|
// GBA impl data /////////////////////////////////////////////////////////
|
||||||
bool running = true;
|
bool running = true;
|
||||||
|
@ -20,12 +20,12 @@ keel::Context &keelCtx(Context &ctx) noexcept {
|
|||||||
return ctx.keelCtx;
|
return ctx.keelCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setApplicationData(Context &ctx, void *applicationData) noexcept {
|
void setApplicationDataRaw(Context &ctx, WrapBase &applicationData) noexcept {
|
||||||
ctx.applicationData = applicationData;
|
ctx.applicationData = applicationData;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *applicationDataRaw(Context &ctx) noexcept {
|
WrapBase *applicationDataRaw(Context &ctx) noexcept {
|
||||||
return ctx.applicationData;
|
return ctx.applicationData.getWrapBase();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ class Context {
|
|||||||
UpdateHandler updateHandler = [](Context&) -> int {return 0;};
|
UpdateHandler updateHandler = [](Context&) -> int {return 0;};
|
||||||
keel::Context keelCtx;
|
keel::Context keelCtx;
|
||||||
KeyEventHandler keyEventHandler = nullptr;
|
KeyEventHandler keyEventHandler = nullptr;
|
||||||
void *applicationData = nullptr;
|
WrapPtr applicationData;
|
||||||
|
|
||||||
// GLFW impl data ////////////////////////////////////////////////////////
|
// GLFW impl data ////////////////////////////////////////////////////////
|
||||||
int uninterruptedRefreshes = 3;
|
int uninterruptedRefreshes = 3;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user