GraphVariablesTableView.h 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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 <QRegExp>
  12. #include <QString>
  13. #include <QSortFilterProxyModel>
  14. #include <QTableView>
  15. #include <AzCore/Component/EntityId.h>
  16. #include <AzCore/Memory/SystemAllocator.h>
  17. #include <AzCore/std/containers/vector.h>
  18. #include <ScriptCanvas/Bus/NodeIdPair.h>
  19. #include <ScriptCanvas/Variable/VariableBus.h>
  20. #include <GraphCanvas/Components/SceneBus.h>
  21. #include <GraphCanvas/Widgets/StyledItemDelegates/IconDecoratedNameDelegate.h>
  22. #endif
  23. namespace ScriptCanvasEditor
  24. {
  25. class GraphVariablesModel
  26. : public QAbstractTableModel
  27. , public ScriptCanvas::GraphVariableManagerNotificationBus::Handler
  28. , public ScriptCanvas::VariableNotificationBus::MultiHandler
  29. {
  30. Q_OBJECT
  31. public:
  32. enum ColumnIndex
  33. {
  34. Name,
  35. Type,
  36. DefaultValue,
  37. Scope,
  38. InitialValueSource,
  39. Count
  40. };
  41. static const char* m_columnNames[static_cast<int>(ColumnIndex::Count)];
  42. enum CustomRole
  43. {
  44. VarIdRole = Qt::UserRole
  45. };
  46. static const char* GetMimeType() { return "o3de/x-scriptcanvas-varpanel"; }
  47. AZ_CLASS_ALLOCATOR(GraphVariablesModel, AZ::SystemAllocator);
  48. GraphVariablesModel(QObject* parent = nullptr);
  49. ~GraphVariablesModel();
  50. // QAbstractTableModel
  51. int columnCount(const QModelIndex &parent = QModelIndex()) const override;
  52. int rowCount(const QModelIndex &parent = QModelIndex()) const override;
  53. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
  54. bool setData(const QModelIndex& index, const QVariant& value, int role) override;
  55. Qt::ItemFlags flags(const QModelIndex &index) const override;
  56. QStringList mimeTypes() const override;
  57. QMimeData* mimeData(const QModelIndexList &indexes) const override;
  58. ////
  59. void SetActiveScene(const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
  60. ScriptCanvas::ScriptCanvasId GetScriptCanvasId() const;
  61. // ScriptCanvas::GraphVariableManagerNotificationBus
  62. void OnVariableAddedToGraph(const ScriptCanvas::VariableId& variableId, AZStd::string_view variableName) override;
  63. void OnVariableRemovedFromGraph(const ScriptCanvas::VariableId& variableId, AZStd::string_view variableName) override;
  64. void OnVariableNameChangedInGraph(const ScriptCanvas::VariableId& variableId, AZStd::string_view variableName) override;
  65. ////
  66. // ScriptCanvas::VariableRuntimeNotificationBus
  67. void OnVariableValueChanged() override;
  68. void OnVariableScopeChanged() override;
  69. void OnVariableInitialValueSourceChanged() override;
  70. void OnVariablePriorityChanged() override;
  71. ////
  72. QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
  73. ScriptCanvas::VariableId FindVariableIdForIndex(const QModelIndex& index) const;
  74. ScriptCanvas::GraphScopedVariableId FindScopedVariableIdForIndex(const QModelIndex& index) const;
  75. int FindRowForVariableId(const ScriptCanvas::VariableId& variableId) const;
  76. bool IsFunction() const;
  77. signals:
  78. void VariableAdded(QModelIndex modelIndex);
  79. private:
  80. bool IsEditableType(ScriptCanvas::Data::Type scriptCanvasDataType) const;
  81. void PopulateSceneVariables();
  82. AZStd::vector<ScriptCanvas::GraphScopedVariableId> m_variableIds;
  83. ScriptCanvas::ScriptCanvasId m_scriptCanvasId;
  84. };
  85. class GraphVariablesModelSortFilterProxyModel
  86. : public QSortFilterProxyModel
  87. {
  88. Q_OBJECT
  89. public:
  90. AZ_CLASS_ALLOCATOR(GraphVariablesModelSortFilterProxyModel, AZ::SystemAllocator);
  91. GraphVariablesModelSortFilterProxyModel(QObject* parent);
  92. bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;
  93. bool lessThan(const QModelIndex& left, const QModelIndex& right) const override;
  94. void SetFilter(const QString& filter);
  95. private:
  96. QString m_filter;
  97. QRegExp m_filterRegex;
  98. ScriptCanvas::GraphVariable::Comparator m_variableComparator;
  99. };
  100. class GraphVariablesTableView
  101. : public QTableView
  102. , public GraphCanvas::SceneNotificationBus::Handler
  103. {
  104. Q_OBJECT
  105. public:
  106. static bool HasCopyVariableData();
  107. static void CopyVariableToClipboard(const ScriptCanvas::ScriptCanvasId& scriptCanvasId, const ScriptCanvas::VariableId& variableId);
  108. static bool HandleVariablePaste(const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
  109. AZ_CLASS_ALLOCATOR(GraphVariablesTableView, AZ::SystemAllocator);
  110. explicit GraphVariablesTableView(QWidget* parent);
  111. ~GraphVariablesTableView();
  112. void SetActiveScene(const ScriptCanvas::ScriptCanvasId& scriptCanvasId);
  113. void SetFilter(const QString& filterString);
  114. void EditVariableName(ScriptCanvas::VariableId variableId);
  115. // QObject
  116. void hideEvent(QHideEvent* event) override;
  117. void resizeEvent(QResizeEvent* event) override;
  118. ////
  119. // QTableView
  120. void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override;
  121. ////
  122. // GraphCanvas::SceneNotifications
  123. void OnSelectionChanged() override;
  124. ////
  125. void ApplyPreferenceSort();
  126. void ResizeColumns();
  127. public slots:
  128. void OnVariableAdded(QModelIndex modelIndex);
  129. void OnDeleteSelected();
  130. void OnCopySelected();
  131. void OnPaste();
  132. void OnDuplicate();
  133. void SetCycleTarget(ScriptCanvas::VariableId variableId);
  134. void CycleToNextVariableReference();
  135. void CycleToPreviousVariableReference();
  136. signals:
  137. void SelectionChanged(const AZStd::unordered_set< ScriptCanvas::VariableId >& variableIds);
  138. void DeleteVariables(const AZStd::unordered_set< ScriptCanvas::VariableId >& variableIds);
  139. private:
  140. void ConfigureHelper();
  141. AZ::EntityId m_graphCanvasGraphId;
  142. ScriptCanvas::ScriptCanvasId m_scriptCanvasId;
  143. GraphVariablesModelSortFilterProxyModel* m_proxyModel;
  144. GraphVariablesModel* m_model;
  145. QAction* m_nextInstanceAction;
  146. QAction* m_previousInstanceAction;
  147. ScriptCanvas::VariableId m_cyclingVariableId;
  148. GraphCanvas::NodeFocusCyclingHelper m_cyclingHelper;
  149. };
  150. }