From e4f7315cc3497ff0dbfd2ecb9da474bdc3f834be Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 11 Feb 2024 23:56:24 +0300 Subject: [PATCH] lua: uidocuments sub-environment --- src/assets/Assets.cpp | 1 + src/assets/assetload_funcs.cpp | 1 + src/engine.cpp | 2 +- src/frontend/UiDocument.cpp | 17 ++++++++++------- src/frontend/UiDocument.h | 8 ++++++-- src/logic/scripting/LuaState.cpp | 10 ++++++++-- src/logic/scripting/LuaState.h | 2 +- src/logic/scripting/scripting.cpp | 4 ++-- src/logic/scripting/scripting.h | 2 +- 9 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/assets/Assets.cpp b/src/assets/Assets.cpp index 7d34d6a0..5183cca2 100644 --- a/src/assets/Assets.cpp +++ b/src/assets/Assets.cpp @@ -5,6 +5,7 @@ #include "../graphics/Atlas.h" #include "../graphics/Font.h" #include "../frontend/UiDocument.h" +#include "../logic/scripting/scripting.h" Assets::~Assets() { } diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index 90dabcde..2348c915 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -14,6 +14,7 @@ #include "../graphics/Font.h" #include "../graphics/TextureAnimation.h" #include "../frontend/UiDocument.h" +#include "../logic/scripting/scripting.h" namespace fs = std::filesystem; diff --git a/src/engine.cpp b/src/engine.cpp index 071dba63..1dac3eb0 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -131,12 +131,12 @@ void Engine::mainloop() { Engine::~Engine() { screen = nullptr; content.reset(); - scripting::close(); Audio::finalize(); std::cout << "-- shutting down" << std::endl; assets.reset(); + scripting::close(); Window::terminate(); std::cout << "-- engine finished" << std::endl; } diff --git a/src/frontend/UiDocument.cpp b/src/frontend/UiDocument.cpp index 0274d8fa..78cda915 100644 --- a/src/frontend/UiDocument.cpp +++ b/src/frontend/UiDocument.cpp @@ -1,5 +1,6 @@ #include "UiDocument.h" +#include #include "gui/UINode.h" #include "gui/panels.h" #include "InventoryView.h" @@ -11,8 +12,8 @@ UiDocument::UiDocument( std::string id, uidocscript script, std::shared_ptr root, - int env -) : id(id), script(script), root(root), env(env) { + std::unique_ptr env +) : id(id), script(script), root(root), env(std::move(env)) { collect(map, root); } @@ -34,7 +35,7 @@ const uidocscript& UiDocument::getScript() const { } int UiDocument::getEnvironment() const { - return env; + return env->getId(); } void UiDocument::collect(uinodes_map& map, std::shared_ptr node) { @@ -50,10 +51,12 @@ void UiDocument::collect(uinodes_map& map, std::shared_ptr node) { } } -std::unique_ptr UiDocument::read(int env, std::string namesp, fs::path file) { +std::unique_ptr UiDocument::read(int penv, std::string namesp, fs::path file) { const std::string text = files::read_string(file); auto xmldoc = xml::parse(file.u8string(), text); - gui::UiXmlReader reader(env); + + auto env = scripting::create_environment(penv); + gui::UiXmlReader reader(*env); InventoryView::createReaders(reader); auto view = reader.readXML( file.u8string(), xmldoc->getRoot() @@ -61,7 +64,7 @@ std::unique_ptr UiDocument::read(int env, std::string namesp, fs::pa uidocscript script {}; auto scriptFile = fs::path(file.u8string()+".lua"); if (fs::is_regular_file(scriptFile)) { - scripting::load_layout_script(env, namesp, scriptFile, script); + scripting::load_layout_script(env->getId(), namesp, scriptFile, script); } - return std::make_unique(namesp, script, view, env); + return std::make_unique(namesp, script, view, std::move(env)); } diff --git a/src/frontend/UiDocument.h b/src/frontend/UiDocument.h index f5818190..588cc73d 100644 --- a/src/frontend/UiDocument.h +++ b/src/frontend/UiDocument.h @@ -12,6 +12,10 @@ namespace gui { class UINode; } +namespace scripting { + class Environment; +} + struct uidocscript { int environment; bool onopen : 1; @@ -25,13 +29,13 @@ class UiDocument { uidocscript script; uinodes_map map; std::shared_ptr root; - int env; + std::unique_ptr env; public: UiDocument( std::string id, uidocscript script, std::shared_ptr root, - int env + std::unique_ptr env ); const std::string& getId() const; diff --git a/src/logic/scripting/LuaState.cpp b/src/logic/scripting/LuaState.cpp index 229a1e00..b55dcc10 100644 --- a/src/logic/scripting/LuaState.cpp +++ b/src/logic/scripting/LuaState.cpp @@ -228,7 +228,7 @@ const std::string lua::LuaState::storeAnonymous() { return funcName; } -int lua::LuaState::createEnvironment() { +int lua::LuaState::createEnvironment(int parent) { int id = nextEnvironment++; // local env = {} @@ -236,7 +236,13 @@ int lua::LuaState::createEnvironment() { // setmetatable(env, {__index=_G}) lua_createtable(L, 0, 1); - lua_pushvalue(L, LUA_GLOBALSINDEX); + if (parent == 0 || true) { + lua_pushvalue(L, LUA_GLOBALSINDEX); + } else { + if (pushenv(parent) == 0) { + lua_pushvalue(L, LUA_GLOBALSINDEX); + } + } lua_setfield(L, -2, "__index"); lua_setmetatable(L, -2); diff --git a/src/logic/scripting/LuaState.h b/src/logic/scripting/LuaState.h index df4e6267..9c049bc1 100644 --- a/src/logic/scripting/LuaState.h +++ b/src/logic/scripting/LuaState.h @@ -51,7 +51,7 @@ namespace lua { bool rename(const std::string& from, const std::string& to); void remove(const std::string& name);; void createFuncs(); - int createEnvironment(); + int createEnvironment(int parent); void removeEnvironment(int id); const std::string storeAnonymous(); }; diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 416f6afd..124a9ca8 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -91,8 +91,8 @@ wstringconsumer scripting::create_wstring_consumer( }; } -std::unique_ptr scripting::create_environment() { - return std::make_unique(state->createEnvironment()); +std::unique_ptr scripting::create_environment(int parent) { + return std::make_unique(state->createEnvironment(parent)); } void scripting::on_world_load(Level* level, BlocksController* blocks) { diff --git a/src/logic/scripting/scripting.h b/src/logic/scripting/scripting.h index ffac1dc0..13e7bb1d 100644 --- a/src/logic/scripting/scripting.h +++ b/src/logic/scripting/scripting.h @@ -51,7 +51,7 @@ namespace scripting { const std::string& file="" ); - std::unique_ptr create_environment(); + std::unique_ptr create_environment(int parent=0); void on_world_load(Level* level, BlocksController* blocks); void on_world_save();