From 089bcbbb64b8009db03fb9b6ed04c491e46d6933 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 3 Jun 2026 21:50:36 +0300 Subject: [PATCH] fix document events & breaking: document events removed from 'events' library temporary --- src/frontend/UiDocument.cpp | 2 +- src/frontend/hud.cpp | 4 +- src/frontend/menu.cpp | 8 +-- src/graphics/ui/elements/InlineFrame.cpp | 4 +- src/logic/scripting/lua/libs/libgui.cpp | 2 +- src/logic/scripting/scripting.cpp | 77 +++++++++++------------- src/logic/scripting/scripting.hpp | 8 +-- 7 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/frontend/UiDocument.cpp b/src/frontend/UiDocument.cpp index d0a158baf..4e8dbe72a 100644 --- a/src/frontend/UiDocument.cpp +++ b/src/frontend/UiDocument.cpp @@ -22,7 +22,7 @@ UiDocument::UiDocument( UiDocument::~UiDocument() { try { - scripting::on_ui_destroy(this); + scripting::on_ui_destroy(*this); } catch (const std::exception& err) { logger.error() << "an error occurred on calling on_destroy event for document '" << id << "': " << err.what(); diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp index 4366d8c6e..1aa03436b 100644 --- a/src/frontend/hud.cpp +++ b/src/frontend/hud.cpp @@ -563,7 +563,7 @@ void Hud::add(const HudElement& element, const dv::value& argsArray) { args.emplace_back(static_cast(blockPos[i])); } scripting::on_ui_open( - element.getDocument(), + *element.getDocument(), std::move(args) ); } @@ -578,7 +578,7 @@ void Hud::onRemove(const HudElement& element) { if (invview) { inventory = invview->getInventory().get(); } - scripting::on_ui_close(document, inventory); + scripting::on_ui_close(*document, inventory); if (invview) { invview->unbind(); } diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index 372264a59..ab06b42dc 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -86,7 +86,7 @@ UiDocument* menus::show( ); auto document = documentPtr.get(); engine.getAssets()->store(std::move(documentPtr), fullname); - scripting::on_ui_open(document, std::move(args)); + scripting::on_ui_open(*document, std::move(args)); menu->addPage(name, document->getRoot()); menu->setPage(name); return document; @@ -99,13 +99,13 @@ void menus::show_process_panel( auto menu = engine.getGUI().getMenu(); menu->reset(); - auto doc = + auto document = menus::show(engine, "process", {util::wstr2str_utf8(langs::get(text))}); - std::dynamic_pointer_cast(doc->getRoot()) + std::dynamic_pointer_cast(document->getRoot()) ->listenInterval(0.01f, [=]() { task->update(); uint tasksDone = task->getWorkDone(); - scripting::on_ui_progress(doc, tasksDone, initialWork); + scripting::on_ui_progress(*document, tasksDone, initialWork); }); } diff --git a/src/graphics/ui/elements/InlineFrame.cpp b/src/graphics/ui/elements/InlineFrame.cpp index 50fc79762..319a16b1b 100644 --- a/src/graphics/ui/elements/InlineFrame.cpp +++ b/src/graphics/ui/elements/InlineFrame.cpp @@ -13,7 +13,7 @@ InlineFrame::~InlineFrame() = default; void InlineFrame::setSrc(const std::string& src) { this->src = src; if (document) { - scripting::on_ui_close(document.get(), nullptr); + scripting::on_ui_close(*document, nullptr); document = nullptr; root = nullptr; } @@ -31,7 +31,7 @@ void InlineFrame::setDocument(const std::shared_ptr& document) { root->setSize(size); gui.postRunnable([this]() { - scripting::on_ui_open(this->document.get(), {}); + scripting::on_ui_open(*this->document, {}); }); } diff --git a/src/logic/scripting/lua/libs/libgui.cpp b/src/logic/scripting/lua/libs/libgui.cpp index cdd3dad28..5ede0694c 100644 --- a/src/logic/scripting/lua/libs/libgui.cpp +++ b/src/logic/scripting/lua/libs/libgui.cpp @@ -1144,7 +1144,7 @@ static int l_gui_load_document(lua::State* L) { auto document = documentPtr.get(); engine->requireAssets().store(std::move(documentPtr), alias); - scripting::on_ui_open(document, {args}); + scripting::on_ui_open(*document, {args}); return 0; } diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 67f8989c8..6954ee6b8 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -591,53 +591,46 @@ bool scripting::on_item_break_block( ); } -void scripting::on_ui_open( - UiDocument* layout, std::vector args -) { - if (!layout->getScript().onopen) { - return; - } - auto argsptr = - std::make_shared>(std::move(args)); - std::string name = layout->getId() + ".open"; - lua::emit_event(lua::get_main_state(), name, [=](auto L) { - for (const auto& value : *argsptr) { - lua::pushvalue(L, value); +static void call_layout_event(const UiDocument& layout, const std::vector& args, const std::string& eventName) { + auto L = lua::get_main_state(); + lua::pushenv(L, *layout.getEnvironment()); + if (lua::getfield(L, eventName)) { + for (const auto& arg : args) { + lua::pushvalue(L, arg); } - return argsptr->size(); - }); + lua::call_nothrow(L, args.size(), 0); + } + lua::pop(L); +} + +void scripting::on_ui_open( + const UiDocument& layout, std::vector args +) { + if (layout.getScript().onopen) { + call_layout_event(layout, args, "on_open"); + } } void scripting::on_ui_progress( - UiDocument* layout, int workDone, int workTotal + const UiDocument& layout, int workDone, int workTotal ) { - if (!layout->getScript().onprogress){ - return; + if (layout.getScript().onprogress){ + call_layout_event(layout, {workDone, workTotal}, "on_progress"); } - std::string name = layout->getId() + ".progress"; - lua::emit_event(lua::get_main_state(), name, [=](auto L) { - lua::pushinteger(L, workDone); - lua::pushinteger(L, workTotal); - return 2; - }); } -void scripting::on_ui_close(UiDocument* layout, Inventory* inventory) { - if (!layout->getScript().onclose) { - return; +void scripting::on_ui_close(const UiDocument& layout, Inventory* inventory) { + if (layout.getScript().onclose) { + call_layout_event( + layout, {inventory ? inventory->getId() : 0}, "on_close" + ); } - std::string name = layout->getId() + ".close"; - lua::emit_event(lua::get_main_state(), name, [inventory](auto L) { - return lua::pushinteger(L, inventory ? inventory->getId() : 0); - }); } -void scripting::on_ui_destroy(UiDocument* layout) { - if (!layout->getScript().ondestroy) { - return; +void scripting::on_ui_destroy(const UiDocument& layout) { + if (layout.getScript().ondestroy) { + call_layout_event(layout, {}, "on_destroy"); } - std::string name = layout->getId() + ".destroy"; - lua::emit_event(lua::get_main_state(), name, [](auto L) { return 0; }); } void scripting::on_scripts_loading() { @@ -822,12 +815,14 @@ void scripting::load_layout_script( ) { int env = *senv; - lua::pop(lua::get_main_state(), load_script(env, "layout", file, fileName)); - script.onopen = register_event(env, "on_open", prefix + ".open"); - script.onprogress = - register_event(env, "on_progress", prefix + ".progress"); - script.onclose = register_event(env, "on_close", prefix + ".close"); - script.ondestroy = register_event(env, "on_destroy", prefix + ".destroy"); + auto L = lua::get_main_state(); + lua::pop(L, load_script(env, "layout", file, fileName)); + lua::pushenv(L, env); + script.onopen = lua::hasfield(L, "on_open"); + script.onprogress = lua::hasfield(L, "on_progress"); + script.onclose = lua::hasfield(L, "on_close"); + script.ondestroy = lua::hasfield(L, "on_destroy"); + lua::pop(L); } void scripting::close() { diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index 68ac57486..ff2306589 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -153,15 +153,15 @@ namespace scripting { void on_entity_used(const Entity& entity, Player* player); /// @brief Called on UI document show - void on_ui_open(UiDocument* layout, std::vector args); + void on_ui_open(const UiDocument& layout, std::vector args); - void on_ui_progress(UiDocument* layout, int workDone, int totalWork); + void on_ui_progress(const UiDocument& layout, int workDone, int totalWork); /// @brief Called on UI document close - void on_ui_close(UiDocument* layout, Inventory* inventory); + void on_ui_close(const UiDocument& layout, Inventory* inventory); /// @brief Called on UI document destroy - void on_ui_destroy(UiDocument* layout); + void on_ui_destroy(const UiDocument& layout); /// @brief Called on Content loading void on_scripts_loading();