80 lines
2.0 KiB
C++
80 lines
2.0 KiB
C++
/*
|
|
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
|
|
*/
|
|
|
|
#include <ctime>
|
|
|
|
#include <ox/logconn/logconn.hpp>
|
|
#include <ox/std/trace.hpp>
|
|
#include <ox/std/uuid.hpp>
|
|
#include <keel/media.hpp>
|
|
#include <turbine/turbine.hpp>
|
|
|
|
#include <studio/context.hpp>
|
|
#include "studioui.hpp"
|
|
|
|
namespace studio {
|
|
|
|
class StudioUIDrawer: public turbine::gl::Drawer {
|
|
private:
|
|
StudioUI &m_ui;
|
|
public:
|
|
explicit StudioUIDrawer(StudioUI &ui) noexcept: m_ui(ui) {
|
|
}
|
|
protected:
|
|
void draw(turbine::Context&) noexcept final {
|
|
m_ui.draw();
|
|
}
|
|
};
|
|
|
|
static void keyEventHandler(turbine::Context &ctx, turbine::Key key, bool down) noexcept {
|
|
auto sctx = turbine::applicationData<studio::StudioContext>(ctx);
|
|
sctx->ui.handleKeyEvent(key, down);
|
|
}
|
|
|
|
[[nodiscard]]
|
|
ox::Vector<ox::SpanView<uint8_t>> WindowIcons() noexcept;
|
|
|
|
static ox::Error runApp(
|
|
ox::StringViewCR appName,
|
|
ox::StringViewCR projectDataDir,
|
|
ox::UPtr<ox::FileSystem> &&fs) noexcept {
|
|
OX_REQUIRE_M(ctx, turbine::init(std::move(fs), appName));
|
|
oxLogError(turbine::setWindowIcon(*ctx, WindowIcons()));
|
|
turbine::setWindowTitle(*ctx, keelCtx(*ctx).appName);
|
|
turbine::setKeyEventHandler(*ctx, keyEventHandler);
|
|
turbine::setRefreshWithin(*ctx, 0);
|
|
StudioUI ui(*ctx, projectDataDir);
|
|
StudioUIDrawer drawer(ui);
|
|
turbine::gl::addDrawer(*ctx, &drawer);
|
|
auto const err = turbine::run(*ctx);
|
|
turbine::gl::removeDrawer(*ctx, &drawer);
|
|
return err;
|
|
}
|
|
|
|
static ox::Error run(
|
|
ox::StringViewCR appName,
|
|
ox::StringViewCR projectDataDir,
|
|
ox::SpanView<const char*>) {
|
|
// seed UUID generator
|
|
auto const time = std::time(nullptr);
|
|
ox::UUID::seedGenerator({
|
|
static_cast<uint64_t>(time),
|
|
static_cast<uint64_t>(time << 1)
|
|
});
|
|
// run app
|
|
auto const err = runApp(appName, projectDataDir, ox::UPtr<ox::FileSystem>{});
|
|
oxAssert(err, "Something went wrong...");
|
|
return err;
|
|
}
|
|
|
|
}
|
|
|
|
ox::Error run(
|
|
ox::StringView project,
|
|
ox::StringView appName,
|
|
ox::StringView projectDataDir,
|
|
ox::SpanView<ox::CString> args) noexcept {
|
|
return studio::run(ox::sfmt("{} {}", project, appName), projectDataDir, args);
|
|
}
|