BlendSpaceEvaluatorHandler.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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/BlendSpaceEvaluatorHandler.h>
  9. #include <Editor/PropertyWidgets/PropertyWidgetAllocator.h>
  10. #include <EMotionFX/Source/AnimGraphManager.h>
  11. #include <EMotionFX/Source/BlendSpaceManager.h>
  12. #include <EMotionFX/Source/EMotionFXManager.h>
  13. #include <QHBoxLayout>
  14. #include <QMessageBox>
  15. namespace EMotionFX
  16. {
  17. AZ_CLASS_ALLOCATOR_IMPL(BlendSpaceEvaluatorPicker, PropertyWidgetAllocator)
  18. AZ_CLASS_ALLOCATOR_IMPL(BlendSpaceEvaluatorHandler,PropertyWidgetAllocator)
  19. BlendSpaceEvaluatorPicker::BlendSpaceEvaluatorPicker(QWidget* parent)
  20. : QComboBox(parent)
  21. {
  22. connect(this, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &BlendSpaceEvaluatorPicker::OnCurrentIndexChanged);
  23. const BlendSpaceManager* blendSpaceManager = GetAnimGraphManager().GetBlendSpaceManager();
  24. const size_t evaluatorCount = blendSpaceManager->GetEvaluatorCount();
  25. for (size_t i = 0; i < evaluatorCount; ++i)
  26. {
  27. const BlendSpaceParamEvaluator* evaluator = blendSpaceManager->GetEvaluator(i);
  28. const AZ::TypeId evaluatorType = azrtti_typeid(evaluator);
  29. addItem(evaluator->GetName(), evaluatorType.ToString<AZStd::string>().c_str());
  30. }
  31. }
  32. void BlendSpaceEvaluatorPicker::OnCurrentIndexChanged([[maybe_unused]] int index)
  33. {
  34. emit EvaluatorChanged();
  35. }
  36. AZ::TypeId BlendSpaceEvaluatorPicker::GetTypeId(int index) const
  37. {
  38. const AZStd::string typeString = itemData(index).toString().toUtf8().data();
  39. const AZ::TypeId typeId(typeString.c_str(), typeString.size());
  40. return typeId;
  41. }
  42. void BlendSpaceEvaluatorPicker::SetEvaluatorType(AZ::TypeId type)
  43. {
  44. int evaluatorCount = count();
  45. for (int i = 0; i < evaluatorCount; ++i)
  46. {
  47. const AZ::TypeId evaluatorType = GetTypeId(i);
  48. if (evaluatorType == type)
  49. {
  50. setCurrentIndex(i);
  51. return;
  52. }
  53. }
  54. setCurrentIndex(-1);
  55. }
  56. AZ::TypeId BlendSpaceEvaluatorPicker::GetEvaluatorType() const
  57. {
  58. return GetTypeId(currentIndex());
  59. }
  60. //---------------------------------------------------------------------------------------------------------------------------------------------------------
  61. BlendSpaceEvaluatorHandler::BlendSpaceEvaluatorHandler()
  62. : QObject()
  63. , AzToolsFramework::PropertyHandler<AZ::TypeId, BlendSpaceEvaluatorPicker>()
  64. {
  65. }
  66. AZ::u32 BlendSpaceEvaluatorHandler::GetHandlerName() const
  67. {
  68. return AZ_CRC_CE("BlendSpaceEvaluator");
  69. }
  70. QWidget* BlendSpaceEvaluatorHandler::CreateGUI(QWidget* parent)
  71. {
  72. BlendSpaceEvaluatorPicker* picker = aznew BlendSpaceEvaluatorPicker(parent);
  73. connect(picker, &BlendSpaceEvaluatorPicker::EvaluatorChanged, this, [picker]()
  74. {
  75. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(
  76. &AzToolsFramework::PropertyEditorGUIMessages::Bus::Events::RequestWrite, picker);
  77. });
  78. return picker;
  79. }
  80. void BlendSpaceEvaluatorHandler::ConsumeAttribute(BlendSpaceEvaluatorPicker* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName)
  81. {
  82. if (attrib == AZ::Edit::Attributes::ReadOnly)
  83. {
  84. bool value;
  85. if (attrValue->Read<bool>(value))
  86. {
  87. GUI->setEnabled(!value);
  88. }
  89. }
  90. }
  91. void BlendSpaceEvaluatorHandler::WriteGUIValuesIntoProperty([[maybe_unused]] size_t index, BlendSpaceEvaluatorPicker* GUI, property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  92. {
  93. instance = GUI->GetEvaluatorType();
  94. }
  95. bool BlendSpaceEvaluatorHandler::ReadValuesIntoGUI([[maybe_unused]] size_t index, BlendSpaceEvaluatorPicker* GUI, const property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
  96. {
  97. QSignalBlocker signalBlocker(GUI);
  98. GUI->SetEvaluatorType(instance);
  99. return true;
  100. }
  101. } // namespace EMotionFX
  102. #include <Source/Editor/PropertyWidgets/moc_BlendSpaceEvaluatorHandler.cpp>