BsScriptContextMenu.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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::OnEntryTriggeredThunkDef ScriptContextMenu::onEntryTriggered;
  14. ScriptContextMenu::ScriptContextMenu(MonoObject* instance)
  15. : ScriptObject(instance)
  16. {
  17. mContextMenu = bs_shared_ptr<GUIContextMenu>();
  18. }
  19. void ScriptContextMenu::initRuntimeData()
  20. {
  21. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptContextMenu::internal_CreateInstance);
  22. metaData.scriptClass->addInternalCall("Internal_AddItem", &ScriptContextMenu::internal_AddItem);
  23. metaData.scriptClass->addInternalCall("Internal_AddSeparator", &ScriptContextMenu::internal_AddSeparator);
  24. metaData.scriptClass->addInternalCall("Internal_SetLocalizedName", &ScriptContextMenu::internal_SetLocalizedName);
  25. onEntryTriggered = (OnEntryTriggeredThunkDef)metaData.scriptClass->getMethod("InternalDoOnEntryTriggered", 1)->getThunk();
  26. }
  27. void ScriptContextMenu::internal_CreateInstance(MonoObject* instance)
  28. {
  29. ScriptContextMenu* nativeInstance = new (bs_alloc<ScriptContextMenu>()) ScriptContextMenu(instance);
  30. }
  31. void ScriptContextMenu::internal_AddItem(ScriptContextMenu* instance, MonoString* path, UINT32 callbackIdx,
  32. ShortcutKey shortcut)
  33. {
  34. WString nativePath = MonoUtil::monoToWString(path);
  35. GUIContextMenuPtr contextMenu = instance->getInternal();
  36. contextMenu->addMenuItem(nativePath, std::bind(&ScriptContextMenu::onContextMenuItemTriggered,
  37. instance, callbackIdx), 0, shortcut);
  38. }
  39. void ScriptContextMenu::internal_AddSeparator(ScriptContextMenu* instance, MonoString* path)
  40. {
  41. WString nativePath = MonoUtil::monoToWString(path);
  42. GUIContextMenuPtr contextMenu = instance->getInternal();
  43. contextMenu->addSeparator(nativePath, 0);
  44. }
  45. void ScriptContextMenu::internal_SetLocalizedName(ScriptContextMenu* instance, MonoString* label, ScriptHString* name)
  46. {
  47. if (label == nullptr || name == nullptr)
  48. return;
  49. WString nativeLabel = MonoUtil::monoToWString(label);
  50. GUIContextMenuPtr contextMenu = instance->getInternal();
  51. contextMenu->setLocalizedName(nativeLabel, name->getInternalValue());
  52. }
  53. void ScriptContextMenu::onContextMenuItemTriggered(UINT32 idx)
  54. {
  55. MonoUtil::invokeThunk(onEntryTriggered, getManagedInstance(), idx);
  56. }
  57. }