3
0

AnimGraphNodeHandler.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  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 <Editor/PropertyWidgets/AnimGraphNodeHandler.h>
  9. #include <EMotionFX/Source/AnimGraphNode.h>
  10. #include <EMotionFX/Source/AnimGraphMotionNode.h>
  11. #include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphHierarchyWidget.h>
  12. #include <EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendNodeSelectionWindow.h>
  13. #include <Editor/AnimGraphEditorBus.h>
  14. #include <QHBoxLayout>
  15. #include <QMessageBox>
  16. namespace EMotionFX
  17. {
  18. AZ_CLASS_ALLOCATOR_IMPL(AnimGraphNodeIdPicker, EditorAllocator)
  19. AZ_CLASS_ALLOCATOR_IMPL(AnimGraphNodeIdHandler, EditorAllocator)
  20. AZ_CLASS_ALLOCATOR_IMPL(AnimGraphMotionNodeIdHandler, EditorAllocator)
  21. AZ_CLASS_ALLOCATOR_IMPL(AnimGraphStateIdHandler, EditorAllocator)
  22. AnimGraphNodeIdPicker::AnimGraphNodeIdPicker(QWidget* parent)
  23. : QWidget(parent)
  24. , m_animGraph(nullptr)
  25. , m_nodeFilterType(AZ::TypeId::CreateNull())
  26. , m_showStatesOnly(false)
  27. {
  28. QHBoxLayout* hLayout = new QHBoxLayout();
  29. hLayout->setMargin(0);
  30. m_pickButton = new QPushButton(this);
  31. connect(m_pickButton, &QPushButton::clicked, this, &AnimGraphNodeIdPicker::OnPickClicked);
  32. hLayout->addWidget(m_pickButton);
  33. setLayout(hLayout);
  34. }
  35. void AnimGraphNodeIdPicker::SetAnimGraph(AnimGraph* animGraph)
  36. {
  37. m_animGraph = animGraph;
  38. UpdateInterface();
  39. }
  40. void AnimGraphNodeIdPicker::UpdateInterface()
  41. {
  42. if (!m_nodeId.IsValid())
  43. {
  44. m_pickButton->setText("Select node");
  45. }
  46. else
  47. {
  48. if (m_animGraph)
  49. {
  50. AnimGraphNode* node = m_animGraph->RecursiveFindNodeById(m_nodeId);
  51. if (node)
  52. {
  53. m_pickButton->setText(node->GetName());
  54. }
  55. }
  56. }
  57. }
  58. void AnimGraphNodeIdPicker::SetNodeId(AnimGraphNodeId nodeId)
  59. {
  60. m_nodeId = nodeId;
  61. UpdateInterface();
  62. }
  63. AnimGraphNodeId AnimGraphNodeIdPicker::GetNodeId() const
  64. {
  65. return m_nodeId;
  66. }
  67. void AnimGraphNodeIdPicker::SetShowStatesOnly(bool showStatesOnly)
  68. {
  69. m_showStatesOnly = showStatesOnly;
  70. }
  71. void AnimGraphNodeIdPicker::SetNodeTypeFilter(const AZ::TypeId& nodeFilterType)
  72. {
  73. m_nodeFilterType = nodeFilterType;
  74. }
  75. void AnimGraphNodeIdPicker::OnPickClicked()
  76. {
  77. if (!m_animGraph)
  78. {
  79. AZ_Error("EMotionFX", false, "Cannot open anim graph node selection window. No valid anim graph.");
  80. return;
  81. }
  82. // create and show the node picker window
  83. EMStudio::BlendNodeSelectionWindow dialog(this);
  84. dialog.GetAnimGraphHierarchyWidget().SetSingleSelectionMode(true);
  85. dialog.GetAnimGraphHierarchyWidget().SetFilterNodeType(m_nodeFilterType);
  86. dialog.GetAnimGraphHierarchyWidget().SetFilterStatesOnly(m_showStatesOnly);
  87. dialog.GetAnimGraphHierarchyWidget().SetRootAnimGraph(m_animGraph);
  88. dialog.setModal(true);
  89. if (dialog.exec() != QDialog::Rejected)
  90. {
  91. const AZStd::vector<AnimGraphSelectionItem>& selectedNodes = dialog.GetAnimGraphHierarchyWidget().GetSelectedItems();
  92. if (!selectedNodes.empty())
  93. {
  94. AnimGraphNode* selectedNode = m_animGraph->RecursiveFindNodeByName(selectedNodes[0].m_nodeName.c_str());
  95. if (selectedNode)
  96. {
  97. m_nodeId = selectedNode->GetId();
  98. UpdateInterface();
  99. emit SelectionChanged();
  100. }
  101. }
  102. }
  103. }
  104. //---------------------------------------------------------------------------------------------------------------------------------------------------------
  105. AnimGraphNodeIdHandler::AnimGraphNodeIdHandler()
  106. : QObject()
  107. , AzToolsFramework::PropertyHandler<AZ::u64, AnimGraphNodeIdPicker>()
  108. , m_animGraph(nullptr)
  109. , m_nodeFilterType(AZ::TypeId::CreateNull())
  110. , m_showStatesOnly(false)
  111. {
  112. }
  113. AZ::u32 AnimGraphNodeIdHandler::GetHandlerName() const
  114. {
  115. return AZ_CRC("AnimGraphNodeId", 0xadadb878);
  116. }
  117. QWidget* AnimGraphNodeIdHandler::CreateGUI(QWidget* parent)
  118. {
  119. AnimGraphNodeIdPicker* picker = aznew AnimGraphNodeIdPicker(parent);
  120. picker->SetShowStatesOnly(m_showStatesOnly);
  121. picker->SetNodeTypeFilter(m_nodeFilterType);
  122. connect(picker, &AnimGraphNodeIdPicker::SelectionChanged, this, [picker]()
  123. {
  124. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(
  125. &AzToolsFramework::PropertyEditorGUIMessages::Bus::Events::RequestWrite, picker);
  126. });
  127. return picker;
  128. }
  129. void AnimGraphNodeIdHandler::ConsumeAttribute(AnimGraphNodeIdPicker* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName)
  130. {
  131. if (attrib == AZ::Edit::Attributes::ReadOnly)
  132. {
  133. bool value;
  134. if (attrValue->Read<bool>(value))
  135. {
  136. GUI->setEnabled(!value);
  137. }
  138. }
  139. if (attrib == AZ_CRC("AnimGraph", 0x0d53d4b3))
  140. {
  141. attrValue->Read<AnimGraph*>(m_animGraph);
  142. GUI->SetAnimGraph(m_animGraph);
  143. }
  144. }
  145. void AnimGraphNodeIdHandler::WriteGUIValuesIntoProperty([[maybe_unused]] size_t index, AnimGraphNodeIdPicker* GUI, property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  146. {
  147. instance = GUI->GetNodeId();
  148. }
  149. bool AnimGraphNodeIdHandler::ReadValuesIntoGUI([[maybe_unused]] size_t index, AnimGraphNodeIdPicker* GUI, const property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  150. {
  151. QSignalBlocker signalBlocker(GUI);
  152. GUI->SetNodeId(instance);
  153. return true;
  154. }
  155. //---------------------------------------------------------------------------------------------------------------------------------------------------------
  156. AnimGraphMotionNodeIdHandler::AnimGraphMotionNodeIdHandler()
  157. : AnimGraphNodeIdHandler()
  158. {
  159. m_nodeFilterType = azrtti_typeid<AnimGraphMotionNode>();
  160. }
  161. AZ::u32 AnimGraphMotionNodeIdHandler::GetHandlerName() const
  162. {
  163. return AZ_CRC("AnimGraphMotionNodeId", 0xe19a0672);
  164. }
  165. //---------------------------------------------------------------------------------------------------------------------------------------------------------
  166. AnimGraphStateIdHandler::AnimGraphStateIdHandler()
  167. : AnimGraphNodeIdHandler()
  168. {
  169. m_showStatesOnly = true;
  170. }
  171. AZ::u32 AnimGraphStateIdHandler::GetHandlerName() const
  172. {
  173. return AZ_CRC("AnimGraphStateId", 0x3547298f);
  174. }
  175. } // namespace EMotionFX
  176. #include <Source/Editor/PropertyWidgets/moc_AnimGraphNodeHandler.cpp>