This commit is contained in:
Isuru Samarathunga
2025-09-22 23:19:50 +05:30
parent 60c40c45a8
commit 0e7474d4e4

View File

@ -26,6 +26,9 @@
#include <IACore/File.hpp> #include <IACore/File.hpp>
#include <IACore/Map.hpp>
#include <map>
namespace ia::iae namespace ia::iae
{ {
class RmlUIRenderInterface : public Rml::RenderInterface class RmlUIRenderInterface : public Rml::RenderInterface
@ -316,19 +319,42 @@ namespace ia::iae
class EventListener : public Rml::EventListener class EventListener : public Rml::EventListener
{ {
public: public:
EventListener(IN Rml::ElementDocument *document) : m_document(document)
{
}
VOID AddClickListener(IN PCCHAR elementId, IN std::function<VOID()> callback)
{
m_document->GetElementById(elementId)->AddEventListener("click", this);
m_clickCallbacks[elementId] = callback;
}
VOID ProcessEvent(IN Rml::Event &event) 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<String, std::function<VOID()>> m_clickCallbacks;
}; };
} // namespace ia::iae } // namespace ia::iae
namespace ia::iae namespace ia::iae
{ {
Rml::Context *g_context{}; Rml::Context *g_context{};
EventListener *g_eventListener;
BOOL g_debuggerEnabled{false}; BOOL g_debuggerEnabled{false};
std::map<Handle, EventListener *> g_eventListeners;
struct MainDataModel struct MainDataModel
{ {
Rml::String InputValues[10]; Rml::String InputValues[10];
@ -339,7 +365,6 @@ namespace ia::iae
Rml::SetRenderInterface(&g_rmlUIRenderInterface); Rml::SetRenderInterface(&g_rmlUIRenderInterface);
Rml::Initialise(); Rml::Initialise();
g_context = Rml::CreateContext("main", Rml::Vector2i(width, height)); g_context = Rml::CreateContext("main", Rml::Vector2i(width, height));
g_eventListener = new EventListener();
Rml::Debugger::Initialise(g_context); Rml::Debugger::Initialise(g_context);
DisableDebugger(); DisableDebugger();
@ -352,6 +377,9 @@ namespace ia::iae
VOID UI::Terminate() VOID UI::Terminate()
{ {
for (auto &v : g_eventListeners)
delete v.second;
Rml::Shutdown(); Rml::Shutdown();
} }
@ -420,7 +448,10 @@ namespace ia::iae
Handle UI::AddWindowFromFile(IN CONST String &path) 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) 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<VOID()> callback) VOID UI::AddClickEvent(IN Handle handle, IN PCCHAR elementId, IN std::function<VOID()> callback)
{ {
const auto doc = reinterpret_cast<Rml::ElementDocument *>(handle); g_eventListeners[handle]->AddClickListener(elementId, callback);
doc->AddEventListener("click", g_eventListener);
} }
} // namespace ia::iae } // namespace ia::iae