NodePaletteModel.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #pragma once
  9. #include <AzCore/Memory/SystemAllocator.h>
  10. #include <AzCore/RTTI/RTTI.h>
  11. #include <AzCore/std/containers/unordered_map.h>
  12. #include <AzCore/std/string/string.h>
  13. #include <AzFramework/Asset/AssetSystemBus.h>
  14. #include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
  15. #include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
  16. #include <GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h>
  17. #include <ScriptEvents/ScriptEventsAsset.h>
  18. #include <Editor/Nodes/NodeCreateUtils.h>
  19. #include <Editor/View/Widgets/NodePalette/NodePaletteModelBus.h>
  20. #include <ScriptCanvas/Asset/RuntimeAsset.h>
  21. #include <ScriptCanvas/Core/Core.h>
  22. #include <Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h>
  23. namespace ScriptCanvasEditor
  24. {
  25. // Move these down into GraphCanvas for more general re-use
  26. struct NodePaletteModelInformation
  27. {
  28. AZ_RTTI(NodePaletteModelInformation, "{CC031806-7610-4C29-909D-9527F265E014}");
  29. AZ_CLASS_ALLOCATOR(NodePaletteModelInformation, AZ::SystemAllocator);
  30. virtual ~NodePaletteModelInformation() = default;
  31. void PopulateTreeItem(GraphCanvas::NodePaletteTreeItem& treeItem) const;
  32. ScriptCanvas::NodeTypeIdentifier m_nodeIdentifier{};
  33. AZStd::string m_displayName;
  34. AZStd::string m_toolTip;
  35. AZStd::string m_categoryPath;
  36. AZStd::string m_styleOverride;
  37. AZStd::string m_titlePaletteOverride;
  38. };
  39. struct CategoryInformation
  40. {
  41. AZStd::string m_styleOverride;
  42. AZStd::string m_paletteOverride = GraphCanvas::NodePaletteTreeItem::DefaultNodeTitlePalette;
  43. AZStd::string m_tooltip;
  44. };
  45. class NodePaletteModel
  46. : public GraphCanvas::CategorizerInterface
  47. , UpgradeNotificationsBus::Handler
  48. {
  49. public:
  50. typedef AZStd::unordered_map< ScriptCanvas::NodeTypeIdentifier, NodePaletteModelInformation* > NodePaletteRegistry;
  51. AZ_CLASS_ALLOCATOR(NodePaletteModel, AZ::SystemAllocator);
  52. NodePaletteModel();
  53. ~NodePaletteModel();
  54. NodePaletteId GetNotificationId() const;
  55. void AssignAssetModel(AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel);
  56. void RepopulateModel();
  57. void RegisterCustomNode(const AZ::SerializeContext::ClassData* classData, const AZStd::string& categoryPath = "Nodes");
  58. void RegisterClassNode(const AZStd::string& categoryPath, const AZStd::string& methodClass, const AZStd::string& methodName, const AZ::BehaviorMethod* behaviorMethod, const AZ::BehaviorContext* behaviorContext, ScriptCanvas::PropertyStatus propertyStatus, bool isOverload);
  59. void RegisterGlobalMethodNode(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod);
  60. void RegisterGlobalConstant(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorProperty* behaviorProperty, const AZ::BehaviorMethod& behaviorMethod);
  61. void RegisterEBusHandlerNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const AZ::BehaviorEBusHandler::BusForwarderEvent& forwardEvent);
  62. void RegisterEBusSenderNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventId, ScriptCanvas::PropertyStatus propertyStatus, bool isOverload);
  63. // Asset Based Registrations
  64. AZStd::vector<ScriptCanvas::NodeTypeIdentifier> RegisterScriptEvent(ScriptEvents::ScriptEventsAsset* scriptEventAsset);
  65. void RegisterDefaultCateogryInformation();
  66. void RegisterCategoryInformation(const AZStd::string& category, const CategoryInformation& categoryInformation);
  67. const CategoryInformation* FindCategoryInformation(const AZStd::string& categoryStyle) const;
  68. const CategoryInformation* FindBestCategoryInformation(AZStd::string_view categoryView) const;
  69. const NodePaletteModelInformation* FindNodePaletteInformation(const ScriptCanvas::NodeTypeIdentifier& nodeTypeIdentifier) const;
  70. const NodePaletteRegistry& GetNodeRegistry() const;
  71. // GraphCanvas::CategorizerInterface
  72. GraphCanvas::GraphCanvasTreeItem* CreateCategoryNode(AZStd::string_view categoryPath, AZStd::string_view categoryName, GraphCanvas::GraphCanvasTreeItem* treeItem) const override;
  73. ////
  74. void OnUpgradeStart() override
  75. {
  76. DisconnectLambdas();
  77. }
  78. // Asset Node Support
  79. void OnRowsInserted(const QModelIndex& parentIndex, int first, int last);
  80. void OnRowsAboutToBeRemoved(const QModelIndex& parentIndex, int first, int last);
  81. void TraverseTree(QModelIndex index = QModelIndex());
  82. ////
  83. private:
  84. AZStd::vector<ScriptCanvas::NodeTypeIdentifier> ProcessAsset(AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry);
  85. void RemoveAsset(const AZ::Data::AssetId& assetId);
  86. void ClearRegistry();
  87. void ConnectLambdas();
  88. void DisconnectLambdas();
  89. AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel = nullptr;
  90. AZStd::vector< QMetaObject::Connection > m_lambdaConnections;
  91. AZStd::unordered_map< AZStd::string, CategoryInformation > m_categoryInformation;
  92. NodePaletteRegistry m_registeredNodes;
  93. AZStd::unordered_multimap<AZ::Data::AssetId, ScriptCanvas::NodeTypeIdentifier> m_assetMapping;
  94. NodePaletteId m_paletteId;
  95. AZStd::recursive_mutex m_mutex;
  96. };
  97. // Concrete Sub Classes with whatever extra data is required [ScriptCanvas Only]
  98. struct CustomNodeModelInformation
  99. : public NodePaletteModelInformation
  100. {
  101. AZ_RTTI(CustomNodeModelInformation, "{481FB8AE-8683-4E50-95C1-B4B1C1B6806C}", NodePaletteModelInformation);
  102. AZ_CLASS_ALLOCATOR(CustomNodeModelInformation, AZ::SystemAllocator);
  103. AZ::Uuid m_typeId = AZ::Uuid::CreateNull();
  104. };
  105. struct MethodNodeModelInformation
  106. : public NodePaletteModelInformation
  107. {
  108. AZ_RTTI(MethodNodeModelInformation, "{9B6337F9-B8D0-4B63-9EE7-91079FE386B9}", NodePaletteModelInformation);
  109. AZ_CLASS_ALLOCATOR(MethodNodeModelInformation, AZ::SystemAllocator);
  110. bool m_isOverload{};
  111. AZStd::string m_classMethod;
  112. AZStd::string m_methodName;
  113. ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
  114. };
  115. struct GlobalMethodNodeModelInformation
  116. : public NodePaletteModelInformation
  117. {
  118. AZ_RTTI(GlobalMethodNodeModelInformation, "{AB98D0F1-BB6D-49D5-ACEB-3E991C365DF5}", NodePaletteModelInformation);
  119. AZ_CLASS_ALLOCATOR(GlobalMethodNodeModelInformation, AZ::SystemAllocator);
  120. AZStd::string m_methodName;
  121. bool m_isProperty;
  122. };
  123. struct EBusHandlerNodeModelInformation
  124. : public NodePaletteModelInformation
  125. {
  126. AZ_RTTI(EBusHandlerNodeModelInformation, "{D1438D14-0CE9-4202-A1C5-9F5F13DFC0C4}", NodePaletteModelInformation);
  127. AZ_CLASS_ALLOCATOR(EBusHandlerNodeModelInformation, AZ::SystemAllocator);
  128. AZStd::string m_busName;
  129. AZStd::string m_eventName;
  130. bool m_isOverload{};
  131. ScriptCanvas::EBusBusId m_busId;
  132. ScriptCanvas::EBusEventId m_eventId;
  133. };
  134. struct EBusSenderNodeModelInformation
  135. : public NodePaletteModelInformation
  136. {
  137. AZ_RTTI(EBusSenderNodeModelInformation, "{EE0F0385-3596-4D4E-9DC7-BE147EBB3C15}", NodePaletteModelInformation);
  138. AZ_CLASS_ALLOCATOR(EBusSenderNodeModelInformation, AZ::SystemAllocator);
  139. bool m_isOverload{};
  140. AZStd::string m_busName;
  141. AZStd::string m_eventName;
  142. ScriptCanvas::EBusBusId m_busId;
  143. ScriptCanvas::EBusEventId m_eventId;
  144. ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
  145. };
  146. struct ScriptEventHandlerNodeModelInformation
  147. : public EBusHandlerNodeModelInformation
  148. {
  149. AZ_RTTI(ScriptEventHandlerNodeModelInformation, "{BCA92869-63F4-4A1F-B751-F3F28443BBFC}", EBusHandlerNodeModelInformation);
  150. AZ_CLASS_ALLOCATOR(ScriptEventHandlerNodeModelInformation, AZ::SystemAllocator);
  151. };
  152. struct ScriptEventSenderNodeModelInformation
  153. : public EBusSenderNodeModelInformation
  154. {
  155. AZ_RTTI(ScriptEventSenderNodeModelInformation, "{99046345-080C-42A6-BE76-D09583055EED}", EBusSenderNodeModelInformation);
  156. AZ_CLASS_ALLOCATOR(ScriptEventSenderNodeModelInformation, AZ::SystemAllocator);
  157. };
  158. //! FunctionNodeModelInformation refers to function graph assets, not methods
  159. struct FunctionNodeModelInformation
  160. : public NodePaletteModelInformation
  161. {
  162. AZ_RTTI(FunctionNodeModelInformation, "{B84B4C2C-2F0B-4C0B-879A-956E83BD2874}", NodePaletteModelInformation);
  163. AZ_CLASS_ALLOCATOR(FunctionNodeModelInformation, AZ::SystemAllocator);
  164. AZ::Color m_functionColor;
  165. AZ::Data::AssetId m_functionAssetId;
  166. };
  167. }