[turbine,studio] Make Studio confirm with user before closing app if any unsaved changes
All checks were successful
Build / build (push) Successful in 1m15s

This commit is contained in:
2025-05-01 23:15:06 -05:00
parent 4770bb6a93
commit e5dd448fe7
9 changed files with 70 additions and 21 deletions

View File

@ -19,8 +19,6 @@ class Context;
void safeDelete(Context *p);
void shutdown(Context &ctx) noexcept;
keel::Context const&keelCtx(Context const&ctx) noexcept;
keel::Context &keelCtx(Context &ctx) noexcept;

View File

@ -29,4 +29,8 @@ TimeMs ticksMs(Context const&ctx) noexcept;
void requestShutdown(Context &ctx) noexcept;
using ShutdownHandler = bool (*)(Context&);
void setShutdownHandler(Context &ctx, ShutdownHandler handler) noexcept;
}

View File

@ -12,7 +12,7 @@
namespace turbine {
class Context {
class Context final {
public:
UpdateHandler updateHandler = [](Context&) -> int {return 0;};
keel::Context keelCtx;
@ -27,10 +27,6 @@ class Context {
Context(Context const&other) noexcept = delete;
Context(Context const&&other) noexcept = delete;
virtual inline ~Context() noexcept {
shutdown(*this);
}
};
}

View File

@ -86,4 +86,7 @@ void requestShutdown(Context &ctx) noexcept {
ctx.running = false;
}
void setShutdownHandler(Context&, ShutdownHandler) noexcept {
}
}

View File

@ -30,6 +30,8 @@ class Context {
uint64_t keysDown = 0;
uint64_t prevFpsCheckTime = 0;
uint64_t draws = 0;
bool running{};
ShutdownHandler shutdownHandler{};
Context() noexcept = default;

View File

@ -68,9 +68,21 @@ static void tickFps(Context &ctx, uint64_t const nowMs) noexcept {
}
}
static void shutdown(Context &ctx) noexcept {
if (ctx.window) {
#if TURBINE_USE_IMGUI
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
#endif
glfwDestroyWindow(ctx.window);
ctx.window = nullptr;
}
}
ox::Error run(Context &ctx) noexcept {
uint64_t sleepTime = 0;
while (!glfwWindowShouldClose(ctx.window)) {
ctx.running = true;
while (ctx.running) {
ctx.refreshWithinMs = 10 * 1000; // refresh within 10 seconds
glfwPollEvents();
auto const ticks = ticksMs(ctx);
@ -92,22 +104,17 @@ ox::Error run(Context &ctx) noexcept {
if (realSleepTime && ctx.mandatoryRefreshPeriodEnd <= ticks) {
glfwWaitEventsTimeout(static_cast<double>(realSleepTime) / 1000);
}
if (glfwWindowShouldClose(ctx.window)) {
if (ctx.shutdownHandler(ctx)) {
break;
}
glfwSetWindowShouldClose(ctx.window, false);
}
}
shutdown(ctx);
return {};
}
void shutdown(Context &ctx) noexcept {
if (ctx.window) {
#if TURBINE_USE_IMGUI
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
#endif
glfwDestroyWindow(ctx.window);
ctx.window = nullptr;
}
}
TimeMs ticksMs(Context const&ctx) noexcept {
using namespace std::chrono;
auto const now = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
@ -119,7 +126,11 @@ bool buttonDown(Context const&ctx, Key const key) noexcept {
}
void requestShutdown(Context &ctx) noexcept {
glfwSetWindowShouldClose(ctx.window, true);
ctx.running = false;
}
void setShutdownHandler(Context &ctx, ShutdownHandler const handler) noexcept {
ctx.shutdownHandler = handler;
}
}