DeveloperUtils.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 <GraphCanvas/Components/GridBus.h>
  9. #include <GraphCanvas/Components/SceneBus.h>
  10. #include <GraphCanvas/Components/Nodes/NodeBus.h>
  11. #include <GraphCanvas/Components/VisualBus.h>
  12. #include <GraphCanvas/Editor/EditorTypes.h>
  13. #include <GraphCanvas/Components/Nodes/NodeUIBus.h>
  14. #include <GraphCanvas/Widgets/GraphCanvasGraphicsView/GraphCanvasGraphicsView.h>
  15. #include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
  16. #include <Editor/View/Widgets/NodePalette/CreateNodeMimeEvent.h>
  17. #include <ScriptCanvas/Bus/RequestBus.h>
  18. #include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
  19. #include <ScriptCanvas/Variable/VariableBus.h>
  20. #include <ScriptCanvasDeveloperEditor/DeveloperUtils.h>
  21. namespace ScriptCanvasDeveloperEditor
  22. {
  23. ///////////////////
  24. // DeveloperUtils
  25. ///////////////////
  26. ScriptCanvasEditor::NodeIdPair DeveloperUtils::HandleMimeEvent(GraphCanvas::GraphCanvasMimeEvent* mimeEvent, GraphCanvas::GraphId graphCanvasGraphId, const QRectF& viewportRectangle, int& widthOffset, int& heightOffset, int& maxRowHeight, AZ::Vector2 spacing)
  27. {
  28. AZ::Vector2 position(aznumeric_cast<float>(viewportRectangle.x()) + widthOffset, aznumeric_cast<float>(viewportRectangle.y()) + heightOffset);
  29. ScriptCanvasEditor::NodeIdPair createdPair;
  30. ScriptCanvasEditor::AutomationRequestBus::BroadcastResult(createdPair, &ScriptCanvasEditor::AutomationRequests::ProcessCreateNodeMimeEvent, mimeEvent, graphCanvasGraphId, position);
  31. UpdateViewportPositionOffsetForNode(createdPair.m_graphCanvasId, viewportRectangle, widthOffset, heightOffset, maxRowHeight, spacing);
  32. GraphCanvas::SceneNotificationBus::Event(graphCanvasGraphId, &GraphCanvas::SceneNotifications::PostCreationEvent);
  33. return createdPair;
  34. }
  35. void DeveloperUtils::UpdateViewportPositionOffsetForNode(GraphCanvas::NodeId nodeId, const QRectF& viewportRectangle, int& widthOffset, int& heightOffset, int& maxRowHeight, AZ::Vector2 spacing)
  36. {
  37. QGraphicsItem* graphicsWidget = nullptr;
  38. GraphCanvas::SceneMemberUIRequestBus::EventResult(graphicsWidget, nodeId, &GraphCanvas::SceneMemberUIRequests::GetRootGraphicsItem);
  39. GraphCanvas::NodeUIRequestBus::Event(nodeId, &GraphCanvas::NodeUIRequests::AdjustSize);
  40. if (graphicsWidget)
  41. {
  42. int height = aznumeric_cast<int>(graphicsWidget->boundingRect().height());
  43. if (height > maxRowHeight)
  44. {
  45. maxRowHeight = height;
  46. }
  47. widthOffset += aznumeric_cast<int>(graphicsWidget->boundingRect().width() + spacing.GetX());
  48. if (widthOffset >= viewportRectangle.width())
  49. {
  50. widthOffset = 0;
  51. heightOffset += maxRowHeight + aznumeric_cast<int>(spacing.GetY());
  52. maxRowHeight = 0;
  53. }
  54. }
  55. }
  56. bool DeveloperUtils::CreateConnectedChain(const ScriptCanvasEditor::NodeIdPair& nodeIdPair, DeveloperUtils::CreateConnectedChainConfig& connectionConfig)
  57. {
  58. if (connectionConfig.m_connectionStyle == ConnectionStyle::NoConnections)
  59. {
  60. return true;
  61. }
  62. if (!nodeIdPair.m_graphCanvasId.IsValid())
  63. {
  64. return false;
  65. }
  66. // Crappy work around to ensure we know our 'seeded' element for a random connection
  67. if (!connectionConfig.m_fallbackNode.m_graphCanvasId.IsValid())
  68. {
  69. connectionConfig.m_fallbackNode = nodeIdPair;
  70. }
  71. if (connectionConfig.m_skipHandlers)
  72. {
  73. AZ::EntityId outermostNode = GraphCanvas::GraphUtils::FindOutermostNode(nodeIdPair.m_graphCanvasId);
  74. bool isHandler = false;
  75. ScriptCanvasEditor::NodeDescriptorRequestBus::EventResult(isHandler, outermostNode, &ScriptCanvasEditor::NodeDescriptorRequests::IsType, ScriptCanvasEditor::NodeDescriptorType::EBusHandler);
  76. if (isHandler)
  77. {
  78. return false;
  79. }
  80. // Hacky way to deal with finding the InputHandler node.
  81. // And the On Graph Start node that we will stumble into in the middle of the node palette as well
  82. AZStd::vector< GraphCanvas::SlotId > executionIns;
  83. GraphCanvas::NodeRequestBus::EventResult(executionIns, outermostNode, &GraphCanvas::NodeRequests::FindVisibleSlotIdsByType, GraphCanvas::CT_Input, GraphCanvas::SlotTypes::ExecutionSlot);
  84. if (executionIns.empty() && connectionConfig.m_fallbackNode.m_graphCanvasId != outermostNode)
  85. {
  86. return false;
  87. }
  88. }
  89. AZStd::vector< GraphCanvas::SlotId > executionIns;
  90. GraphCanvas::NodeRequestBus::EventResult(executionIns, nodeIdPair.m_graphCanvasId, &GraphCanvas::NodeRequests::FindVisibleSlotIdsByType, GraphCanvas::CT_Input, GraphCanvas::SlotTypes::ExecutionSlot);
  91. if (!executionIns.empty())
  92. {
  93. GraphCanvas::Endpoint executionIn = GraphCanvas::Endpoint(nodeIdPair.m_graphCanvasId, executionIns.front());
  94. if (connectionConfig.m_previousEndpoint.IsValid())
  95. {
  96. if (connectionConfig.m_connectionStyle == ConnectionStyle::SingleExecutionConnection)
  97. {
  98. GraphCanvas::SlotRequestBus::Event(executionIn.GetSlotId(), &GraphCanvas::SlotRequests::CreateConnectionWithEndpoint, connectionConfig.m_previousEndpoint);
  99. }
  100. }
  101. }
  102. AZStd::vector< GraphCanvas::SlotId > executionOuts;
  103. GraphCanvas::NodeRequestBus::EventResult(executionOuts, nodeIdPair.m_graphCanvasId, &GraphCanvas::NodeRequests::FindVisibleSlotIdsByType, GraphCanvas::CT_Output, GraphCanvas::SlotTypes::ExecutionSlot);
  104. if (!executionOuts.empty())
  105. {
  106. connectionConfig.m_previousEndpoint = GraphCanvas::Endpoint(nodeIdPair.m_graphCanvasId, executionOuts.front());
  107. }
  108. return true;
  109. }
  110. void DeveloperUtils::ProcessNodePalette(ProcessNodePaletteInterface& processNodePaletteInterface)
  111. {
  112. AZ::EntityId activeGraphCanvasGraphId;
  113. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(activeGraphCanvasGraphId, &ScriptCanvasEditor::GeneralRequests::GetActiveGraphCanvasGraphId);
  114. ScriptCanvas::ScriptCanvasId activeScriptCanvasId;
  115. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(activeScriptCanvasId, &ScriptCanvasEditor::GeneralRequests::GetActiveScriptCanvasId);
  116. if (activeGraphCanvasGraphId.IsValid())
  117. {
  118. processNodePaletteInterface.SetupInterface(activeGraphCanvasGraphId, activeScriptCanvasId);
  119. ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::PushPreventUndoStateUpdate);
  120. const GraphCanvas::GraphCanvasTreeItem* treeItem = nullptr;
  121. ScriptCanvasEditor::AutomationRequestBus::BroadcastResult(treeItem, &ScriptCanvasEditor::AutomationRequests::GetNodePaletteRoot);
  122. AZStd::list< const GraphCanvas::GraphCanvasTreeItem* > expandedItems;
  123. expandedItems.emplace_back(treeItem);
  124. while (!expandedItems.empty())
  125. {
  126. const GraphCanvas::GraphCanvasTreeItem* treeItem2 = expandedItems.front();
  127. expandedItems.pop_front();
  128. for (int i = 0; i < treeItem2->GetChildCount(); ++i)
  129. {
  130. expandedItems.emplace_back(treeItem2->FindChildByRow(i));
  131. }
  132. if (const GraphCanvas::NodePaletteTreeItem* nodePaletteTreeItem = azrtti_cast<const GraphCanvas::NodePaletteTreeItem*>(treeItem2))
  133. {
  134. if (processNodePaletteInterface.ShouldProcessItem(nodePaletteTreeItem))
  135. {
  136. AZ_TracePrintf("ScriptCanvas", "%s", nodePaletteTreeItem->GetName().toUtf8().data());
  137. processNodePaletteInterface.ProcessItem(nodePaletteTreeItem);
  138. }
  139. else
  140. {
  141. continue;
  142. }
  143. }
  144. else
  145. {
  146. continue;
  147. }
  148. }
  149. processNodePaletteInterface.OnProcessingComplete();
  150. ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::PopPreventUndoStateUpdate);
  151. ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::PostUndoPoint, activeScriptCanvasId);
  152. }
  153. }
  154. void DeveloperUtils::ProcessVariablePalette(ProcessVariablePaletteInterface& variablePaletteInterface)
  155. {
  156. AZ::EntityId activeGraphCanvasGraphId;
  157. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(activeGraphCanvasGraphId, &ScriptCanvasEditor::GeneralRequests::GetActiveGraphCanvasGraphId);
  158. ScriptCanvas::ScriptCanvasId activeScriptCanvasId;
  159. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(activeScriptCanvasId, &ScriptCanvasEditor::GeneralRequests::GetActiveScriptCanvasId);
  160. if (activeScriptCanvasId.IsValid())
  161. {
  162. variablePaletteInterface.SetupInterface(activeGraphCanvasGraphId, activeScriptCanvasId);
  163. ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::PushPreventUndoStateUpdate);
  164. AZStd::vector<ScriptCanvas::Data::Type> variableTypes;
  165. ScriptCanvasEditor::VariableAutomationRequestBus::BroadcastResult(variableTypes, &ScriptCanvasEditor::VariableAutomationRequests::GetVariableTypes);
  166. for (auto variableType : variableTypes)
  167. {
  168. if (variablePaletteInterface.ShouldProcessVariableType(variableType))
  169. {
  170. AZ_TracePrintf("ScriptCanvas", "Processing Variable Type - %s", ScriptCanvas::Data::GetName(variableType).c_str());
  171. variablePaletteInterface.ProcessVariableType(variableType);
  172. }
  173. }
  174. variablePaletteInterface.OnProcessingComplete();
  175. ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::PopPreventUndoStateUpdate);
  176. ScriptCanvasEditor::GeneralRequestBus::Broadcast(&ScriptCanvasEditor::GeneralRequests::PostUndoPoint, activeScriptCanvasId);
  177. }
  178. }
  179. }