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/Map.hpp>
#include <map>
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<VOID()> 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<String, std::function<VOID()>> m_clickCallbacks;
};
} // namespace ia::iae
namespace ia::iae
{
Rml::Context *g_context{};
EventListener *g_eventListener;
BOOL g_debuggerEnabled{false};
std::map<Handle, EventListener *> 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<VOID()> callback)
{
const auto doc = reinterpret_cast<Rml::ElementDocument *>(handle);
doc->AddEventListener("click", g_eventListener);
g_eventListeners[handle]->AddClickListener(elementId, callback);
}
} // namespace ia::iae