SceneComponent.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  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 <QGraphicsScene>
  10. #include <QRect>
  11. #include <QTimer>
  12. #include <AzCore/Component/Component.h>
  13. #include <AzCore/Component/EntityBus.h>
  14. #include <AzCore/Math/Vector2.h>
  15. #include <AzToolsFramework/API/ToolsApplicationAPI.h>
  16. #include <GraphCanvas/Components/Bookmarks/BookmarkBus.h>
  17. #include <GraphCanvas/Components/EntitySaveDataBus.h>
  18. #include <GraphCanvas/Components/GeometryBus.h>
  19. #include <GraphCanvas/Components/GraphCanvasPropertyBus.h>
  20. #include <GraphCanvas/Components/MimeDataHandlerBus.h>
  21. #include <GraphCanvas/Components/SceneBus.h>
  22. #include <GraphCanvas/Components/StyleBus.h>
  23. #include <GraphCanvas/Components/ViewBus.h>
  24. #include <GraphCanvas/Components/VisualBus.h>
  25. #include <GraphCanvas/Editor/AssetEditorBus.h>
  26. #include <GraphCanvas/GraphicsItems/GlowOutlineGraphicsItem.h>
  27. #include <GraphCanvas/Types/EntitySaveData.h>
  28. #include <GraphCanvas/Utils/StateControllers/StateController.h>
  29. #include <GraphCanvas/Utils/GraphUtils.h>
  30. #include <GraphCanvas/Utils/NodeNudgingController.h>
  31. class QAction;
  32. class QMimeData;
  33. namespace AZ
  34. {
  35. AZ_TYPE_INFO_SPECIALIZE(QGraphicsScene, "{C27E4829-BA47-4BAA-B9FD-C549ACF316B7}");
  36. }
  37. class QGraphicsItem;
  38. namespace GraphCanvas
  39. {
  40. class GraphCanvasGraphicsScene;
  41. class SceneHelper
  42. {
  43. public:
  44. AZ_CLASS_ALLOCATOR(SceneHelper, AZ::SystemAllocator, 0);
  45. SceneHelper() = default;
  46. virtual ~SceneHelper() = default;
  47. void SetSceneId(const AZ::EntityId& sceneId);
  48. const AZ::EntityId& GetSceneId() const;
  49. void SetEditorId(const EditorId& editorId);
  50. const EditorId& GetEditorId() const;
  51. protected:
  52. virtual void OnEditorIdSet();
  53. private:
  54. AZ::EntityId m_sceneId;
  55. EditorId m_editorId;
  56. };
  57. //! Separate class just to avoid over-cluttering the scene.
  58. //
  59. // Handles the creation process for nodes
  60. class MimeDelegateSceneHelper
  61. : public SceneHelper
  62. , public SceneMimeDelegateHandlerRequestBus::Handler
  63. {
  64. public:
  65. AZ_CLASS_ALLOCATOR(MimeDelegateSceneHelper, AZ::SystemAllocator, 0);
  66. MimeDelegateSceneHelper() = default;
  67. ~MimeDelegateSceneHelper() = default;
  68. void Activate();
  69. void Deactivate();
  70. void SetMimeType(const char* mimeType);
  71. const QString& GetMimeType() const;
  72. bool HasMimeType() const;
  73. // SceneMimeDelegateHandlerRequestBus
  74. bool IsInterestedInMimeData(const AZ::EntityId& sceneId, const QMimeData* dragEnterEvent) override;
  75. void HandleMove(const AZ::EntityId& sceneId, const QPointF& dropPoint, const QMimeData* mimeData) override;
  76. void HandleDrop(const AZ::EntityId& sceneId, const QPointF& dropPoint, const QMimeData* mimeData) override;
  77. void HandleLeave(const AZ::EntityId& sceneId, const QMimeData* mimeData) override;
  78. ////
  79. void SignalNodeCreated(const NodeId& nodeId);
  80. private:
  81. void OnTrySplice();
  82. void CancelSplice();
  83. void PushUndoBlock();
  84. void PopUndoBlock();
  85. void AssignLastCreationToGroup();
  86. QString m_mimeType;
  87. NodeNudgingController m_nudgingController;
  88. QTimer m_spliceTimer;
  89. AZ::EntityId m_targetConnection;
  90. bool m_enableConnectionSplicing;
  91. QByteArray m_splicingData;
  92. AZ::EntityId m_splicingNode;
  93. QPainterPath m_splicingPath;
  94. AZ::Vector2 m_positionOffset;
  95. QPointF m_targetPosition;
  96. Endpoint m_spliceSource;
  97. Endpoint m_spliceTarget;
  98. AZStd::vector< ConnectionEndpoints > m_opportunisticSpliceRemovals;
  99. bool m_pushedUndoBlock;
  100. StateSetter<RootGraphicsItemDisplayState> m_displayStateStateSetter;
  101. AZ::EntityId m_groupTarget;
  102. StateSetter<RootGraphicsItemDisplayState> m_groupTargetStateSetter;
  103. AZStd::unordered_set< NodeId > m_lastCreationGroup;
  104. };
  105. // Handles identifying Gestures for the Scene.
  106. // Helper class just to avoid overcomplicating the actual scene class
  107. class GestureSceneHelper
  108. : public SceneHelper
  109. , public GeometryNotificationBus::Handler
  110. , public SceneNotificationBus::Handler
  111. , public AZ::SystemTickBus::Handler
  112. {
  113. public:
  114. AZ_CLASS_ALLOCATOR(GestureSceneHelper, AZ::SystemAllocator, 0);
  115. GestureSceneHelper() = default;
  116. ~GestureSceneHelper() = default;
  117. void Activate();
  118. void Deactivate();
  119. void TrackElement(const AZ::EntityId& elementId);
  120. void ResetTracker();
  121. void StopTrack();
  122. // GeometryNotificationBus
  123. void OnPositionChanged(const AZ::EntityId& itemId, const AZ::Vector2& position) override;
  124. ////
  125. void OnSettingsChanged();
  126. // SystemTickBus
  127. void OnSystemTick() override;
  128. ////
  129. protected:
  130. void OnEditorIdSet() override;
  131. private:
  132. void HandleDesplice();
  133. QTimer m_timer;
  134. bool m_handleShakeAction = false;
  135. bool m_trackShake = false;
  136. AZ::EntityId m_trackingTarget;
  137. float m_movementTolerance = 0.0f;
  138. float m_minimumDistance = 0.0f;
  139. float m_straightnessPercent = 0.0f;
  140. int m_shakeThreshold = 0;
  141. int m_shakeCounter = 0;
  142. QPointF m_currentAnchor;
  143. QPointF m_lastPoint;
  144. AZ::Vector2 m_lastDirection;
  145. bool m_hasDirection = false;
  146. };
  147. struct SceneMemberBuckets
  148. {
  149. AZStd::unordered_set< AZ::EntityId > m_nodes;
  150. AZStd::unordered_set< AZ::EntityId > m_connections;
  151. AZStd::unordered_set< AZ::EntityId > m_bookmarkAnchors;
  152. };
  153. class SceneComponent
  154. : public GraphCanvasPropertyComponent
  155. , public AZ::EntityBus::Handler
  156. , public SceneRequestBus::Handler
  157. , public GeometryNotificationBus::MultiHandler
  158. , public VisualNotificationBus::MultiHandler
  159. , public ViewNotificationBus::Handler
  160. , public SceneMimeDelegateRequestBus::Handler
  161. , public EntitySaveDataRequestBus::Handler
  162. , public SceneBookmarkActionBus::Handler
  163. , public StyleManagerNotificationBus::Handler
  164. , public AZ::SystemTickBus::Handler
  165. , public AssetEditorSettingsNotificationBus::Handler
  166. {
  167. private:
  168. friend class GraphCanvasGraphicsScene;
  169. friend class SceneComponentSaveData;
  170. public:
  171. AZ_COMPONENT(SceneComponent, "{3F71486C-3D51-431F-B904-DA070C7A0238}", GraphCanvasPropertyComponent);
  172. static void Reflect(AZ::ReflectContext* context);
  173. struct GraphCanvasConstructSaveData
  174. {
  175. AZ_CLASS_ALLOCATOR(GraphCanvasConstructSaveData, AZ::SystemAllocator, 0);
  176. AZ_RTTI(GraphCanvasConstructSaveData, "{C074944F-8218-4753-94EE-1C5CC02DE8E4}");
  177. static bool VersionConverter(AZ::SerializeContext& serializeContext, AZ::SerializeContext::DataElementNode& classElement);
  178. // Put the invalid thing at the end of the list, instead of the start.
  179. // Cannot actually add new elements to this list.
  180. //
  181. // Going to make a new enum rather then try to salvage this.
  182. enum class GraphCanvasConstructType
  183. {
  184. CommentNode,
  185. BlockCommentNode,
  186. BookmarkAnchor,
  187. Unknown,
  188. };
  189. virtual ~GraphCanvasConstructSaveData() = default;
  190. ConstructType m_constructType = ConstructType::Unknown;
  191. EntitySaveDataContainer m_saveDataContainer;
  192. AZ::EntityId m_persistentId;
  193. };
  194. class SceneComponentSaveData
  195. : public ComponentSaveData
  196. {
  197. public:
  198. AZ_RTTI(SceneComponentSaveData, "{5F84B500-8C45-40D1-8EFC-A5306B241444}", ComponentSaveData);
  199. AZ_CLASS_ALLOCATOR(SceneComponentSaveData, AZ::SystemAllocator, 0);
  200. SceneComponentSaveData()
  201. : m_bookmarkCounter(0)
  202. {
  203. }
  204. ~SceneComponentSaveData()
  205. {
  206. ClearConstructData();
  207. }
  208. void ClearConstructData()
  209. {
  210. for (GraphCanvasConstructSaveData* saveData : m_constructs)
  211. {
  212. delete saveData;
  213. }
  214. m_constructs.clear();
  215. }
  216. AZStd::vector< GraphCanvasConstructSaveData* > m_constructs;
  217. ViewParams m_viewParams;
  218. AZ::u32 m_bookmarkCounter;
  219. };
  220. SceneComponent();
  221. ~SceneComponent() override;
  222. // AZ::Component
  223. static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided)
  224. {
  225. provided.push_back(AZ_CRC("GraphCanvas_SceneService", 0x8ec010e7));
  226. provided.push_back(AZ_CRC("GraphCanvas_MimeDataHandlerService", 0x7a6beb5a));
  227. }
  228. static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incombatible)
  229. {
  230. incombatible.push_back(AZ_CRC("GraphCanvas_SceneService", 0x8ec010e7));
  231. incombatible.push_back(AZ_CRC("GraphCanvas_MimeDataHandlerService", 0x7a6beb5a));
  232. }
  233. static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& /*dependent*/)
  234. {
  235. }
  236. static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& /*required*/)
  237. {
  238. }
  239. void Init() override;
  240. void Activate() override;
  241. void Deactivate() override;
  242. ////
  243. // SystemTickBus
  244. void OnSystemTick() override;
  245. ////
  246. // EntityBus
  247. void OnEntityExists(const AZ::EntityId& entityId) override;
  248. ////
  249. // EntitySaveDataRequest
  250. void WriteSaveData(EntitySaveDataContainer& saveDataContainer) const override;
  251. void ReadSaveData(const EntitySaveDataContainer& saveDataContainer) override;
  252. ////
  253. SceneRequests* GetSceneRequests() { return this; }
  254. const SceneRequests* GetSceneRequestsConst() const { return this; }
  255. GraphData* GetGraphData() override { return &m_graphData; };
  256. const GraphData* GetGraphDataConst() const override { return &m_graphData; };
  257. // SceneRequestBus
  258. AZStd::any* GetUserData() override;
  259. const AZStd::any* GetUserDataConst() const override;
  260. AZ::Entity* GetSceneEntity() const override { return GetEntity(); }
  261. void SetEditorId(const EditorId& editorId) override;
  262. EditorId GetEditorId() const override;
  263. AZ::EntityId GetGrid() const override;
  264. GraphicsEffectId CreatePulse(const AnimatedPulseConfiguration& pulseConfiguration) override;
  265. GraphicsEffectId CreatePulseAroundArea(const QRectF& area, int gridSteps, AnimatedPulseConfiguration& pulseConfiguration) override;
  266. GraphicsEffectId CreatePulseAroundSceneMember(const AZ::EntityId& memberId, int gridSteps, AnimatedPulseConfiguration configuration) override;
  267. GraphicsEffectId CreateCircularPulse(const AZ::Vector2& centerPoint, float initialRadius, float finalRadius, AnimatedPulseConfiguration configuration) override;
  268. GraphicsEffectId CreateOccluder(const OccluderConfiguration& occluderConfiguration) override;
  269. GraphicsEffectId CreateGlow(const FixedGlowOutlineConfiguration& configuration) override;
  270. GraphicsEffectId CreateGlowOnSceneMember(const SceneMemberGlowOutlineConfiguration& configuration) override;
  271. GraphicsEffectId CreateParticle(const ParticleConfiguration& configuration) override;
  272. AZStd::vector< GraphicsEffectId > ExplodeSceneMember(const AZ::EntityId& memberId, float fillPercent) override;
  273. void CancelGraphicsEffect(const GraphicsEffectId& effectId) override;
  274. bool AddNode(const AZ::EntityId& nodeId, const AZ::Vector2& position, bool isPaste) override;
  275. void AddNodes(const AZStd::vector<AZ::EntityId>& nodeIds) override;
  276. bool RemoveNode(const AZ::EntityId& nodeId) override;
  277. AZStd::vector<AZ::EntityId> GetNodes() const override;
  278. AZStd::vector<AZ::EntityId> GetSelectedNodes() const override;
  279. void DeleteNodeAndStitchConnections(const AZ::EntityId& node) override;
  280. AZ::EntityId CreateConnectionBetween(const Endpoint& sourceEndpoint, const Endpoint& targetEndpoint) override;
  281. bool AddConnection(const AZ::EntityId& connectionId) override;
  282. void AddConnections(const AZStd::vector<AZ::EntityId>& connectionIds) override;
  283. bool RemoveConnection(const AZ::EntityId& connectionId) override;
  284. AZStd::vector<AZ::EntityId> GetConnections() const override;
  285. AZStd::vector<AZ::EntityId> GetSelectedConnections() const override;
  286. AZStd::vector<AZ::EntityId> GetConnectionsForEndpoint(const Endpoint& firstEndpoint) const override;
  287. bool IsEndpointConnected(const Endpoint& endpoint) const override;
  288. AZStd::vector<Endpoint> GetConnectedEndpoints(const Endpoint& firstEndpoint) const override;
  289. bool CreateConnection(const Endpoint& sourceEndpoint, const Endpoint& targetEndpoint) override;
  290. bool DisplayConnection(const Endpoint& sourceEndpoint, const Endpoint& targetEndpoint) override;
  291. bool Disconnect(const Endpoint&, const Endpoint&) override;
  292. bool DisconnectById(const AZ::EntityId& connectionId) override;
  293. bool FindConnection(AZ::Entity*& connectionEntity, const Endpoint& firstEndpoint, const Endpoint& otherEndpoint) const override;
  294. bool AddBookmarkAnchor(const AZ::EntityId& bookmarkAnchorId, const AZ::Vector2& position) override;
  295. bool RemoveBookmarkAnchor(const AZ::EntityId& bookmarkAnchorId) override;
  296. bool Add(const AZ::EntityId& entity, bool isPaste = false) override;
  297. bool Remove(const AZ::EntityId& entity) override;
  298. bool Show(const AZ::EntityId& graphMemeber) override;
  299. bool Hide(const AZ::EntityId& graphMemeber) override;
  300. bool IsHidden(const AZ::EntityId& graphMember) const override;
  301. bool Enable(const NodeId& nodeId) override;
  302. void EnableVisualState(const NodeId& nodeId) override;
  303. void EnableSelection() override;
  304. bool Disable(const NodeId& nodeId) override;
  305. void DisableVisualState(const NodeId& nodeId) override;
  306. void DisableSelection() override;
  307. void ProcessEnableDisableQueue() override;
  308. void ClearSelection() override;
  309. void SetSelectedArea(const AZ::Vector2& topLeft, const AZ::Vector2& topRight) override;
  310. void SelectAll() override;
  311. void SelectAllRelative(ConnectionType connectionType) override;
  312. void SelectConnectedNodes() override;
  313. bool HasSelectedItems() const override;
  314. bool HasMultipleSelection() const override;
  315. bool HasCopiableSelection() const override;
  316. bool HasEntitiesAt(const AZ::Vector2& scenePoint) const override;
  317. AZStd::vector<AZ::EntityId> GetSelectedItems() const override;
  318. QGraphicsScene* AsQGraphicsScene() override;
  319. void CopySelection() const override;
  320. void Copy(const AZStd::vector<AZ::EntityId>& itemIds) const override;
  321. void CutSelection() override;
  322. void Cut(const AZStd::vector<AZ::EntityId>& itemIds) override;
  323. void Paste() override;
  324. void PasteAt(const QPointF& scenePos) override;
  325. void SerializeEntities(const AZStd::unordered_set<AZ::EntityId>& itemIds, GraphSerialization& serializationTarget) const override;
  326. void DeserializeEntities(const QPointF& scenePos, const GraphSerialization& serializationTarget) override;
  327. void DuplicateSelection() override;
  328. void DuplicateSelectionAt(const QPointF& scenePos) override;
  329. void Duplicate(const AZStd::vector<AZ::EntityId>& itemIds) override;
  330. void DuplicateAt(const AZStd::vector<AZ::EntityId>& itemIds, const QPointF& scenePos) override;
  331. void DeleteSelection() override;
  332. void Delete(const AZStd::unordered_set<AZ::EntityId>& itemIds) override;
  333. void DeleteGraphData(const GraphData& graphData) override;
  334. void ClearScene() override;
  335. void SuppressNextContextMenu() override;
  336. const AZStd::string& GetCopyMimeType() const override;
  337. void SetMimeType(const char* mimeType) override;
  338. AZStd::vector<AZ::EntityId> GetEntitiesAt(const AZ::Vector2& position) const override;
  339. AZStd::vector<AZ::EntityId> GetEntitiesInRect(const QRectF& rect, Qt::ItemSelectionMode mode) const override;
  340. AZStd::vector<Endpoint> GetEndpointsInRect(const QRectF& rect) const override;
  341. void RegisterView(const AZ::EntityId& viewId) override;
  342. void RemoveView(const AZ::EntityId& viewId) override;
  343. ViewId GetViewId() const override;
  344. void DispatchSceneDropEvent(const AZ::Vector2& scenePos, const QMimeData* mimeData) override;
  345. bool AddGraphData(const GraphData& graphData) override;
  346. void RemoveGraphData(const GraphData& graphData) override;
  347. void SetDragSelectionType(DragSelectionType dragSelectionType) override;
  348. void SignalDragSelectStart() override;
  349. void SignalDragSelectEnd() override;
  350. bool IsDragSelecting() const override;
  351. void SignalConnectionDragBegin() override;
  352. void SignalConnectionDragEnd() override;
  353. bool IsDraggingConnection() const override;
  354. void SignalDesplice() override;
  355. QRectF GetSelectedSceneBoundingArea() const override;
  356. QRectF GetSceneBoundingArea() const override;
  357. void SignalLoadStart() override;
  358. void SignalLoadEnd() override;
  359. bool IsLoading() const override;
  360. bool IsPasting() const override;
  361. void RemoveUnusedNodes() override;
  362. void RemoveUnusedElements() override;
  363. void HandleProposalDaisyChainWithGroup(const NodeId& startNode, SlotType slotType, ConnectionType connectionType, const QPoint& screenPoint, const QPointF& focusPoint, AZ::EntityId targetId) override;
  364. void StartNudging(const AZStd::unordered_set<AZ::EntityId>& fixedNodes) override;
  365. void FinalizeNudging() override;
  366. void CancelNudging() override;
  367. AZ::EntityId FindTopmostGroupAtPoint(QPointF scenePoint) override;
  368. QPointF SignalGenericAddPositionUseBegin() override;
  369. void SignalGenericAddPositionUseEnd() override;
  370. ////
  371. bool AllowContextMenu() const;
  372. // VisualNotificationBus
  373. bool OnMousePress(const AZ::EntityId& sourceId, const QGraphicsSceneMouseEvent* mouseEvent) override;
  374. bool OnMouseRelease(const AZ::EntityId& sourceId, const QGraphicsSceneMouseEvent* mouseEvent) override;
  375. ////
  376. // GeometryNotificationBus
  377. void OnPositionChanged(const AZ::EntityId& itemId, const AZ::Vector2& position) override;
  378. ////
  379. // ViewNotificationBus
  380. void OnEscape() override;
  381. void OnViewParamsChanged(const ViewParams& viewParams) override;
  382. ////
  383. // MimeDelegateRequestBus
  384. void AddDelegate(const AZ::EntityId& delegateId) override;
  385. void RemoveDelegate(const AZ::EntityId& delegateId) override;
  386. ////
  387. // SceneBookmarkActionBus
  388. AZ::u32 GetNewBookmarkCounter() override;
  389. ////
  390. // StyleManagerNotificationBus
  391. void OnStylesLoaded() override;
  392. ////
  393. // AssetEditorSettingsNotificationBus
  394. void OnSettingsChanged() override;
  395. ////
  396. protected:
  397. void ConfigureAndAddGraphicsEffect(GraphicsEffectInterface* graphicsEffect);
  398. void OnSceneDragEnter(const QMimeData* mimeData);
  399. void OnSceneDragMoveEvent(const QPointF& scenePoint, const QMimeData* mimeData);
  400. void OnSceneDropEvent(const QPointF& scenePoint, const QMimeData* mimeData);
  401. void OnSceneDragExit(const QMimeData* mimeData);
  402. bool HasActiveMimeDelegates() const;
  403. private:
  404. SceneComponent(const SceneComponent&) = delete;
  405. template<typename Container>
  406. void InitItems(const Container& entities) const;
  407. template<typename Container>
  408. void ActivateItems(const Container& entities);
  409. template<typename Container>
  410. void DeactivateItems(const Container& entities);
  411. template<typename Container>
  412. void DestroyItems(const Container& entities) const;
  413. void DestroyGraphicsItem(const GraphicsEffectId& effectId, QGraphicsItem* graphicsItem);
  414. void InitConnections();
  415. void NotifyConnectedSlots();
  416. void OnSelectionChanged();
  417. void RegisterSelectionItem(const AZ::EntityId& itemId);
  418. void UnregisterSelectionItem(const AZ::EntityId& itemId);
  419. void AddSceneMember(const AZ::EntityId& item, bool positionItem = false, const AZ::Vector2& position = AZ::Vector2());
  420. void RemoveItemFromScene(QGraphicsItem* item);
  421. //! Seives a set of entity id's into a node, connection and group entityId set based on if they are in the scene
  422. void SieveSceneMembers(const AZStd::unordered_set<AZ::EntityId>& itemIds, SceneMemberBuckets& buckets) const;
  423. QPointF GetViewCenterScenePoint() const;
  424. void OnDragCursorMove(const QPointF& mousePosition);
  425. void DetermineDragGroupTarget(const QPointF& cursorPoint);
  426. AZ::EntityId FindGroupTarget(const QPointF& scenePoint, const AZStd::unordered_set<AZ::EntityId>& ignoreElement = {});
  427. void OnTrySplice();
  428. void InitiateSpliceToNode(const NodeId& nodeId);
  429. void InitiateSpliceToConnection(const AZStd::vector<ConnectionId>& connectionIds);
  430. bool m_allowReset;
  431. QPointF m_genericAddOffset;
  432. int m_deleteCount;
  433. AZStd::string m_copyMimeType;
  434. AZ::EntityId m_grid;
  435. AZStd::unordered_map<QGraphicsItem*, AZ::EntityId> m_itemLookup;
  436. ViewId m_viewId;
  437. ViewParams m_viewParams;
  438. MimeDelegateSceneHelper m_mimeDelegateSceneHelper;
  439. GestureSceneHelper m_gestureSceneHelper;
  440. AZStd::unordered_set< QGraphicsItem* > m_hiddenElements;
  441. GraphData m_graphData;
  442. AZStd::vector< GraphicsEffectId > m_activeParticles;
  443. AZStd::unordered_set<NodeId> m_queuedEnable;
  444. AZStd::unordered_set<NodeId> m_queuedDisable;
  445. AZStd::unordered_set<NodeId> m_queuedVisualEnable;
  446. AZStd::unordered_set<NodeId> m_queuedVisualDisable;
  447. AZStd::unordered_set<AZ::EntityId> m_delegates;
  448. AZStd::unordered_set<AZ::EntityId> m_activeDelegates;
  449. AZStd::unordered_set<AZ::EntityId> m_interestedDelegates;
  450. AZStd::unordered_set<AZ::EntityId> m_ignoredDragTargets;
  451. AZStd::unordered_set<AZ::EntityId> m_draggedGroupableElements;
  452. AZ::EntityId m_dragTargetGroup;
  453. StateSetter< RootGraphicsItemDisplayState > m_forcedGroupDisplayStateStateSetter;
  454. StateSetter< AZStd::string > m_forcedLayerStateSetter;
  455. bool m_isLoading;
  456. bool m_isPasting;
  457. AZStd::unique_ptr<GraphCanvasGraphicsScene> m_graphicsSceneUi;
  458. DragSelectionType m_dragSelectionType;
  459. bool m_activateScene;
  460. bool m_isDragSelecting;
  461. AZ::EntityId m_inputCouplingTarget;
  462. AZ::EntityId m_outputCouplingTarget;
  463. AZ::EntityId m_couplingTarget;
  464. AZ::EntityId m_pressedEntity;
  465. AZ::Vector2 m_originalPosition;
  466. bool m_forceDragReleaseUndo;
  467. bool m_isDraggingEntity;
  468. bool m_isDraggingConnection;
  469. // Elements for handling with the drag onto objects
  470. QTimer m_spliceTimer;
  471. bool m_enableSpliceTracking;
  472. bool m_enableNodeDragConnectionSpliceTracking;
  473. bool m_enableNodeDragCouplingTracking;
  474. bool m_enableNodeChainDragConnectionSpliceTracking;
  475. bool m_enableNudging;
  476. NodeNudgingController m_nudgingController;
  477. AZ::EntityId m_spliceTarget;
  478. GraphSubGraph m_selectedSubGraph;
  479. StateSetter<RootGraphicsItemDisplayState> m_spliceTargetDisplayStateStateSetter;
  480. StateSetter<RootGraphicsItemDisplayState> m_pressedEntityDisplayStateStateSetter;
  481. StateSetter<RootGraphicsItemDisplayState> m_couplingEntityDisplayStateStateSetter;
  482. ////
  483. AZ::u32 m_bookmarkCounter;
  484. EditorId m_editorId;
  485. };
  486. //! This is the is Qt Ui QGraphicsScene elements that is stored in the GraphCanvas SceneComponent
  487. //! This class should NOT be serialized
  488. class GraphCanvasGraphicsScene
  489. : public QGraphicsScene
  490. {
  491. public:
  492. AZ_TYPE_INFO(Scene, "{48C47083-2CF2-4BB5-8058-FF25084FC2AA}");
  493. AZ_CLASS_ALLOCATOR(GraphCanvasGraphicsScene, AZ::SystemAllocator, 0);
  494. static void Reflect(AZ::ReflectContext*) = delete;
  495. GraphCanvasGraphicsScene(SceneComponent& scene);
  496. ~GraphCanvasGraphicsScene() = default;
  497. // Do not allow serialization
  498. AZ::EntityId GetEntityId() const;
  499. void SuppressNextContextMenu();
  500. protected:
  501. // QGraphicsScene
  502. void keyPressEvent(QKeyEvent* event) override;
  503. void keyReleaseEvent(QKeyEvent* event) override;
  504. void contextMenuEvent(QGraphicsSceneContextMenuEvent* contextMenuEvent) override;
  505. QList<QGraphicsItem*> itemsAtPosition(const QPoint& screenPos, const QPointF& scenePos, QWidget* widget) const;
  506. void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
  507. void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
  508. void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
  509. void dragEnterEvent(QGraphicsSceneDragDropEvent * event) override;
  510. void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) override;
  511. void dragMoveEvent(QGraphicsSceneDragDropEvent* event) override;
  512. void dropEvent(QGraphicsSceneDragDropEvent* event) override;
  513. ////
  514. private:
  515. GraphCanvasGraphicsScene(const GraphCanvasGraphicsScene&) = delete;
  516. void SignalGroupHighlight();
  517. void CleanupHighlight();
  518. SceneComponent& m_scene;
  519. bool m_suppressContextMenu;
  520. // Elements to make the group highlighting correct.
  521. AZ::EntityId m_contextMenuGroupTarget;
  522. StateSetter< RootGraphicsItemDisplayState > m_forcedGroupDisplayStateStateSetter;
  523. StateSetter< AZStd::string > m_forcedLayerStateSetter;
  524. };
  525. }