#include "gui_util.hpp" #include #include "delegates.hpp" #include "elements/Button.hpp" #include "elements/Label.hpp" #include "elements/Menu.hpp" #include "elements/TextBox.hpp" #include "engine/Engine.hpp" #include "frontend/locale.hpp" #include "gui_xml.hpp" #include "logic/scripting/scripting.hpp" #include "util/stringutil.hpp" #include "debug/Logger.hpp" debug::Logger logger("gui-util"); using namespace gui; std::shared_ptr guiutil::create( GUI& gui, const std::string& source, scriptenv env ) { if (env == nullptr) { env = scripting::get_root_environment(); } UiXmlReader reader(gui, std::move(env)); return reader.readXML("[string]", source); } static bool notify_callback(const runnable& callback, std::string_view name) { if (callback == nullptr) { return false; } try { callback(); return true; } catch (std::exception& err) { logger.error() << "exception thrown in " << name << ": " << err.what(); } return false; } void guiutil::alert( Engine& engine, const std::wstring& text, const runnable& on_hidden ) { GUI& gui = engine.getGUI(); auto panel = std::make_shared( gui, glm::vec2( glm::min( static_cast(650), glm::max(text.length() * 10, static_cast(200)) ), 300 ), glm::vec4(4.0f), 4.0f ); panel->setColor(glm::vec4(0.0f, 0.0f, 0.0f, 0.5f)); auto menuPtr = gui.getMenu(); auto& menu = *menuPtr; runnable on_hidden_final = [on_hidden, &menu]() { menu.removePage(""); if (!notify_callback(on_hidden, "on_hidden") && !menu.back()) { menu.reset(); } }; auto label = std::make_shared