BsScriptContextMenu.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "BsScriptContextMenu.h"
  2. #include "BsScriptMeta.h"
  3. #include "BsMonoField.h"
  4. #include "BsMonoClass.h"
  5. #include "BsMonoManager.h"
  6. #include "BsMonoMethod.h"
  7. #include "BsMonoUtil.h"
  8. #include "BsGUIContextMenu.h"
  9. #include "BsScriptHString.h"
  10. using namespace std::placeholders;
  11. namespace BansheeEngine
  12. {
  13. ScriptContextMenu::ScriptContextMenu(MonoObject* instance)
  14. : ScriptObject(instance)
  15. {
  16. mContextMenu = bs_shared_ptr<GUIContextMenu>();
  17. }
  18. void ScriptContextMenu::initRuntimeData()
  19. {
  20. metaData.scriptClass->addInternalCall("internal_CreateInstance", &ScriptContextMenu::internal_CreateInstance);
  21. metaData.scriptClass->addInternalCall("internal_AddItem", &ScriptContextMenu::internal_AddItem);
  22. metaData.scriptClass->addInternalCall("internal_AddSeparator", &ScriptContextMenu::internal_AddSeparator);
  23. metaData.scriptClass->addInternalCall("internal_SetLocalizedName", &ScriptContextMenu::internal_SetLocalizedName);
  24. onEntryTriggered = (OnEntryTriggeredThunkDef)metaData.scriptClass->getMethod("InternalDoOnEntryTriggered", 1)->getThunk();
  25. }
  26. void ScriptContextMenu::internal_CreateInstance(MonoObject* instance)
  27. {
  28. ScriptContextMenu* nativeInstance = new (bs_alloc<ScriptContextMenu>()) ScriptContextMenu(instance);
  29. }
  30. void ScriptContextMenu::internal_AddItem(ScriptContextMenu* instance, MonoString* path, UINT32 callbackIdx,
  31. ShortcutKey shortcut)
  32. {
  33. WString nativePath = MonoUtil::monoToWString(path);
  34. GUIContextMenuPtr contextMenu = instance->getInternal();
  35. contextMenu->addMenuItem(nativePath, std::bind(&ScriptContextMenu::onContextMenuItemTriggered,
  36. instance, callbackIdx), 0, shortcut);
  37. }
  38. void ScriptContextMenu::internal_AddSeparator(ScriptContextMenu* instance, MonoString* path)
  39. {
  40. WString nativePath = MonoUtil::monoToWString(path);
  41. GUIContextMenuPtr contextMenu = instance->getInternal();
  42. contextMenu->addSeparator(nativePath, 0);
  43. }
  44. void ScriptContextMenu::internal_SetLocalizedName(ScriptContextMenu* instance, MonoString* label, ScriptHString* name)
  45. {
  46. if (label == nullptr || name == nullptr)
  47. return;
  48. WString nativeLabel = MonoUtil::monoToWString(label);
  49. GUIContextMenuPtr contextMenu = instance->getInternal();
  50. contextMenu->setLocalizedName(nativeLabel, name->getInternalValue());
  51. }
  52. void ScriptContextMenu::onContextMenuItemTriggered(UINT32 idx)
  53. {
  54. MonoException* exception = nullptr;
  55. onEntryTriggered(getManagedInstance(), idx, &exception);
  56. MonoUtil::throwIfException(exception);
  57. }
  58. }