BsScriptContextMenu.cpp 2.8 KB

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