ScriptCanvasNodePaletteDockWidget.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. #if !defined(Q_MOC_RUN)
  10. #include <AzCore/Component/EntityId.h>
  11. #include <AzCore/Memory/SystemAllocator.h>
  12. #include <AzCore/RTTI/RTTI.h>
  13. #include <AzCore/std/smart_ptr/unique_ptr.h>
  14. #include <AzFramework/Asset/AssetCatalogBus.h>
  15. #include <AzQtComponents/Components/StyledDockWidget.h>
  16. #include <AzToolsFramework/UI/UICore/QTreeViewStateSaver.hxx>
  17. #include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
  18. #include <GraphCanvas/Components/SceneBus.h>
  19. #include <GraphCanvas/Widgets/GraphCanvasTreeCategorizer.h>
  20. #include <GraphCanvas/Widgets/NodePalette/NodePaletteWidget.h>
  21. #include <GraphCanvas/Widgets/NodePalette/NodePaletteDockWidget.h>
  22. #include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
  23. #include <GraphCanvas/Editor/AssetEditorBus.h>
  24. #include <GraphCanvas/Utils/GraphUtils.h>
  25. #include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
  26. #include <ScriptCanvas/Components/EditorUtils.h>
  27. #include <ScriptCanvas/Core/Core.h>
  28. #endif
  29. class QToolButton;
  30. namespace ScriptCanvasEditor { class FunctionPaletteTreeItem; }
  31. namespace Ui
  32. {
  33. class ScriptCanvasNodePaletteToolbar;
  34. }
  35. namespace ScriptCanvasEditor
  36. {
  37. class ScriptEventsPaletteTreeItem;
  38. class NodePaletteModel;
  39. namespace Widget
  40. {
  41. struct NodePaletteWidget
  42. {
  43. static GraphCanvas::NodePaletteTreeItem* ExternalCreateNodePaletteRoot(const NodePaletteModel& nodePaletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel);
  44. };
  45. class ScriptCanvasRootPaletteTreeItem
  46. : public GraphCanvas::NodePaletteTreeItem
  47. , AzFramework::AssetCatalogEventBus::Handler
  48. , AZ::Data::AssetBus::MultiHandler
  49. , UpgradeNotificationsBus::Handler
  50. , AZ::SystemTickBus::Handler
  51. {
  52. public:
  53. AZ_CLASS_ALLOCATOR(ScriptCanvasRootPaletteTreeItem, AZ::SystemAllocator);
  54. ScriptCanvasRootPaletteTreeItem(const NodePaletteModel& nodePaletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel);
  55. ~ScriptCanvasRootPaletteTreeItem();
  56. void RegisterCategoryNode(GraphCanvas::GraphCanvasTreeItem* treeItem, const char* subCategory, GraphCanvas::NodePaletteTreeItem* parentRoot = nullptr);
  57. GraphCanvas::NodePaletteTreeItem* GetCategoryNode(const char* categoryPath, GraphCanvas::NodePaletteTreeItem* parentRoot = nullptr);
  58. void PruneEmptyNodes();
  59. void SetActiveScriptCanvasId(const ScriptCanvas::ScriptCanvasId& assetId);
  60. private:
  61. void OnRowsInserted(const QModelIndex& parentIndex, int first, int last);
  62. void OnRowsAboutToBeRemoved(const QModelIndex& parentIndex, int first, int last);
  63. void TraverseTree(QModelIndex index = QModelIndex());
  64. void ProcessAsset(AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry);
  65. // SystemTickBus
  66. void OnSystemTick() override;
  67. ////
  68. // AssetCatalogEventBus
  69. void OnCatalogAssetChanged(const AZ::Data::AssetId&) override;
  70. void OnCatalogAssetAdded(const AZ::Data::AssetId&) override;
  71. void OnCatalogAssetRemoved(const AZ::Data::AssetId&, const AZ::Data::AssetInfo&) override;
  72. ////
  73. // UpgradeNotifications::Bus
  74. void OnUpgradeStart() override;
  75. void OnUpgradeCancelled() override;
  76. ////
  77. void ConnectLambdas();
  78. void DisconnectLambdas();
  79. // Requests an async load of a given asset of a type
  80. void RequestAssetLoad(AZ::Data::AssetId assetId, AZ::Data::AssetType assetType);
  81. void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  82. void OnAssetReloaded(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  83. void OnAssetError(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
  84. bool HasAssetTreeItem(AZ::Data::AssetId assetId) const;
  85. void CreateFunctionPaletteItem(AZ::Data::Asset<AZ::Data::AssetData> asset, const AZ::Data::AssetInfo& assetInfo);
  86. void RequestBuildChildrenFromSubgraphInterface(NodePaletteTreeItem* item, AZ::Data::Asset<AZ::Data::AssetData> asset);
  87. AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel;
  88. GraphCanvas::GraphCanvasTreeCategorizer m_categorizer;
  89. AZ::Data::AssetId m_previousAssetId;
  90. AZStd::unordered_map< AZ::Data::AssetId, ScriptEventsPaletteTreeItem* > m_scriptEventElementTreeItems;
  91. AZStd::unordered_map< AZ::Data::AssetId, GraphCanvas::NodePaletteTreeItem*> m_globalFunctionTreeItems;
  92. AZStd::queue<AZStd::pair<AZ::Data::AssetId, AZ::Data::AssetType>> m_requestQueue;
  93. // RequestAssetLoad uses this set to track assets being asynchronously loaded
  94. AZStd::unordered_map<AZ::Data::AssetId, AZ::Data::Asset<AZ::Data::AssetData>> m_pendingAssets;
  95. AZStd::unordered_map< AZ::Data::AssetId, AZ::Data::Asset<AZ::Data::AssetData>> m_monitoredAssets;
  96. AZStd::vector< QMetaObject::Connection > m_lambdaConnections;
  97. };
  98. class ScriptCanvasNodePaletteToolbar
  99. : public QWidget
  100. {
  101. Q_OBJECT
  102. public:
  103. enum class FilterType
  104. {
  105. AllNodes
  106. };
  107. ScriptCanvasNodePaletteToolbar(QWidget* parent);
  108. signals:
  109. void OnFilterChanged(FilterType newFilter);
  110. void CreateDynamicEBus();
  111. private:
  112. AZStd::unique_ptr< Ui::ScriptCanvasNodePaletteToolbar > m_ui;
  113. };
  114. class ScriptCanvasNodePaletteConfig
  115. : public GraphCanvas::NodePaletteConfig
  116. {
  117. public:
  118. ScriptCanvasNodePaletteConfig(const NodePaletteModel& nodePaletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel, bool isInContextMenu);
  119. ~ScriptCanvasNodePaletteConfig();
  120. const NodePaletteModel& m_nodePaletteModel;
  121. AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel;
  122. };
  123. class NodePaletteDockWidget
  124. : public GraphCanvas::NodePaletteDockWidget
  125. , public GraphCanvas::AssetEditorNotificationBus::Handler
  126. , public GraphCanvas::SceneNotificationBus::Handler
  127. {
  128. public:
  129. AZ_CLASS_ALLOCATOR(NodePaletteDockWidget, AZ::SystemAllocator);
  130. static const char* GetMimeType() { return "scriptcanvas/node-palette-mime-event"; }
  131. NodePaletteDockWidget(const QString& windowLabel, QWidget* parent, const ScriptCanvasNodePaletteConfig& paletteConfig);
  132. ~NodePaletteDockWidget();
  133. void OnNewCustomEvent();
  134. void OnNewFunctionEvent();
  135. // GraphCanvas::AssetEditorNotificationBus::Handler
  136. void OnActiveGraphChanged(const GraphCanvas::GraphId& graphCanvasGraphId) override;
  137. ////
  138. // GraphCanvas::SceneNotificationBus
  139. void OnSelectionChanged() override;
  140. ////
  141. protected:
  142. GraphCanvas::GraphCanvasTreeItem* CreatePaletteRoot() const override;
  143. void OnTreeSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
  144. void AddCycleTarget(ScriptCanvas::NodeTypeIdentifier cyclingIdentifier);
  145. void ClearCycleTarget();
  146. void CycleToNextNode();
  147. void CycleToPreviousNode();
  148. private:
  149. void HandleTreeItemDoubleClicked(GraphCanvas::GraphCanvasTreeItem* treeItem);
  150. void OpenTranslationData();
  151. void GenerateTranslation();
  152. void NavigateToTranslationFile(GraphCanvas::NodePaletteTreeItem*);
  153. void ConfigureHelper();
  154. void ParseCycleTargets(GraphCanvas::GraphCanvasTreeItem* treeItem);
  155. AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_assetModel;
  156. const NodePaletteModel& m_nodePaletteModel;
  157. QToolButton* m_newCustomEvent;
  158. AZStd::unordered_set< ScriptCanvas::NodeTypeIdentifier > m_cyclingIdentifiers;
  159. GraphCanvas::NodeFocusCyclingHelper m_cyclingHelper;
  160. QAction* m_nextCycleAction;
  161. QAction* m_previousCycleAction;
  162. bool m_ignoreSelectionChanged;
  163. QMenu* m_contextMenu;
  164. QAction* m_openTranslationData;
  165. QAction* m_generateTranslation;
  166. };
  167. }
  168. }