BsToolbarItemManager.cpp 4.9 KB

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