diff --git a/Src/IAEngine/imp/cpp/UI.cpp b/Src/IAEngine/imp/cpp/UI.cpp index 91f03c8..41caf77 100644 --- a/Src/IAEngine/imp/cpp/UI.cpp +++ b/Src/IAEngine/imp/cpp/UI.cpp @@ -26,6 +26,9 @@ #include +#include +#include + namespace ia::iae { class RmlUIRenderInterface : public Rml::RenderInterface @@ -316,19 +319,42 @@ namespace ia::iae class EventListener : public Rml::EventListener { public: + EventListener(IN Rml::ElementDocument *document) : m_document(document) + { + } + + VOID AddClickListener(IN PCCHAR elementId, IN std::function callback) + { + m_document->GetElementById(elementId)->AddEventListener("click", this); + m_clickCallbacks[elementId] = callback; + } + VOID ProcessEvent(IN Rml::Event &event) { - printf("Event recieved: %s\n", event.GetType().c_str()); + switch (event.GetId()) + { + case Rml::EventId::Click: + m_clickCallbacks[event.GetTargetElement()->GetId().c_str()](); + break; + + default: + break; + } } + + private: + Rml::ElementDocument *CONST m_document; + Map> m_clickCallbacks; }; } // namespace ia::iae namespace ia::iae { Rml::Context *g_context{}; - EventListener *g_eventListener; BOOL g_debuggerEnabled{false}; + std::map g_eventListeners; + struct MainDataModel { Rml::String InputValues[10]; @@ -339,7 +365,6 @@ namespace ia::iae Rml::SetRenderInterface(&g_rmlUIRenderInterface); Rml::Initialise(); g_context = Rml::CreateContext("main", Rml::Vector2i(width, height)); - g_eventListener = new EventListener(); Rml::Debugger::Initialise(g_context); DisableDebugger(); @@ -352,6 +377,9 @@ namespace ia::iae VOID UI::Terminate() { + for (auto &v : g_eventListeners) + delete v.second; + Rml::Shutdown(); } @@ -420,7 +448,10 @@ namespace ia::iae Handle UI::AddWindowFromFile(IN CONST String &path) { - return (Handle) g_context->LoadDocument(path.c_str()); + const auto w = g_context->LoadDocument(path.c_str()); + const auto handle = (Handle) w; + g_eventListeners[handle] = new EventListener(w); + return handle; } VOID UI::ShowWindow(IN Handle handle) @@ -435,8 +466,7 @@ namespace ia::iae VOID UI::AddClickEvent(IN Handle handle, IN PCCHAR elementId, IN std::function callback) { - const auto doc = reinterpret_cast(handle); - doc->AddEventListener("click", g_eventListener); + g_eventListeners[handle]->AddClickListener(elementId, callback); } } // namespace ia::iae