3
0

GraphValidationDockWidget.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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 <QAbstractItemModel>
  11. #include <QIcon>
  12. #include <QSortFilterProxyModel>
  13. #include <AzCore/Debug/TraceMessageBus.h>
  14. #include <AzQtComponents/Components/StyledDockWidget.h>
  15. #include <AzToolsFramework/UI/Notifications/ToastBus.h>
  16. #include <GraphCanvas/Editor/AssetEditorBus.h>
  17. #include <GraphCanvas/Components/SceneBus.h>
  18. #include <ScriptCanvas/Debugger/ValidationEvents/ValidationEvent.h>
  19. #include <ScriptCanvas/Debugger/StatusBus.h>
  20. #endif
  21. namespace Ui
  22. {
  23. class GraphValidationPanel;
  24. }
  25. namespace ScriptCanvas
  26. {
  27. class ScopedDataConnectionEvent;
  28. class InvalidVariableTypeEvent;
  29. class ScriptEventVersionMismatch;
  30. }
  31. namespace ScriptCanvasEditor
  32. {
  33. //! Visual effect interface
  34. class ValidationEffect
  35. {
  36. public:
  37. AZ_CLASS_ALLOCATOR(ValidationEffect, AZ::SystemAllocator);
  38. virtual ~ValidationEffect() = default;
  39. virtual void DisplayEffect(const GraphCanvas::GraphId& graphId) = 0;
  40. virtual void CancelEffect() = 0;
  41. };
  42. //! Highlights the border of a graph element to display its status
  43. class HighlightElementValidationEffect
  44. : public ValidationEffect
  45. {
  46. public:
  47. AZ_CLASS_ALLOCATOR(HighlightElementValidationEffect, AZ::SystemAllocator);
  48. HighlightElementValidationEffect();
  49. HighlightElementValidationEffect(const QColor& color);
  50. HighlightElementValidationEffect(const GraphCanvas::SceneMemberGlowOutlineConfiguration& glowConfiguration);
  51. void AddTarget(const AZ::EntityId& targetId);
  52. void DisplayEffect(const GraphCanvas::GraphId& graphId) override;
  53. void CancelEffect() override;
  54. private:
  55. AZStd::vector< AZ::EntityId > m_targets;
  56. GraphCanvas::GraphId m_graphId;
  57. AZStd::vector< GraphCanvas::GraphicsEffectId > m_graphicEffectIds;
  58. GraphCanvas::SceneMemberGlowOutlineConfiguration m_templateConfiguration;
  59. };
  60. //! Effect used to show when a node is unused
  61. class UnusedNodeValidationEffect
  62. : public ValidationEffect
  63. {
  64. public:
  65. AZ_CLASS_ALLOCATOR(UnusedNodeValidationEffect, AZ::SystemAllocator)
  66. void AddUnusedNode(const AZ::EntityId& graphCanvasNodeId);
  67. void RemoveUnusedNode(const AZ::EntityId& graphCanvasNodeId);
  68. void DisplayEffect(const GraphCanvas::GraphId& graphId) override;
  69. void CancelEffect() override;
  70. public:
  71. void ClearStyleSelectors();
  72. void ApplySelector(const AZ::EntityId& nodeId, AZStd::string_view styleSelector);
  73. void RemoveSelector(const AZ::EntityId& nodeId);
  74. bool m_isDirty;
  75. AZStd::unordered_set< AZ::EntityId > m_unprocessedIds;
  76. AZStd::unordered_set< AZ::EntityId > m_rootUnusedNodes;
  77. AZStd::unordered_set< AZ::EntityId > m_inactiveNodes;
  78. AZStd::unordered_map< AZ::EntityId, AZStd::string > m_styleSelectors;
  79. };
  80. class GraphValidationModel
  81. : public QAbstractItemModel
  82. {
  83. Q_OBJECT
  84. public:
  85. AZ_CLASS_ALLOCATOR(GraphValidationModel, AZ::SystemAllocator);
  86. enum ColumnIndex
  87. {
  88. IndexForce = -1,
  89. Description,
  90. AutoFix,
  91. Count
  92. };
  93. GraphValidationModel();
  94. ~GraphValidationModel() override;
  95. void RunValidation(const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
  96. void AddEvents(ScriptCanvas::ValidationResults& validationEvents);
  97. void Clear();
  98. // QAbstractItemModel
  99. QModelIndex index(int row, int column, const QModelIndex& parent) const override;
  100. QModelIndex parent(const QModelIndex& index = QModelIndex()) const override;
  101. int columnCount(const QModelIndex& parent = QModelIndex()) const override;
  102. int rowCount(const QModelIndex& parent = QModelIndex()) const override;
  103. QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
  104. QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
  105. ////
  106. const ScriptCanvas::ValidationEvent* FindItemForIndex(const QModelIndex& index) const;
  107. const ScriptCanvas::ValidationEvent* FindItemForRow(int row) const;
  108. const ScriptCanvas::ValidationResults& GetValidationResults() const;
  109. private:
  110. ScriptCanvas::ValidationResults m_validationResults;
  111. QIcon m_errorIcon;
  112. QIcon m_warningIcon;
  113. QIcon m_messageIcon;
  114. QIcon m_autoFixIcon;
  115. };
  116. class GraphValidationSortFilterProxyModel
  117. : public QSortFilterProxyModel
  118. {
  119. Q_OBJECT
  120. public:
  121. AZ_CLASS_ALLOCATOR(GraphValidationSortFilterProxyModel, AZ::SystemAllocator);
  122. GraphValidationSortFilterProxyModel();
  123. bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;
  124. void SetFilter(const QString& filterString);
  125. void SetSeverityFilter(ScriptCanvas::ValidationSeverity severityFilter);
  126. ScriptCanvas::ValidationSeverity GetSeverityFilter() const;
  127. bool IsShowingErrors();
  128. bool IsShowingWarnings();
  129. private:
  130. ScriptCanvas::ValidationSeverity m_severityFilter;
  131. QString m_filter;
  132. QRegExp m_regex;
  133. };
  134. //! Owns the model for each currently opened graph
  135. class ValidationData
  136. : private ScriptCanvas::StatusRequestBus::Handler
  137. , private AzToolsFramework::ToastNotificationBus::MultiHandler
  138. {
  139. public:
  140. AZ_CLASS_ALLOCATOR(ValidationData, AZ::SystemAllocator);
  141. ValidationData();
  142. ValidationData(GraphCanvas::GraphId graphCanvasId, ScriptCanvas::ScriptCanvasId scriptCanvasId);
  143. ~ValidationData() override;
  144. // ScriptCanvas::StatusRequestBus
  145. void ValidateGraph(ScriptCanvas::ValidationResults& validationEvents) override;
  146. void ReportValidationResults(ScriptCanvas::ValidationResults& validationEvents) override;
  147. ////
  148. ValidationEffect* GetEffect(int row);
  149. void SetEffect(int row, ValidationEffect* effect);
  150. void ClearEffect(int row);
  151. void ClearEffects();
  152. GraphValidationModel* GetModel() { return m_model.get(); }
  153. void DisplayToast();
  154. private:
  155. // ToastNotification
  156. void OnToastInteraction() override;
  157. void OnToastDismissed() override;
  158. ////
  159. AZStd::unique_ptr<GraphValidationModel> m_model;
  160. using ValidationEffectMap = AZStd::unordered_map< int, ValidationEffect* >;
  161. ValidationEffectMap m_validationEffects;
  162. GraphCanvas::GraphId m_graphCanvasId;
  163. };
  164. //! Displays warnings or errors related for a Script Canvas graph
  165. class GraphValidationDockWidget
  166. : public AzQtComponents::StyledDockWidget
  167. , public GraphCanvas::AssetEditorNotificationBus::Handler
  168. , public GraphCanvas::SceneNotificationBus::Handler
  169. , public AzToolsFramework::ToastNotificationBus::Handler
  170. {
  171. Q_OBJECT
  172. public:
  173. AZ_CLASS_ALLOCATOR(GraphValidationDockWidget, AZ::SystemAllocator);
  174. GraphValidationDockWidget(QWidget* parent = nullptr);
  175. ~GraphValidationDockWidget();
  176. // GraphCanvas::AssetEditorNotificationBus::Handler
  177. void OnActiveGraphChanged(const GraphCanvas::GraphId& graphCanvasGraphId) override;
  178. ////
  179. // GrpahCanvas::SceneNotificationBus
  180. void OnSelectionChanged() override;
  181. void OnConnectionDragBegin() override;
  182. ////
  183. bool HasValidationIssues() const;
  184. public Q_SLOTS:
  185. void OnRunValidator(bool displayAsNotification = false);
  186. void OnShowErrors();
  187. void OnShowWarnings();
  188. void OnTableSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
  189. void FocusOnEvent(const QModelIndex& modelIndex);
  190. void TryAutoFixEvent(const QModelIndex& modelIndex);
  191. void FixSelected();
  192. void OnSeverityFilterChanged();
  193. void OnFilterChanged(const QString& filterString);
  194. private:
  195. // AutoFixes
  196. void AutoFixEvent(const ScriptCanvas::ValidationEvent* validationEvent);
  197. void AutoFixScopedDataConnection(const ScriptCanvas::ScopedDataConnectionEvent* connectionEvent);
  198. void AutoFixDeleteInvalidVariables(const ScriptCanvas::InvalidVariableTypeEvent* invalidVariableEvent);
  199. void AutoFixScriptEventVersionMismatch(const ScriptCanvas::ScriptEventVersionMismatch* scriptEventMismatchEvent);
  200. ////
  201. void UpdateText();
  202. void UpdateSelectedText();
  203. void OnRowSelected(int row);
  204. void OnRowDeselected(int row);
  205. void Refresh();
  206. GraphValidationSortFilterProxyModel* m_proxyModel;
  207. AZStd::unique_ptr<Ui::GraphValidationPanel> ui;
  208. UnusedNodeValidationEffect m_unusedNodeValidationEffect;
  209. //! Every graph will store its own validation model, this makes it possible to display the latest
  210. //! validation state even if the active graph changes
  211. using GraphModelPair = AZStd::pair<ScriptCanvas::ScriptCanvasId, AZStd::unique_ptr<ValidationData>>;
  212. AZStd::unordered_map<GraphCanvas::GraphId, GraphModelPair> m_models;
  213. const GraphValidationModel* GetActiveModel() const;
  214. GraphModelPair& GetActiveData();
  215. // We use the IDs of the active graph for different functions, so we keep both for easy access
  216. struct IdPair
  217. {
  218. GraphCanvas::GraphId graphCanvasId;
  219. ScriptCanvas::ScriptCanvasId scriptCanvasId;
  220. };
  221. IdPair m_activeGraphIds;
  222. };
  223. }