SimulatedObjectSelectionHandler.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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/SimulatedObjectSelectionHandler.h>
  9. #include <Editor/AnimGraphEditorBus.h>
  10. #include <Editor/Plugins/SimulatedObject/SimulatedObjectSelectionWindow.h>
  11. #include <EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/EMStudioManager.h>
  12. #include <QHBoxLayout>
  13. namespace EMotionFX
  14. {
  15. AZ_CLASS_ALLOCATOR_IMPL(SimulatedObjectPicker, AZ::SystemAllocator)
  16. AZ_CLASS_ALLOCATOR_IMPL(SimulatedObjectSelectionHandler, AZ::SystemAllocator)
  17. //---------------------------------------------------------------------------------------------------------------------------------------------------------
  18. SimulatedObjectPicker::SimulatedObjectPicker(QWidget* parent)
  19. : QWidget(parent)
  20. {
  21. QHBoxLayout* hLayout = new QHBoxLayout();
  22. hLayout->setMargin(0);
  23. m_pickButton = new QPushButton(this);
  24. connect(m_pickButton, &QPushButton::clicked, this, &SimulatedObjectPicker::OnPickClicked);
  25. hLayout->addWidget(m_pickButton);
  26. m_resetButton = new QPushButton(this);
  27. EMStudio::EMStudioManager::MakeTransparentButton(m_resetButton, "Images/Icons/Clear.svg", "Reset selection");
  28. connect(m_resetButton, &QPushButton::clicked, this, &SimulatedObjectPicker::OnResetClicked);
  29. hLayout->addWidget(m_resetButton);
  30. setLayout(hLayout);
  31. }
  32. void SimulatedObjectPicker::SetSimulatedObjects(const AZStd::vector<AZStd::string>& simulatedObjectNames)
  33. {
  34. m_simulatedObjectNames = simulatedObjectNames;
  35. UpdateInterface();
  36. }
  37. const AZStd::vector<AZStd::string>& SimulatedObjectPicker::GetSimulatedObjects() const
  38. {
  39. return m_simulatedObjectNames;
  40. }
  41. void SimulatedObjectPicker::UpdateSimulatedObjects(const AZStd::vector<AZStd::string>& simulatedObjectNames)
  42. {
  43. if (m_simulatedObjectNames != simulatedObjectNames)
  44. {
  45. m_simulatedObjectNames = simulatedObjectNames;
  46. emit SelectionChanged(m_simulatedObjectNames);
  47. UpdateInterface();
  48. }
  49. }
  50. void SimulatedObjectPicker::UpdateInterface()
  51. {
  52. // Set the picker button name based on the number of objects.
  53. const size_t numObjects = m_simulatedObjectNames.size();
  54. if (numObjects == 0)
  55. {
  56. m_pickButton->setText("Select simulated objects");
  57. }
  58. else if (numObjects == 1)
  59. {
  60. m_pickButton->setText(m_simulatedObjectNames[0].c_str());
  61. }
  62. else
  63. {
  64. m_pickButton->setText(QString("%1 simulated objects").arg(numObjects));
  65. }
  66. }
  67. void SimulatedObjectPicker::OnPickClicked()
  68. {
  69. Actor* selectedActor = nullptr;
  70. ActorInstance* selectedActorInstance = nullptr;
  71. ActorEditorRequestBus::BroadcastResult(selectedActorInstance, &ActorEditorRequests::GetSelectedActorInstance);
  72. if (selectedActorInstance)
  73. {
  74. selectedActor = selectedActorInstance->GetActor();
  75. }
  76. else
  77. {
  78. ActorEditorRequestBus::BroadcastResult(selectedActor, &ActorEditorRequests::GetSelectedActor);
  79. }
  80. if (!selectedActor)
  81. {
  82. return;
  83. }
  84. // Create and show the simulated object picker window
  85. EMStudio::SimulatedObjectSelectionWindow selectionWindow(this);
  86. selectionWindow.Update(selectedActor, m_simulatedObjectNames);
  87. selectionWindow.setModal(true);
  88. if (selectionWindow.exec() != QDialog::Rejected)
  89. {
  90. UpdateSimulatedObjects(selectionWindow.GetSimulatedObjectSelectionWidget()->GetSelectedSimulatedObjectNames());
  91. }
  92. }
  93. void SimulatedObjectPicker::OnResetClicked()
  94. {
  95. if (m_simulatedObjectNames.empty())
  96. {
  97. return;
  98. }
  99. UpdateSimulatedObjects({});
  100. }
  101. //---------------------------------------------------------------------------------------------------------------------------------------------------------
  102. AZ::u32 SimulatedObjectSelectionHandler::GetHandlerName() const
  103. {
  104. return AZ_CRC("SimulatedObjectSelection", 0x846970e2);
  105. }
  106. QWidget* SimulatedObjectSelectionHandler::CreateGUI(QWidget* parent)
  107. {
  108. SimulatedObjectPicker* picker = aznew SimulatedObjectPicker(parent);
  109. connect(picker, &SimulatedObjectPicker::SelectionChanged, this, [picker]([[maybe_unused]] const AZStd::vector<AZStd::string>& newSimulatedObjects)
  110. {
  111. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(
  112. &AzToolsFramework::PropertyEditorGUIMessages::Bus::Events::RequestWrite, picker);
  113. });
  114. return picker;
  115. }
  116. void SimulatedObjectSelectionHandler::ConsumeAttribute(SimulatedObjectPicker* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName)
  117. {
  118. if (attrib == AZ::Edit::Attributes::ReadOnly)
  119. {
  120. bool value;
  121. if (attrValue->Read<bool>(value))
  122. {
  123. GUI->setEnabled(!value);
  124. }
  125. }
  126. }
  127. void SimulatedObjectSelectionHandler::WriteGUIValuesIntoProperty(size_t index, SimulatedObjectPicker* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node)
  128. {
  129. AZ_UNUSED(index);
  130. AZ_UNUSED(node);
  131. instance = GUI->GetSimulatedObjects();
  132. }
  133. bool SimulatedObjectSelectionHandler::ReadValuesIntoGUI(size_t index, SimulatedObjectPicker* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node)
  134. {
  135. AZ_UNUSED(index);
  136. AZ_UNUSED(node);
  137. QSignalBlocker signalBlocker(GUI);
  138. GUI->SetSimulatedObjects(instance);
  139. return true;
  140. }
  141. } // namespace EMotionFX