LuaScriptEventInvoker.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Copyright (c) 2008-2022 the Urho3D project
  2. // License: MIT
  3. #include "../Precompiled.h"
  4. #include "../LuaScript/LuaFunction.h"
  5. #include "../LuaScript/LuaScriptEventInvoker.h"
  6. #include "../LuaScript/LuaScriptInstance.h"
  7. #include "../DebugNew.h"
  8. namespace Urho3D
  9. {
  10. LuaScriptEventInvoker::LuaScriptEventInvoker(Context* context) :
  11. Object(context)
  12. {
  13. }
  14. LuaScriptEventInvoker::LuaScriptEventInvoker(LuaScriptInstance* instance) :
  15. Object(instance->GetContext()),
  16. instance_(instance)
  17. {
  18. }
  19. LuaScriptEventInvoker::~LuaScriptEventInvoker() = default;
  20. void LuaScriptEventInvoker::AddEventHandler(Object* sender, const StringHash& eventType, LuaFunction* function)
  21. {
  22. if (!function)
  23. return;
  24. if (sender)
  25. SubscribeToEvent(sender, eventType, URHO3D_HANDLER_USERDATA(LuaScriptEventInvoker, HandleLuaScriptEvent, function));
  26. else
  27. SubscribeToEvent(eventType, URHO3D_HANDLER_USERDATA(LuaScriptEventInvoker, HandleLuaScriptEvent, function));
  28. }
  29. void LuaScriptEventInvoker::HandleLuaScriptEvent(StringHash eventType, VariantMap& eventData)
  30. {
  31. auto* function = static_cast<LuaFunction*>(GetEventHandler()->GetUserData());
  32. if (!function)
  33. return;
  34. // Keep instance alive during invoking
  35. SharedPtr<LuaScriptInstance> instance(instance_);
  36. if (function->BeginCall(instance)) // instance may be null when invoking a procedural event handler
  37. {
  38. function->PushUserType(eventType, "StringHash");
  39. function->PushUserType(eventData, "VariantMap");
  40. function->EndCall();
  41. }
  42. }
  43. }