diff --git a/res/layouts/reports/missing_content.xml b/res/layouts/reports/missing_content.xml
new file mode 100644
index 00000000..cd8cacb4
--- /dev/null
+++ b/res/layouts/reports/missing_content.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/res/layouts/reports/missing_content.xml.lua b/res/layouts/reports/missing_content.xml.lua
new file mode 100644
index 00000000..8ea78a1c
--- /dev/null
+++ b/res/layouts/reports/missing_content.xml.lua
@@ -0,0 +1,5 @@
+function on_open(report)
+ for i, entry in ipairs(report.content) do
+ document.content_panel:add(gui.template("content_entry", entry))
+ end
+end
diff --git a/res/layouts/templates/content_entry.xml b/res/layouts/templates/content_entry.xml
new file mode 100644
index 00000000..cfb9ce68
--- /dev/null
+++ b/res/layouts/templates/content_entry.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/frontend/hud.cpp b/src/frontend/hud.cpp
index bfbd02d1..bfa31b86 100644
--- a/src/frontend/hud.cpp
+++ b/src/frontend/hud.cpp
@@ -377,22 +377,28 @@ void Hud::closeInventory() {
}
void Hud::add(HudElement element) {
+ using dynamic::Value;
+
gui->add(element.getNode());
auto invview = std::dynamic_pointer_cast(element.getNode());
auto document = element.getDocument();
if (document) {
+ auto inventory = invview ? invview->getInventory() : nullptr;
+ std::vector> args;
+ args.push_back(Value::of(inventory ? inventory.get()->getId() : 0));
+ for (int i = 0; i < 3; i++) {
+ args.push_back(Value::of(blockPos[i]));
+ }
+
if (invview) {
- auto inventory = invview->getInventory();
scripting::on_ui_open(
element.getDocument(),
- inventory.get(),
- blockPos
+ std::move(args)
);
} else {
scripting::on_ui_open(
element.getDocument(),
- nullptr,
- blockPos
+ std::move(args)
);
}
}
diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp
index 639a610b..b5dea9ca 100644
--- a/src/frontend/menu.cpp
+++ b/src/frontend/menu.cpp
@@ -5,6 +5,7 @@
#include "../delegates.h"
#include "../engine.h"
+#include "../data/dynamic.h"
#include "../interfaces/Task.h"
#include "../files/engine_paths.h"
#include "../graphics/ui/elements/Label.hpp"
@@ -43,11 +44,23 @@ void menus::create_menus(Engine* engine) {
auto document = UiDocument::read(scripting::get_root_environment(), fullname, file).release();
engine->getAssets()->store(document, fullname);
- scripting::on_ui_open(document, nullptr, glm::ivec3());
+ scripting::on_ui_open(document, {});
return document->getRoot();
});
}
+void menus::show(Engine* engine, const std::string& name, std::vector> args) {
+ auto menu = engine->getGUI()->getMenu();
+ auto file = engine->getResPaths()->find("layouts/"+name+".xml");
+ auto fullname = "core:layouts/"+name;
+
+ auto document = UiDocument::read(scripting::get_root_environment(), fullname, file).release();
+ engine->getAssets()->store(document, fullname);
+ scripting::on_ui_open(document, std::move(args));
+ menu->addPage(name, document->getRoot());
+ menu->setPage(name);
+}
+
void menus::show_process_panel(Engine* engine, std::shared_ptr task, std::wstring text) {
auto menu = engine->getGUI()->getMenu();
auto panel = std::dynamic_pointer_cast(guiutil::create(
diff --git a/src/frontend/menu.hpp b/src/frontend/menu.hpp
index 5894fd7b..3f22b0da 100644
--- a/src/frontend/menu.hpp
+++ b/src/frontend/menu.hpp
@@ -2,15 +2,21 @@
#define FRONTEND_MENU_MENU_HPP_
#include
+#include
#include
class Task;
class Engine;
+namespace dynamic {
+ class Value;
+}
+
namespace menus {
/// @brief Create development version label at the top-right screen corner
void create_version_label(Engine* engine);
void create_menus(Engine* engine);
+ void show(Engine* engine, const std::string& name, std::vector> args);
void show_process_panel(Engine* engine, std::shared_ptr task, std::wstring text=L"");
}
diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp
index 277305ea..809f6b1d 100644
--- a/src/logic/EngineController.cpp
+++ b/src/logic/EngineController.cpp
@@ -74,36 +74,18 @@ static void show_content_missing(
const Content* content,
std::shared_ptr lut
) {
- auto* gui = engine->getGUI();
- auto menu = gui->getMenu();
- auto panel = std::dynamic_pointer_cast(guiutil::create(
- ""
- ""
- ""
- ));
- auto subpanel = std::dynamic_pointer_cast(guiutil::create(
- ""
- ""
- ));
- panel->add(subpanel);
-
+ using namespace dynamic;
+ auto root = std::make_unique