BsScriptContextMenu.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Wrappers/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 "GUI/BsGUIContextMenu.h"
  11. #include "Wrappers/GUI/BsScriptGUILayout.h"
  12. #include "GUI/BsGUILayout.h"
  13. #include "Generated/BsScriptHString.generated.h"
  14. using namespace std::placeholders;
  15. namespace bs
  16. {
  17. ScriptContextMenu::OnEntryTriggeredThunkDef ScriptContextMenu::onEntryTriggered;
  18. ScriptContextMenu::ScriptContextMenu(MonoObject* instance)
  19. : ScriptObject(instance)
  20. {
  21. mGCHandle = MonoUtil::newWeakGCHandle(instance);
  22. mContextMenu = bs_shared_ptr_new<GUIContextMenu>();
  23. }
  24. void ScriptContextMenu::initRuntimeData()
  25. {
  26. metaData.scriptClass->addInternalCall("Internal_CreateInstance", (void*)&ScriptContextMenu::internal_CreateInstance);
  27. metaData.scriptClass->addInternalCall("Internal_Open", (void*)&ScriptContextMenu::internal_Open);
  28. metaData.scriptClass->addInternalCall("Internal_AddItem", (void*)&ScriptContextMenu::internal_AddItem);
  29. metaData.scriptClass->addInternalCall("Internal_AddSeparator", (void*)&ScriptContextMenu::internal_AddSeparator);
  30. metaData.scriptClass->addInternalCall("Internal_SetLocalizedName", (void*)&ScriptContextMenu::internal_SetLocalizedName);
  31. onEntryTriggered = (OnEntryTriggeredThunkDef)metaData.scriptClass->getMethod("InternalDoOnEntryTriggered", 1)->getThunk();
  32. }
  33. void ScriptContextMenu::internal_CreateInstance(MonoObject* instance)
  34. {
  35. new (bs_alloc<ScriptContextMenu>()) ScriptContextMenu(instance);
  36. }
  37. void ScriptContextMenu::internal_Open(ScriptContextMenu* instance, Vector2I* position, ScriptGUILayout* layoutPtr)
  38. {
  39. GUIElementBase* layout = layoutPtr->getGUIElement();
  40. GUIWidget* widget = layout->_getParentWidget();
  41. if (widget == nullptr)
  42. return;
  43. Rect2I bounds = layout->getGlobalBounds();
  44. Vector2I windowPosition = *position + Vector2I(bounds.x, bounds.y);
  45. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  46. contextMenu->open(windowPosition, *widget);
  47. }
  48. void ScriptContextMenu::internal_AddItem(ScriptContextMenu* instance, MonoString* path, UINT32 callbackIdx,
  49. ShortcutKey* shortcut)
  50. {
  51. String nativePath = MonoUtil::monoToString(path);
  52. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  53. contextMenu->addMenuItem(nativePath, std::bind(&ScriptContextMenu::onContextMenuItemTriggered,
  54. instance, callbackIdx), 0, *shortcut);
  55. }
  56. void ScriptContextMenu::internal_AddSeparator(ScriptContextMenu* instance, MonoString* path)
  57. {
  58. String nativePath = MonoUtil::monoToString(path);
  59. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  60. contextMenu->addSeparator(nativePath, 0);
  61. }
  62. void ScriptContextMenu::internal_SetLocalizedName(ScriptContextMenu* instance, MonoString* label, ScriptHString* name)
  63. {
  64. if (label == nullptr || name == nullptr)
  65. return;
  66. String nativeLabel = MonoUtil::monoToString(label);
  67. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  68. contextMenu->setLocalizedName(nativeLabel, *name->getInternal());
  69. }
  70. void ScriptContextMenu::onContextMenuItemTriggered(UINT32 idx)
  71. {
  72. MonoObject* instance = MonoUtil::getObjectFromGCHandle(mGCHandle);
  73. MonoUtil::invokeThunk(onEntryTriggered, instance, idx);
  74. }
  75. }