Compare commits

..

2 Commits

Author SHA1 Message Date
1ed9949bf3 save work
All checks were successful
Build / build (push) Successful in 1m17s
2025-06-20 00:03:33 -05:00
9d5915d54a [studio] Add Back/Forward navigation 2025-06-20 00:03:31 -05:00
23 changed files with 54 additions and 148 deletions

View File

@@ -104,16 +104,13 @@ constexpr ox::Result<int> strToInt(StringViewCR str) noexcept {
OX_ALLOW_UNSAFE_BUFFERS_BEGIN OX_ALLOW_UNSAFE_BUFFERS_BEGIN
int total = 0; int total = 0;
int multiplier = 1; int multiplier = 1;
if (str.len() == 0) [[unlikely]] {
return Error{1, "Empty string passed to strToInt"};
}
for (auto i = static_cast<int64_t>(str.len()) - 1; i != -1; --i) { for (auto i = static_cast<int64_t>(str.len()) - 1; i != -1; --i) {
auto s = static_cast<std::size_t>(i); auto s = static_cast<std::size_t>(i);
if (str[s] >= '0' && str[s] <= '9') { if (str[s] >= '0' && str[s] <= '9') {
total += (str[s] - '0') * multiplier; total += (str[s] - '0') * multiplier;
multiplier *= 10; multiplier *= 10;
} else { } else {
return ox::Error{1}; return ox::Error(1);
} }
} }
return total; return total;

View File

@@ -1,19 +1,16 @@
# d2025.06.0 # d2025.06.0
* Add ability to remember recent projects in config * Add ability to remember recent projects in config
* Add navigation support (back and forward)
* Fix file deletion to close file even if not active * Fix file deletion to close file even if not active
* Fix file copy to work when creating a copy with the name of a previously
deleted file
* Fix crash that could occur after switching projects
* Make file picker popup accept on double click of a file
* TileSheetEditor: Fix copy/cut/paste enablement when there is no selection
* TileSheetEditor: Fix manual redo of draw actions, fix drawing to pixel 0, 0
as first action
* TileSheetEditor: Fix draw command to work on same pixel after switching
subsheets
* PaletteEditor: Add RGB key shortcuts for focusing color channels * PaletteEditor: Add RGB key shortcuts for focusing color channels
* PaletteEditor: Add color preview to color editor * PaletteEditor: Add color preview to color editor
* PaletteEditor: Make RGB key shortcuts work when color channel inputs are
focused
# d2025.05.2
* TileSheetEditor: Fix manual redo of draw actions, fix drawing to pixel 0, 0 as first action (cce5f52f96511694afd98f0b9b6b1f19c06ecd20)
* TileSheetEditor: Fix draw command to work on same pixel after switching subsheets (514cb978351ee4b0a5335c22a506a6d9f608f0a7)
# d2025.05.1 # d2025.05.1

View File

@@ -13,7 +13,7 @@ AddSubSheetCommand::AddSubSheetCommand(
auto &parent = getSubSheet(m_img, m_parentIdx); auto &parent = getSubSheet(m_img, m_parentIdx);
if (!parent.subsheets.empty()) { if (!parent.subsheets.empty()) {
auto idx = m_parentIdx; auto idx = m_parentIdx;
idx.emplace_back(static_cast<uint32_t>(parent.subsheets.size())); idx.emplace_back(parent.subsheets.size());
m_addedSheets.push_back(idx); m_addedSheets.push_back(idx);
} else { } else {
auto idx = m_parentIdx; auto idx = m_parentIdx;

View File

@@ -192,9 +192,6 @@ void TileSheetEditorImGui::keyStateChanged(turbine::Key const key, bool const do
} }
void TileSheetEditorImGui::draw(studio::Context&) noexcept { void TileSheetEditorImGui::draw(studio::Context&) noexcept {
setCopyEnabled(m_model.hasSelection());
setCutEnabled(m_model.hasSelection());
setPasteEnabled(m_model.hasSelection());
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)) {
@@ -279,7 +276,7 @@ void TileSheetEditorImGui::draw(studio::Context&) noexcept {
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(static_cast<uint32_t>(parent.subsheets.size() - 1)); insertOnIdx.emplace_back(parent.subsheets.size() - 1);
setActiveSubsheet(insertOnIdx); setActiveSubsheet(insertOnIdx);
} }
ImGui::SameLine(); ImGui::SameLine();

View File

@@ -315,10 +315,6 @@ void TileSheetEditorModel::clearSelection() noexcept {
m_selection.reset(); m_selection.reset();
} }
bool TileSheetEditorModel::hasSelection() const noexcept {
return m_selection.has_value();
}
bool TileSheetEditorModel::updated() const noexcept { bool TileSheetEditorModel::updated() const noexcept {
return m_updated; return m_updated;
} }

View File

@@ -118,9 +118,6 @@ class TileSheetEditorModel final: public ox::SignalHandler {
void clearSelection() noexcept; void clearSelection() noexcept;
[[nodiscard]]
bool hasSelection() const noexcept;
[[nodiscard]] [[nodiscard]]
bool updated() const noexcept; bool updated() const noexcept;

View File

@@ -15,7 +15,7 @@ target_link_libraries(
target_compile_definitions( target_compile_definitions(
NostalgiaStudio PUBLIC NostalgiaStudio PUBLIC
OLYMPIC_APP_VERSION="d2025.06.0" OLYMPIC_APP_VERSION="dev build"
) )
install( install(

View File

@@ -18,7 +18,7 @@
<string>APPL</string> <string>APPL</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>d2025.06.0</string> <string>dev build</string>
<key>LSMinimumSystemVersion</key> <key>LSMinimumSystemVersion</key>
<string>12.0.0</string> <string>12.0.0</string>

View File

@@ -28,15 +28,10 @@ class StudioUIDrawer: public turbine::gl::Drawer {
}; };
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 const sctx = turbine::applicationData<studio::Context>(ctx); auto sctx = turbine::applicationData<studio::Context>(ctx);
sctx->ui.handleKeyEvent(key, down); sctx->ui.handleKeyEvent(key, down);
} }
static void mouseButtonEventHandler(turbine::Context &ctx, int const btn, bool const down) noexcept {
auto const sctx = turbine::applicationData<studio::Context>(ctx);
sctx->ui.handleMouseButtonEvent(btn, down);
}
[[nodiscard]] [[nodiscard]]
ox::Vector<ox::SpanView<uint8_t>> WindowIcons() noexcept; ox::Vector<ox::SpanView<uint8_t>> WindowIcons() noexcept;
@@ -48,7 +43,6 @@ 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::setMouseButtonEventHandler(*ctx, mouseButtonEventHandler);
turbine::requireRefreshWithin(*ctx, 0); turbine::requireRefreshWithin(*ctx, 0);
StudioUI ui(*ctx, projectDataDir); StudioUI ui(*ctx, projectDataDir);
StudioUIDrawer drawer(ui); StudioUIDrawer drawer(ui);

View File

@@ -80,9 +80,9 @@ void NewMenu::addItemMaker(ox::UPtr<ItemMaker> &&im) noexcept {
}); });
} }
void NewMenu::installItemTemplate(ox::UPtr<ItemTemplate> &&tmplt) noexcept { void NewMenu::installItemTemplate(ox::UPtr<ItemTemplate> &tmplt) noexcept {
for (auto const&im : m_types) { for (auto const&im : m_types) {
if (im->installTemplate(std::move(tmplt))) { if (im->installTemplate(tmplt)) {
break; break;
} }
} }

View File

@@ -72,7 +72,7 @@ class NewMenu final: public Popup {
void addItemMaker(ox::UPtr<ItemMaker> &&im) noexcept; void addItemMaker(ox::UPtr<ItemMaker> &&im) noexcept;
void installItemTemplate(ox::UPtr<ItemTemplate> &&tmplt) noexcept; void installItemTemplate(ox::UPtr<ItemTemplate> &tmplt) noexcept;
private: private:
void drawNewItemType(Context const&sctx) noexcept; void drawNewItemType(Context const&sctx) noexcept;

View File

@@ -177,16 +177,6 @@ void StudioUI::handleKeyEvent(turbine::Key const key, bool const down) noexcept
} }
} }
void StudioUI::handleMouseButtonEvent(int const btn, bool const down) noexcept {
if (down) {
if (btn == 3) { // back button
navigateBack(m_sctx);
} else if (btn == 4) { // forward button
navigateForward(m_sctx);
}
}
}
void StudioUI::handleNavigationChange(ox::StringParam path, ox::StringParam navArgs) noexcept { void StudioUI::handleNavigationChange(ox::StringParam path, ox::StringParam navArgs) noexcept {
m_navAction.emplace(std::move(path), std::move(navArgs)); m_navAction.emplace(std::move(path), std::move(navArgs));
} }
@@ -312,13 +302,11 @@ void StudioUI::drawMenu() noexcept {
ImGui::EndMenu(); ImGui::EndMenu();
} }
if (ImGui::BeginMenu("Navigate")) { if (ImGui::BeginMenu("Navigate")) {
constexpr auto backShortcut = ox::defines::OS == ox::OS::Darwin ? "Cmd+[" : "Alt+Left Arrow"; if (ImGui::MenuItem("Back", STUDIO_CTRL "+{", false, m_sctx.navIdx > 1)) {
constexpr auto fwdShortcut = ox::defines::OS == ox::OS::Darwin ? "Cmd+]" : "Alt+Right Arrow";
if (ImGui::MenuItem("Back", backShortcut, false, m_sctx.navIdx > 1)) {
navigateBack(m_sctx); navigateBack(m_sctx);
} }
if (ImGui::MenuItem( if (ImGui::MenuItem(
"Forward", fwdShortcut, false, "Forward", STUDIO_CTRL "+}", false,
m_sctx.navIdx < m_sctx.navStack.size())) { m_sctx.navIdx < m_sctx.navStack.size())) {
navigateForward(m_sctx); navigateForward(m_sctx);
} }
@@ -419,6 +407,10 @@ void StudioUI::drawTabs() noexcept {
if (!openFile(m_navAction->path)) { if (!openFile(m_navAction->path)) {
m_activeEditor->navigateTo(m_navAction->args); m_activeEditor->navigateTo(m_navAction->args);
m_navAction.reset(); m_navAction.reset();
} else {
//auto const i = m_sctx.navIdx - 1;
//oxDebugf("deleting {}", m_sctx.navStack[i].filePath);
//std::ignore = m_sctx.navStack.erase(i);
} }
} }
} }
@@ -438,7 +430,7 @@ void StudioUI::loadModule(Module const &mod) noexcept {
} }
auto tmplts = mod.itemTemplates(m_sctx); auto tmplts = mod.itemTemplates(m_sctx);
for (auto &t : tmplts) { for (auto &t : tmplts) {
m_newMenu.installItemTemplate(std::move(t)); m_newMenu.installItemTemplate(t);
} }
} }
@@ -649,9 +641,6 @@ ox::Error StudioUI::openProjectPath(ox::StringParam path) noexcept {
ox::make_unique_catch<Project>(keelCtx(m_tctx), std::move(path), m_projectDataDir) ox::make_unique_catch<Project>(keelCtx(m_tctx), std::move(path), m_projectDataDir)
.moveTo(m_project)); .moveTo(m_project));
m_sctx.project = m_project.get(); m_sctx.project = m_project.get();
m_activeEditor = nullptr;
m_activeEditorOnLastDraw = nullptr;
m_activeEditorUpdatePending = nullptr;
turbine::setWindowTitle( turbine::setWindowTitle(
m_tctx, ox::sfmt("{} - {}", keelCtx(m_tctx).appName, m_project->projectPath())); m_tctx, ox::sfmt("{} - {}", keelCtx(m_tctx).appName, m_project->projectPath()));
m_deleteConfirmation.deleteFile.connect(m_sctx.project, &Project::deleteItem); m_deleteConfirmation.deleteFile.connect(m_sctx.project, &Project::deleteItem);

View File

@@ -87,8 +87,6 @@ class StudioUI final: public ox::SignalHandler {
void handleKeyEvent(turbine::Key, bool down) noexcept; void handleKeyEvent(turbine::Key, bool down) noexcept;
void handleMouseButtonEvent(int btn, bool down) noexcept;
void handleNavigationChange(ox::StringParam path, ox::StringParam navArgs) noexcept; void handleNavigationChange(ox::StringParam path, ox::StringParam navArgs) noexcept;
[[nodiscard]] [[nodiscard]]

View File

@@ -13,11 +13,7 @@ class FilePickerPopup {
private: private:
ox::String m_name; ox::String m_name;
struct Explorer: public FileExplorer { FileExplorer m_explorer;
mutable bool opened{};
explicit Explorer(keel::Context &kctx);
void fileOpened(ox::StringViewCR path) const noexcept override;
} m_explorer;
ox::Vector<ox::String> const m_fileExts; ox::Vector<ox::String> const m_fileExts;
bool m_open{}; bool m_open{};
@@ -37,10 +33,6 @@ class FilePickerPopup {
ox::Optional<ox::String> draw(Context &ctx) noexcept; ox::Optional<ox::String> draw(Context &ctx) noexcept;
private:
[[nodiscard]]
ox::Optional<ox::String> handlePick() noexcept;
}; };
} }

View File

@@ -109,7 +109,7 @@ class ItemMaker {
return m_typeDisplayName; return m_typeDisplayName;
} }
bool installTemplate(ox::UPtr<ItemTemplate> &&tmpl) { bool installTemplate(ox::UPtr<ItemTemplate> &tmpl) {
if (typeName() == tmpl->typeName() && if (typeName() == tmpl->typeName() &&
typeVersion() <= tmpl->typeVersion()) { typeVersion() <= tmpl->typeVersion()) {
m_templates.emplace_back(std::move(tmpl)); m_templates.emplace_back(std::move(tmpl));
@@ -120,6 +120,10 @@ class ItemMaker {
return false; return false;
} }
bool installTemplate(ox::UPtr<ItemTemplate> &&tmpl) {
return installTemplate(tmpl);
}
constexpr ox::Vector<ox::UPtr<ItemTemplate>> const&itemTemplates() const noexcept { constexpr ox::Vector<ox::UPtr<ItemTemplate>> const&itemTemplates() const noexcept {
return m_templates; return m_templates;
} }

View File

@@ -9,7 +9,7 @@ namespace studio {
void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept { void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept {
ox::String path = std::move(filePath); ox::String path = std::move(filePath);
if (beginsWith(path, "uuid://")) { if (beginsWith(path, "uuid://")) {
auto const [p, err] = keel::uuidUrlToPath(keelCtx(ctx), path); auto [p, err] = keel::uuidUrlToPath(keelCtx(ctx), path);
if (err) { if (err) {
return; return;
} }
@@ -17,12 +17,7 @@ void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs)
} }
ctx.navStack.resize(ctx.navIdx + 1); ctx.navStack.resize(ctx.navIdx + 1);
ctx.navStack.emplace_back(ox::String{path}, ox::String{navArgs.view()}); ctx.navStack.emplace_back(ox::String{path}, ox::String{navArgs.view()});
try { ctx.navCallback(std::move(path), std::move(navArgs));
ctx.navCallback(std::move(path), std::move(navArgs));
} catch (std::exception const &e) {
oxErrf("Nav error: {}", e.what());
oxAssert(false, "Nav error");
}
} }
void navigateBack(Context &ctx) noexcept { void navigateBack(Context &ctx) noexcept {
@@ -30,26 +25,19 @@ void navigateBack(Context &ctx) noexcept {
return; return;
} }
--ctx.navIdx; --ctx.navIdx;
while (ctx.navIdx < ctx.navStack.size() && ctx.navIdx) { if (ctx.navIdx < ctx.navStack.size() && ctx.navIdx) {
auto const i = ctx.navIdx - 1; auto const &n = ctx.navStack[ctx.navIdx - 1];
auto const &n = ctx.navStack[i];
if (!ctx.project->exists(n.filePath)) {
std::ignore = ctx.navStack.erase(i);
--ctx.navIdx;
continue;
}
try { try {
ctx.navCallback(n.filePath, n.navArgs); ctx.navCallback(n.filePath, n.navArgs);
} catch (std::exception const &e) { } catch (std::exception const &e) {
oxAssert(ctx.navCallback != nullptr, "navCallback is null"); oxAssert(ctx.navCallback != nullptr, "navCallback is null");
oxErrf("navigateForward failed: {}", e.what()); oxErrf("navigateForward failed: {}", e.what());
} }
break;
} }
} }
void navigateForward(Context &ctx) noexcept { void navigateForward(Context &ctx) noexcept {
while (ctx.navIdx < ctx.navStack.size()) { if (ctx.navIdx < ctx.navStack.size()) {
auto const &n = ctx.navStack[ctx.navIdx]; auto const &n = ctx.navStack[ctx.navIdx];
try { try {
ctx.navCallback(n.filePath, n.navArgs); ctx.navCallback(n.filePath, n.navArgs);
@@ -57,12 +45,7 @@ void navigateForward(Context &ctx) noexcept {
oxAssert(ctx.navCallback != nullptr, "navCallback is null"); oxAssert(ctx.navCallback != nullptr, "navCallback is null");
oxErrf("navigateForward failed: {}", e.what()); oxErrf("navigateForward failed: {}", e.what());
} }
if (!ctx.project->exists(n.filePath)) {
std::ignore = ctx.navStack.erase(ctx.navIdx);
continue;
}
++ctx.navIdx; ++ctx.navIdx;
break;
} }
} }

View File

@@ -72,10 +72,8 @@ bool BaseEditor::exportable() const noexcept {
} }
void BaseEditor::setCutEnabled(bool v) { void BaseEditor::setCutEnabled(bool v) {
if (m_cutEnabled != v) { m_cutEnabled = v;
m_cutEnabled = v; cutEnabledChanged.emit(v);
cutEnabledChanged.emit(v);
}
} }
bool BaseEditor::cutEnabled() const noexcept { bool BaseEditor::cutEnabled() const noexcept {
@@ -83,10 +81,8 @@ bool BaseEditor::cutEnabled() const noexcept {
} }
void BaseEditor::setCopyEnabled(bool v) { void BaseEditor::setCopyEnabled(bool v) {
if (m_copyEnabled != v) { m_copyEnabled = v;
m_copyEnabled = v; copyEnabledChanged.emit(v);
copyEnabledChanged.emit(v);
}
} }
bool BaseEditor::copyEnabled() const noexcept { bool BaseEditor::copyEnabled() const noexcept {
@@ -94,10 +90,8 @@ bool BaseEditor::copyEnabled() const noexcept {
} }
void BaseEditor::setPasteEnabled(bool v) { void BaseEditor::setPasteEnabled(bool v) {
if (m_pasteEnabled != v) { m_pasteEnabled = v;
m_pasteEnabled = v; pasteEnabledChanged.emit(v);
pasteEnabledChanged.emit(v);
}
} }
bool BaseEditor::pasteEnabled() const noexcept { bool BaseEditor::pasteEnabled() const noexcept {

View File

@@ -8,15 +8,6 @@
namespace studio { namespace studio {
FilePickerPopup::Explorer::Explorer(keel::Context &kctx):
FileExplorer{kctx} {
}
void FilePickerPopup::Explorer::fileOpened(ox::StringViewCR) const noexcept {
opened = true;
}
FilePickerPopup::FilePickerPopup( FilePickerPopup::FilePickerPopup(
ox::StringParam name, ox::StringParam name,
keel::Context &kctx, keel::Context &kctx,
@@ -50,7 +41,6 @@ void FilePickerPopup::refresh() noexcept {
void FilePickerPopup::open() noexcept { void FilePickerPopup::open() noexcept {
refresh(); refresh();
m_open = true; m_open = true;
m_explorer.opened = false;
} }
void FilePickerPopup::close() noexcept { void FilePickerPopup::close() noexcept {
@@ -70,22 +60,16 @@ ox::Optional<ox::String> FilePickerPopup::draw(Context &ctx) noexcept {
if (ig::BeginPopup(ctx.tctx, m_name, m_open, {380, 340})) { if (ig::BeginPopup(ctx.tctx, m_name, m_open, {380, 340})) {
auto const vp = ImGui::GetContentRegionAvail(); auto const vp = ImGui::GetContentRegionAvail();
m_explorer.draw(ctx, {vp.x, vp.y - 30}); m_explorer.draw(ctx, {vp.x, vp.y - 30});
if (ig::PopupControlsOkCancel(m_open) == ig::PopupResponse::OK || m_explorer.opened) { if (ig::PopupControlsOkCancel(m_open) == ig::PopupResponse::OK) {
out = handlePick(); auto p = m_explorer.selectedPath();
if (p) {
out.emplace(*p);
}
close();
} }
ImGui::EndPopup(); ImGui::EndPopup();
} }
return out; return out;
} }
ox::Optional<ox::String> FilePickerPopup::handlePick() noexcept {
ox::Optional<ox::String> out;
auto p = m_explorer.selectedPath();
if (p) {
out.emplace(*p);
}
close();
return out;
}
} }

View File

@@ -101,8 +101,8 @@ ox::Result<ox::FileStat> Project::stat(ox::StringViewCR path) const noexcept {
ox::Error Project::copyItem(ox::StringViewCR src, ox::StringViewCR dest) noexcept { ox::Error Project::copyItem(ox::StringViewCR src, ox::StringViewCR dest) noexcept {
OX_REQUIRE_M(buff, loadBuff(src)); OX_REQUIRE_M(buff, loadBuff(src));
OX_REQUIRE(id, keel::regenerateUuidHeader(buff)); OX_REQUIRE(id, keel::regenerateUuidHeader(buff));
OX_RETURN_ERROR(writeBuff(dest, buff));
createUuidMapping(m_kctx, dest, id); createUuidMapping(m_kctx, dest, id);
OX_RETURN_ERROR(writeBuff(dest, ox::BufferView{buff} + keel::K1HdrSz));
return {}; return {};
} }

View File

@@ -79,14 +79,11 @@ enum Key {
}; };
using KeyEventHandler = void(*)(Context&, Key, bool); using KeyEventHandler = void(*)(Context&, Key, bool);
using MouseButtonEventHandler = void(*)(Context&, int btn, bool);
void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept; void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept;
void setMouseButtonEventHandler(Context &ctx, MouseButtonEventHandler h) noexcept;
[[nodiscard]] [[nodiscard]]
KeyEventHandler keyEventHandler(Context const &ctx) noexcept; KeyEventHandler keyEventHandler(Context &ctx) noexcept;
[[nodiscard]] [[nodiscard]]
bool buttonDown(Context const&ctx, Key) noexcept; bool buttonDown(Context const&ctx, Key) noexcept;

View File

@@ -133,9 +133,7 @@ void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept {
ctx.keyEventHandler = h; ctx.keyEventHandler = h;
} }
void setMouseButtonEventHandler(Context&, MouseButtonEventHandler) noexcept {} KeyEventHandler keyEventHandler(Context &ctx) noexcept {
KeyEventHandler keyEventHandler(Context const &ctx) noexcept {
return ctx.keyEventHandler; return ctx.keyEventHandler;
} }

View File

@@ -16,7 +16,6 @@ class Context {
UpdateHandler updateHandler = [](Context&) -> int {return -1;}; UpdateHandler updateHandler = [](Context&) -> int {return -1;};
keel::Context keelCtx; keel::Context keelCtx;
KeyEventHandler keyEventHandler = nullptr; KeyEventHandler keyEventHandler = nullptr;
MouseButtonEventHandler mouseButtonEventHandler = nullptr;
ox::AnyPtr applicationData; ox::AnyPtr applicationData;
// GLFW impl data //////////////////////////////////////////////////////// // GLFW impl data ////////////////////////////////////////////////////////

View File

@@ -299,14 +299,9 @@ static void handleKeyPress(Context &ctx, int const key, bool const down) noexcep
static void handleGlfwCursorPosEvent(GLFWwindow*, double, double) noexcept { static void handleGlfwCursorPosEvent(GLFWwindow*, double, double) noexcept {
} }
static void handleGlfwMouseButtonEvent( static void handleGlfwMouseButtonEvent(GLFWwindow *window, int, int, int) noexcept {
GLFWwindow *window,
int const btn,
int const action,
int) noexcept {
auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window)); auto &ctx = *static_cast<Context*>(glfwGetWindowUserPointer(window));
setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + config::MandatoryRefreshPeriod); setMandatoryRefreshPeriod(ctx, ticksMs(ctx) + config::MandatoryRefreshPeriod);
ctx.mouseButtonEventHandler(ctx, btn, action == 1);
} }
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 {
@@ -344,8 +339,7 @@ ox::Result<ox::UPtr<Context>> init(
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
constexpr auto Scale = 5; constexpr auto Scale = 5;
ctx->window = glfwCreateWindow( ctx->window = glfwCreateWindow(240 * Scale, 160 * Scale, ctx->keelCtx.appName.c_str(), nullptr, nullptr);
240 * Scale, 160 * Scale, ctx->keelCtx.appName.c_str(), nullptr, nullptr);
//ctx.window = glfwCreateWindow(876, 743, ctx.keelCtx.appName.c_str(), nullptr, nullptr); //ctx.window = glfwCreateWindow(876, 743, ctx.keelCtx.appName.c_str(), nullptr, nullptr);
if (ctx->window == nullptr) { if (ctx->window == nullptr) {
return ox::Error(1, "Could not open GLFW window"); return ox::Error(1, "Could not open GLFW window");
@@ -453,19 +447,15 @@ void setShutdownHandler(Context &ctx, ShutdownHandler const handler) noexcept {
ctx.shutdownHandler = handler; ctx.shutdownHandler = handler;
} }
void setUpdateHandler(Context &ctx, UpdateHandler const h) noexcept { void setUpdateHandler(Context &ctx, UpdateHandler h) noexcept {
ctx.updateHandler = h; ctx.updateHandler = h;
} }
void setKeyEventHandler(Context &ctx, KeyEventHandler const h) noexcept { void setKeyEventHandler(Context &ctx, KeyEventHandler h) noexcept {
ctx.keyEventHandler = h; ctx.keyEventHandler = h;
} }
void setMouseButtonEventHandler(Context &ctx, MouseButtonEventHandler const h) noexcept { KeyEventHandler keyEventHandler(Context &ctx) noexcept {
ctx.mouseButtonEventHandler = h;
}
KeyEventHandler keyEventHandler(Context const &ctx) noexcept {
return ctx.keyEventHandler; return ctx.keyEventHandler;
} }