WrapperMock.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. #include <qmenu.h>
  9. #include <Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h>
  10. #include <Editor/Include/ScriptCanvas/Bus/RequestBus.h>
  11. #include <Editor/Nodes/NodeUtils.h>
  12. #include <ScriptCanvasDeveloperEditor/WrapperMock.h>
  13. namespace ScriptCanvas::Developer
  14. {
  15. namespace Nodes
  16. {
  17. ////////////////
  18. // WrapperMock
  19. ////////////////
  20. void WrapperMock::Reflect(AZ::ReflectContext* context)
  21. {
  22. if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  23. {
  24. serializeContext->Class<WrapperMock, Mock>()
  25. ->Version(0)
  26. ->Field("m_wrappedNodeIds", &WrapperMock::m_wrappedNodeIds)
  27. ->Field("m_actionName", &WrapperMock::m_actionName)
  28. ;
  29. AZ::EditContext* editContext = serializeContext->GetEditContext();
  30. if (editContext)
  31. {
  32. editContext->Class<WrapperMock>("WrapperMock", "Node for Mocking Wrapper Node visuals")
  33. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  34. ->Attribute(ScriptCanvas::Attributes::Node::NodeType, ScriptCanvasEditor::Nodes::NodeType::WrapperNode)
  35. ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
  36. ->DataElement(AZ::Edit::UIHandlers::Default, &WrapperMock::m_actionName, "Action Name", "The Add Action Button Name")
  37. ->Attribute(AZ::Edit::Attributes::ChangeNotify, &WrapperMock::OnActionNameChanged)
  38. ;
  39. }
  40. }
  41. }
  42. WrapperMock::WrapperMock()
  43. : m_actionName("Mock Action")
  44. {
  45. }
  46. void WrapperMock::OnWrapperAction(const QRect&, const QPointF& scenePoint, const QPoint& screenPoint)
  47. {
  48. GraphCanvas::GraphId graphId;
  49. GraphCanvas::SceneMemberRequestBus::EventResult(graphId, GetGraphCanvasNodeId(), &GraphCanvas::SceneMemberRequests::GetScene);
  50. ScriptCanvas::ScriptCanvasId scriptCanvasId;
  51. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(scriptCanvasId, &ScriptCanvasEditor::GeneralRequests::GetScriptCanvasId, graphId);
  52. QMenu menu;
  53. QAction* addMock = menu.addAction("Add Mock Node");
  54. QAction* addWrapperMock = menu.addAction("Add Wrapper Mock Node");
  55. QAction* result = menu.exec(screenPoint);
  56. ScriptCanvasEditor::NodeIdPair nodePair;
  57. if (result == addMock)
  58. {
  59. ScriptCanvasEditor::EditorGraphRequestBus::EventResult(nodePair, scriptCanvasId, &ScriptCanvasEditor::EditorGraphRequests::CreateCustomNode, azrtti_typeid<Mock>(), AZ::Vector2(aznumeric_cast<float>(scenePoint.x()), aznumeric_cast<float>(scenePoint.y())));
  60. }
  61. else if (result == addWrapperMock)
  62. {
  63. ScriptCanvasEditor::EditorGraphRequestBus::EventResult(nodePair, scriptCanvasId, &ScriptCanvasEditor::EditorGraphRequests::CreateCustomNode, azrtti_typeid<WrapperMock>(), AZ::Vector2(aznumeric_cast<float>(scenePoint.x()), aznumeric_cast<float>(scenePoint.y())));
  64. }
  65. if (nodePair.m_scriptCanvasId.IsValid()
  66. && nodePair.m_graphCanvasId.IsValid())
  67. {
  68. m_wrappedNodeIds.push_back(nodePair.m_scriptCanvasId);
  69. m_graphCanvasMapping[nodePair.m_graphCanvasId] = nodePair.m_scriptCanvasId;
  70. GraphCanvas::WrappedNodeConfiguration configuration;
  71. configuration.m_layoutOrder = static_cast<int>(m_wrappedNodeIds.size() - 1);
  72. GraphCanvas::WrapperNodeRequestBus::Event(GetGraphCanvasNodeId(), &GraphCanvas::WrapperNodeRequests::WrapNode, nodePair.m_graphCanvasId, configuration);
  73. }
  74. }
  75. void WrapperMock::OnGraphCanvasNodeSetup([[maybe_unused]] const GraphCanvas::NodeId& graphCanvasNodeId)
  76. {
  77. AZ::EntityId scriptCanvasNodeId = (*MockDescriptorNotificationBus::GetCurrentBusId());
  78. MockDescriptorNotificationBus::MultiHandler::BusDisconnect(scriptCanvasNodeId);
  79. GraphCanvas::NodeId nodeId;
  80. MockDescriptorRequestBus::EventResult(nodeId, scriptCanvasNodeId, &MockDescriptorRequests::GetGraphCanvasNodeId);
  81. for (int i = 0; i < m_wrappedNodeIds.size(); ++i)
  82. {
  83. if (m_wrappedNodeIds[i] == scriptCanvasNodeId)
  84. {
  85. m_graphCanvasMapping[nodeId] = m_wrappedNodeIds[i];
  86. GraphCanvas::WrappedNodeConfiguration configuration;
  87. configuration.m_layoutOrder = i;
  88. GraphCanvas::WrapperNodeRequestBus::Event(GetGraphCanvasNodeId(), &GraphCanvas::WrapperNodeRequests::WrapNode, nodeId, configuration);
  89. break;
  90. }
  91. }
  92. }
  93. void WrapperMock::OnNodeRemoved(const GraphCanvas::NodeId& nodeId)
  94. {
  95. auto mapIter = m_graphCanvasMapping.find(nodeId);
  96. if (mapIter != m_graphCanvasMapping.end())
  97. {
  98. AZ::EntityId scriptCanvasNodeId = mapIter->second;
  99. auto removeIter = AZStd::remove_if(m_wrappedNodeIds.begin(), m_wrappedNodeIds.end(), [scriptCanvasNodeId](const AZ::EntityId& testId) { return scriptCanvasNodeId == testId; });
  100. if (removeIter != m_wrappedNodeIds.end())
  101. {
  102. m_wrappedNodeIds.erase(removeIter);
  103. }
  104. }
  105. }
  106. void WrapperMock::OnActionNameChanged()
  107. {
  108. GraphCanvas::WrapperNodeRequestBus::Event(GetGraphCanvasNodeId(), &GraphCanvas::WrapperNodeRequests::SetActionString, QString(m_actionName.c_str()));
  109. }
  110. void WrapperMock::OnClear()
  111. {
  112. GraphCanvas::GraphId graphId;
  113. GraphCanvas::SceneMemberRequestBus::EventResult(graphId, GetGraphCanvasNodeId(), &GraphCanvas::SceneMemberRequests::GetScene);
  114. AZStd::unordered_set< AZ::EntityId > deleteIds;
  115. for (auto& mapPair : m_graphCanvasMapping)
  116. {
  117. deleteIds.erase(mapPair.first);
  118. }
  119. GraphCanvas::SceneRequestBus::Event(graphId, &GraphCanvas::SceneRequests::Delete, deleteIds);
  120. m_wrappedNodeIds.clear();
  121. m_graphCanvasMapping.clear();
  122. }
  123. void WrapperMock::OnNodeDisplayed(const GraphCanvas::NodeId& graphCanvasNodeId)
  124. {
  125. ScriptCanvasEditor::ScriptCanvasWrapperNodeDescriptorRequestBus::Handler::BusConnect(graphCanvasNodeId);
  126. for (unsigned int i = 0; i < m_wrappedNodeIds.size(); ++i)
  127. {
  128. GraphCanvas::NodeId nodeId;
  129. MockDescriptorRequestBus::EventResult(nodeId, m_wrappedNodeIds[i], &MockDescriptorRequests::GetGraphCanvasNodeId);
  130. if (nodeId.IsValid())
  131. {
  132. m_graphCanvasMapping[nodeId] = m_wrappedNodeIds[i];
  133. GraphCanvas::WrappedNodeConfiguration configuration;
  134. configuration.m_layoutOrder = i;
  135. GraphCanvas::WrapperNodeRequestBus::Event(GetGraphCanvasNodeId(), &GraphCanvas::WrapperNodeRequests::WrapNode, nodeId, configuration);
  136. }
  137. else
  138. {
  139. MockDescriptorNotificationBus::MultiHandler::BusConnect(m_wrappedNodeIds[i]);
  140. }
  141. }
  142. OnActionNameChanged();
  143. }
  144. }
  145. }