JSEventHelper.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <Atomic/UI/UIEvents.h>
  2. #include "JSVM.h"
  3. #include "JSEventHelper.h"
  4. namespace Atomic
  5. {
  6. JSEventHelper::JSEventHelper(Context* context) :
  7. Object(context)
  8. {
  9. }
  10. JSEventHelper::~JSEventHelper()
  11. {
  12. }
  13. void JSEventHelper::AddEventHandler(StringHash eventType)
  14. {
  15. SubscribeToEvent(eventType, HANDLER(JSEventHelper, HandleEvent));
  16. }
  17. void JSEventHelper::AddEventHandler(Object* sender, StringHash eventType)
  18. {
  19. SubscribeToEvent(sender, eventType, HANDLER(JSEventHelper, HandleEvent));
  20. }
  21. void JSEventHelper::HandleEvent(StringHash eventType, VariantMap& eventData)
  22. {
  23. JSVM* vm = JSVM::GetJSVM(0);
  24. duk_context* ctx = vm->GetJSContext();
  25. duk_idx_t top = duk_get_top(ctx);
  26. js_push_class_object_instance(ctx, this);
  27. duk_get_prop_string(ctx, -1, "__eventHelperFunctions");
  28. assert(duk_is_object(ctx, -1));
  29. duk_get_prop_string(ctx, -1, eventType.ToString().CString());
  30. if (duk_is_function(ctx, -1))
  31. {
  32. assert(duk_is_object(ctx, -1));
  33. //TODO: this is expensive, we should be caching these in VM
  34. // and reusing, instead of creating new variant map object
  35. // per event handler
  36. js_push_variantmap(ctx, eventData);
  37. if (duk_pcall(ctx, 1) != 0)
  38. {
  39. vm->SendJSErrorEvent();
  40. }
  41. else
  42. {
  43. // For widget events, need to check return value
  44. // and set whether handled
  45. if (eventType == E_WIDGETEVENT)
  46. {
  47. if (duk_is_boolean(ctx, -1))
  48. {
  49. if (duk_to_boolean(ctx, -1))
  50. {
  51. eventData[WidgetEvent::P_HANDLED] = true;
  52. }
  53. }
  54. }
  55. }
  56. }
  57. duk_set_top(ctx, top);
  58. }
  59. }