BsToolbarItemManager.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include "BsToolbarItemManager.h"
  2. #include "BsScriptAssemblyManager.h"
  3. #include "BsMonoAssembly.h"
  4. #include "BsMonoClass.h"
  5. #include "BsMonoMethod.h"
  6. #include "BsMonoField.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoUtil.h"
  9. #include "BsScriptObjectManager.h"
  10. #include "BsEditorWindowManager.h"
  11. #include "BsMainEditorWindow.h"
  12. #include "BsGUIMenuBar.h"
  13. #include "BsGUIContent.h"
  14. #include "BsScriptSpriteTexture.h"
  15. #include "BsScriptHString.h"
  16. using namespace std::placeholders;
  17. namespace BansheeEngine
  18. {
  19. ToolbarItemManager::ToolbarItemManager(ScriptAssemblyManager& scriptObjectManager)
  20. :mScriptObjectManager(scriptObjectManager), mToolbarItemAttribute(nullptr), mNameField(nullptr),
  21. mIconField(nullptr), mPriorityField(nullptr), mTooltipField(nullptr), mSeparatorField(nullptr)
  22. {
  23. mDomainLoadedConn = ScriptObjectManager::instance().onRefreshDomainLoaded.connect(std::bind(&ToolbarItemManager::reloadAssemblyData, this));
  24. reloadAssemblyData();
  25. }
  26. ToolbarItemManager::~ToolbarItemManager()
  27. {
  28. mDomainLoadedConn.disconnect();
  29. }
  30. void ToolbarItemManager::clearToolbarItems()
  31. {
  32. MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow();
  33. for (auto& toolbarItem : mToolbarItems)
  34. mainWindow->getMenuBar().removeToolBarButton(toolbarItem);
  35. }
  36. void ToolbarItemManager::reloadAssemblyData()
  37. {
  38. clearToolbarItems();
  39. // Reload MenuItem attribute from editor assembly
  40. MonoAssembly* editorAssembly = MonoManager::instance().getAssembly(EDITOR_ASSEMBLY);
  41. mToolbarItemAttribute = editorAssembly->getClass("BansheeEditor", "ToolbarItem");
  42. if (mToolbarItemAttribute == nullptr)
  43. BS_EXCEPT(InvalidStateException, "Cannot find ToolbarItem managed class.");
  44. mNameField = mToolbarItemAttribute->getField("name");
  45. mIconField = mToolbarItemAttribute->getField("icon");
  46. mTooltipField = mToolbarItemAttribute->getField("tooltip");
  47. mPriorityField = mToolbarItemAttribute->getField("priority");
  48. mSeparatorField = mToolbarItemAttribute->getField("separator");
  49. MainEditorWindow* mainWindow = EditorWindowManager::instance().getMainWindow();
  50. Vector<String> scriptAssemblyNames = mScriptObjectManager.getScriptAssemblies();
  51. for (auto& assemblyName : scriptAssemblyNames)
  52. {
  53. MonoAssembly* assembly = MonoManager::instance().getAssembly(assemblyName);
  54. // Find new menu item methods
  55. const Vector<MonoClass*>& allClasses = assembly->getAllClasses();
  56. for (auto curClass : allClasses)
  57. {
  58. const Vector<MonoMethod*>& methods = curClass->getAllMethods();
  59. for (auto& curMethod : methods)
  60. {
  61. String name;
  62. HSpriteTexture icon;
  63. HString tooltip;
  64. INT32 priority = 0;
  65. bool separator = false;
  66. if (parseToolbarItemMethod(curMethod, name, icon, tooltip, priority, separator))
  67. {
  68. std::function<void()> callback = std::bind(&ToolbarItemManager::toolbarItemCallback, curMethod);
  69. if (separator)
  70. {
  71. String sepName = "s__" + name;
  72. mainWindow->getMenuBar().addToolBarSeparator(sepName, priority);
  73. mToolbarItems.push_back(sepName);
  74. }
  75. GUIContent content(icon, tooltip);
  76. mainWindow->getMenuBar().addToolBarButton(name, content, callback, priority);
  77. mToolbarItems.push_back(name);
  78. }
  79. }
  80. }
  81. }
  82. }
  83. bool ToolbarItemManager::parseToolbarItemMethod(MonoMethod* method, String& name, HSpriteTexture& icon, HString& tooltip,
  84. INT32& priority, bool& separator) const
  85. {
  86. if (!method->hasAttribute(mToolbarItemAttribute))
  87. return false;
  88. if (method->getNumParameters() != 0)
  89. return false;
  90. if (!method->isStatic())
  91. return false;
  92. MonoObject* toolbarItemAttrib = method->getAttribute(mToolbarItemAttribute);
  93. MonoString* monoName;
  94. mNameField->getValue(toolbarItemAttrib, &monoName);
  95. name = MonoUtil::monoToString(monoName);
  96. MonoObject* monoTexture;
  97. mIconField->getValue(toolbarItemAttrib, &monoTexture);
  98. if (monoTexture != nullptr)
  99. {
  100. ScriptSpriteTexture* scriptTexture = ScriptSpriteTexture::toNative(monoTexture);
  101. if (scriptTexture != nullptr)
  102. icon = scriptTexture->getInternalValue();
  103. }
  104. MonoObject* tooltipMono;
  105. mTooltipField->getValue(toolbarItemAttrib, &tooltipMono);
  106. if (tooltipMono == nullptr)
  107. tooltip = HString::dummy();
  108. else
  109. {
  110. ScriptHString* tooltipScript = ScriptHString::toNative(tooltipMono);
  111. tooltip = tooltipScript->getInternalValue();
  112. }
  113. mPriorityField->getValue(toolbarItemAttrib, &priority);
  114. mSeparatorField->getValue(toolbarItemAttrib, &separator);
  115. return true;
  116. }
  117. void ToolbarItemManager::toolbarItemCallback(MonoMethod* method)
  118. {
  119. method->invoke(nullptr, nullptr);
  120. }
  121. }