BsScriptContextMenu.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. #include "BsScriptGUILayout.h"
  13. #include "BsGUILayout.h"
  14. using namespace std::placeholders;
  15. namespace BansheeEngine
  16. {
  17. ScriptContextMenu::OnEntryTriggeredThunkDef ScriptContextMenu::onEntryTriggered;
  18. ScriptContextMenu::ScriptContextMenu(MonoObject* instance)
  19. : ScriptObject(instance)
  20. {
  21. mContextMenu = bs_shared_ptr_new<GUIContextMenu>();
  22. }
  23. void ScriptContextMenu::initRuntimeData()
  24. {
  25. metaData.scriptClass->addInternalCall("Internal_CreateInstance", &ScriptContextMenu::internal_CreateInstance);
  26. metaData.scriptClass->addInternalCall("Internal_Open", &ScriptContextMenu::internal_Open);
  27. metaData.scriptClass->addInternalCall("Internal_AddItem", &ScriptContextMenu::internal_AddItem);
  28. metaData.scriptClass->addInternalCall("Internal_AddSeparator", &ScriptContextMenu::internal_AddSeparator);
  29. metaData.scriptClass->addInternalCall("Internal_SetLocalizedName", &ScriptContextMenu::internal_SetLocalizedName);
  30. onEntryTriggered = (OnEntryTriggeredThunkDef)metaData.scriptClass->getMethod("InternalDoOnEntryTriggered", 1)->getThunk();
  31. }
  32. void ScriptContextMenu::internal_CreateInstance(MonoObject* instance)
  33. {
  34. new (bs_alloc<ScriptContextMenu>()) ScriptContextMenu(instance);
  35. }
  36. void ScriptContextMenu::internal_Open(ScriptContextMenu* instance, Vector2I* position, ScriptGUILayout* layoutPtr)
  37. {
  38. GUIElementBase* layout = layoutPtr->getGUIElement();
  39. GUIWidget* widget = layout->_getParentWidget();
  40. if (widget == nullptr)
  41. return;
  42. Rect2I bounds = layout->getGlobalBounds();
  43. Vector2I windowPosition = *position + Vector2I(bounds.x, bounds.y);
  44. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  45. contextMenu->open(windowPosition, *widget);
  46. }
  47. void ScriptContextMenu::internal_AddItem(ScriptContextMenu* instance, MonoString* path, UINT32 callbackIdx,
  48. ShortcutKey* shortcut)
  49. {
  50. WString nativePath = MonoUtil::monoToWString(path);
  51. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  52. contextMenu->addMenuItem(nativePath, std::bind(&ScriptContextMenu::onContextMenuItemTriggered,
  53. instance, callbackIdx), 0, *shortcut);
  54. }
  55. void ScriptContextMenu::internal_AddSeparator(ScriptContextMenu* instance, MonoString* path)
  56. {
  57. WString nativePath = MonoUtil::monoToWString(path);
  58. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  59. contextMenu->addSeparator(nativePath, 0);
  60. }
  61. void ScriptContextMenu::internal_SetLocalizedName(ScriptContextMenu* instance, MonoString* label, ScriptHString* name)
  62. {
  63. if (label == nullptr || name == nullptr)
  64. return;
  65. WString nativeLabel = MonoUtil::monoToWString(label);
  66. SPtr<GUIContextMenu> contextMenu = instance->getInternal();
  67. contextMenu->setLocalizedName(nativeLabel, name->getInternalValue());
  68. }
  69. void ScriptContextMenu::onContextMenuItemTriggered(UINT32 idx)
  70. {
  71. MonoUtil::invokeThunk(onEntryTriggered, getManagedInstance(), idx);
  72. }
  73. }