| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- /*
- * Copyright (c) Contributors to the Open 3D Engine Project.
- * For complete copyright and license terms please see the LICENSE at the root of this distribution.
- *
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- */
- #pragma once
- #include <AzCore/Memory/SystemAllocator.h>
- #include <AzCore/RTTI/RTTI.h>
- #include <AzCore/std/containers/unordered_map.h>
- #include <AzCore/std/string/string.h>
- #include <AzFramework/Asset/AssetSystemBus.h>
- #include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
- #include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
- #include <GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h>
- #include <ScriptEvents/ScriptEventsAsset.h>
- #include <Editor/Nodes/NodeCreateUtils.h>
- #include <Editor/View/Widgets/NodePalette/NodePaletteModelBus.h>
- #include <ScriptCanvas/Asset/RuntimeAsset.h>
- #include <ScriptCanvas/Core/Core.h>
- #include <Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h>
- namespace ScriptCanvasEditor
- {
- // Move these down into GraphCanvas for more general re-use
- struct NodePaletteModelInformation
- {
- AZ_RTTI(NodePaletteModelInformation, "{CC031806-7610-4C29-909D-9527F265E014}");
- AZ_CLASS_ALLOCATOR(NodePaletteModelInformation, AZ::SystemAllocator);
- virtual ~NodePaletteModelInformation() = default;
- void PopulateTreeItem(GraphCanvas::NodePaletteTreeItem& treeItem) const;
- ScriptCanvas::NodeTypeIdentifier m_nodeIdentifier{};
- AZStd::string m_displayName;
- AZStd::string m_toolTip;
- AZStd::string m_categoryPath;
- AZStd::string m_styleOverride;
- AZStd::string m_titlePaletteOverride;
- };
- struct CategoryInformation
- {
- AZStd::string m_styleOverride;
- AZStd::string m_paletteOverride = GraphCanvas::NodePaletteTreeItem::DefaultNodeTitlePalette;
- AZStd::string m_tooltip;
- };
- class NodePaletteModel
- : public GraphCanvas::CategorizerInterface
- , UpgradeNotificationsBus::Handler
- {
- public:
- typedef AZStd::unordered_map< ScriptCanvas::NodeTypeIdentifier, NodePaletteModelInformation* > NodePaletteRegistry;
- AZ_CLASS_ALLOCATOR(NodePaletteModel, AZ::SystemAllocator);
- NodePaletteModel();
- ~NodePaletteModel();
- NodePaletteId GetNotificationId() const;
- void AssignAssetModel(AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel);
- void RepopulateModel();
- void RegisterCustomNode(const AZ::SerializeContext::ClassData* classData, const AZStd::string& categoryPath = "Nodes");
- 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);
- void RegisterGlobalMethodNode(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod);
- void RegisterGlobalConstant(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorProperty* behaviorProperty, const AZ::BehaviorMethod& behaviorMethod);
- void RegisterEBusHandlerNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const AZ::BehaviorEBusHandler::BusForwarderEvent& forwardEvent);
- 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);
- // Asset Based Registrations
- AZStd::vector<ScriptCanvas::NodeTypeIdentifier> RegisterScriptEvent(ScriptEvents::ScriptEventsAsset* scriptEventAsset);
- void RegisterDefaultCateogryInformation();
- void RegisterCategoryInformation(const AZStd::string& category, const CategoryInformation& categoryInformation);
- const CategoryInformation* FindCategoryInformation(const AZStd::string& categoryStyle) const;
- const CategoryInformation* FindBestCategoryInformation(AZStd::string_view categoryView) const;
- const NodePaletteModelInformation* FindNodePaletteInformation(const ScriptCanvas::NodeTypeIdentifier& nodeTypeIdentifier) const;
- const NodePaletteRegistry& GetNodeRegistry() const;
- // GraphCanvas::CategorizerInterface
- GraphCanvas::GraphCanvasTreeItem* CreateCategoryNode(AZStd::string_view categoryPath, AZStd::string_view categoryName, GraphCanvas::GraphCanvasTreeItem* treeItem) const override;
- ////
- void OnUpgradeStart() override
- {
- DisconnectLambdas();
- }
- // Asset Node Support
- void OnRowsInserted(const QModelIndex& parentIndex, int first, int last);
- void OnRowsAboutToBeRemoved(const QModelIndex& parentIndex, int first, int last);
- void TraverseTree(QModelIndex index = QModelIndex());
- ////
- private:
- AZStd::vector<ScriptCanvas::NodeTypeIdentifier> ProcessAsset(AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry);
- void RemoveAsset(const AZ::Data::AssetId& assetId);
- void ClearRegistry();
- void ConnectLambdas();
- void DisconnectLambdas();
- AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel = nullptr;
- AZStd::vector< QMetaObject::Connection > m_lambdaConnections;
- AZStd::unordered_map< AZStd::string, CategoryInformation > m_categoryInformation;
- NodePaletteRegistry m_registeredNodes;
- AZStd::unordered_multimap<AZ::Data::AssetId, ScriptCanvas::NodeTypeIdentifier> m_assetMapping;
- NodePaletteId m_paletteId;
- AZStd::recursive_mutex m_mutex;
- };
- // Concrete Sub Classes with whatever extra data is required [ScriptCanvas Only]
- struct CustomNodeModelInformation
- : public NodePaletteModelInformation
- {
- AZ_RTTI(CustomNodeModelInformation, "{481FB8AE-8683-4E50-95C1-B4B1C1B6806C}", NodePaletteModelInformation);
- AZ_CLASS_ALLOCATOR(CustomNodeModelInformation, AZ::SystemAllocator);
- AZ::Uuid m_typeId = AZ::Uuid::CreateNull();
- };
- struct MethodNodeModelInformation
- : public NodePaletteModelInformation
- {
- AZ_RTTI(MethodNodeModelInformation, "{9B6337F9-B8D0-4B63-9EE7-91079FE386B9}", NodePaletteModelInformation);
- AZ_CLASS_ALLOCATOR(MethodNodeModelInformation, AZ::SystemAllocator);
- bool m_isOverload{};
- AZStd::string m_classMethod;
- AZStd::string m_methodName;
- ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
- };
- struct GlobalMethodNodeModelInformation
- : public NodePaletteModelInformation
- {
- AZ_RTTI(GlobalMethodNodeModelInformation, "{AB98D0F1-BB6D-49D5-ACEB-3E991C365DF5}", NodePaletteModelInformation);
- AZ_CLASS_ALLOCATOR(GlobalMethodNodeModelInformation, AZ::SystemAllocator);
- AZStd::string m_methodName;
- bool m_isProperty;
- };
- struct EBusHandlerNodeModelInformation
- : public NodePaletteModelInformation
- {
- AZ_RTTI(EBusHandlerNodeModelInformation, "{D1438D14-0CE9-4202-A1C5-9F5F13DFC0C4}", NodePaletteModelInformation);
- AZ_CLASS_ALLOCATOR(EBusHandlerNodeModelInformation, AZ::SystemAllocator);
- AZStd::string m_busName;
- AZStd::string m_eventName;
- bool m_isOverload{};
- ScriptCanvas::EBusBusId m_busId;
- ScriptCanvas::EBusEventId m_eventId;
- };
- struct EBusSenderNodeModelInformation
- : public NodePaletteModelInformation
- {
- AZ_RTTI(EBusSenderNodeModelInformation, "{EE0F0385-3596-4D4E-9DC7-BE147EBB3C15}", NodePaletteModelInformation);
- AZ_CLASS_ALLOCATOR(EBusSenderNodeModelInformation, AZ::SystemAllocator);
- bool m_isOverload{};
- AZStd::string m_busName;
- AZStd::string m_eventName;
- ScriptCanvas::EBusBusId m_busId;
- ScriptCanvas::EBusEventId m_eventId;
- ScriptCanvas::PropertyStatus m_propertyStatus = ScriptCanvas::PropertyStatus::None;
- };
- struct ScriptEventHandlerNodeModelInformation
- : public EBusHandlerNodeModelInformation
- {
- AZ_RTTI(ScriptEventHandlerNodeModelInformation, "{BCA92869-63F4-4A1F-B751-F3F28443BBFC}", EBusHandlerNodeModelInformation);
- AZ_CLASS_ALLOCATOR(ScriptEventHandlerNodeModelInformation, AZ::SystemAllocator);
- };
- struct ScriptEventSenderNodeModelInformation
- : public EBusSenderNodeModelInformation
- {
- AZ_RTTI(ScriptEventSenderNodeModelInformation, "{99046345-080C-42A6-BE76-D09583055EED}", EBusSenderNodeModelInformation);
- AZ_CLASS_ALLOCATOR(ScriptEventSenderNodeModelInformation, AZ::SystemAllocator);
- };
- //! FunctionNodeModelInformation refers to function graph assets, not methods
- struct FunctionNodeModelInformation
- : public NodePaletteModelInformation
- {
- AZ_RTTI(FunctionNodeModelInformation, "{B84B4C2C-2F0B-4C0B-879A-956E83BD2874}", NodePaletteModelInformation);
- AZ_CLASS_ALLOCATOR(FunctionNodeModelInformation, AZ::SystemAllocator);
- AZ::Color m_functionColor;
- AZ::Data::AssetId m_functionAssetId;
- };
- }
|