TransformRowWidget.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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 <QLabel>
  9. #include <QStyle>
  10. #include <QGridLayout>
  11. #include <SceneAPI/SceneUI/RowWidgets/TransformRowWidget.h>
  12. #include <AzQtComponents/Components/Widgets/VectorInput.h>
  13. #include <AzToolsFramework/UI/PropertyEditor/PropertyDoubleSpinCtrl.hxx>
  14. #include <AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h>
  15. #include <AzToolsFramework/UI/PropertyEditor/PropertyRowWidget.hxx>
  16. namespace AZ
  17. {
  18. namespace SceneAPI
  19. {
  20. namespace SceneUI
  21. {
  22. AZ_CLASS_ALLOCATOR_IMPL(ExpandedTransform, SystemAllocator);
  23. void PopulateVector3(AzQtComponents::VectorInput* vectorProperty, AZ::Vector3& vector)
  24. {
  25. AZ_Assert(vectorProperty->getSize() == 3, "Trying to populate a Vector3 from an invalidly sized Vector PropertyCtrl");
  26. if (vectorProperty->getSize() < 3)
  27. {
  28. return;
  29. }
  30. AzQtComponents::VectorElement** elements = vectorProperty->getElements();
  31. for (int i = 0; i < vectorProperty->getSize(); ++i)
  32. {
  33. AzQtComponents::VectorElement* currentElement = elements[i];
  34. vector.SetElement(i, aznumeric_cast<float>(currentElement->getValue()));
  35. }
  36. }
  37. ExpandedTransform::ExpandedTransform()
  38. : m_translation(0, 0, 0)
  39. , m_rotation(0, 0, 0)
  40. , m_scale(1)
  41. {
  42. }
  43. ExpandedTransform::ExpandedTransform(const Transform& transform)
  44. {
  45. SetTransform(transform);
  46. }
  47. void ExpandedTransform::SetTransform(const AZ::Transform& transform)
  48. {
  49. m_translation = transform.GetTranslation();
  50. m_rotation = transform.GetEulerDegrees();
  51. m_scale = transform.GetUniformScale();
  52. }
  53. void ExpandedTransform::GetTransform(AZ::Transform& transform) const
  54. {
  55. transform = Transform::CreateTranslation(m_translation);
  56. transform *= AZ::ConvertEulerDegreesToTransform(m_rotation);
  57. transform.MultiplyByUniformScale(m_scale);
  58. }
  59. const AZ::Vector3& ExpandedTransform::GetTranslation() const
  60. {
  61. return m_translation;
  62. }
  63. void ExpandedTransform::SetTranslation(const AZ::Vector3& translation)
  64. {
  65. m_translation = translation;
  66. }
  67. const AZ::Vector3& ExpandedTransform::GetRotation() const
  68. {
  69. return m_rotation;
  70. }
  71. void ExpandedTransform::SetRotation(const AZ::Vector3& rotation)
  72. {
  73. m_rotation = rotation;
  74. }
  75. const float ExpandedTransform::GetScale() const
  76. {
  77. return m_scale;
  78. }
  79. void ExpandedTransform::SetScale(const float scale)
  80. {
  81. m_scale = scale;
  82. }
  83. AZ_CLASS_ALLOCATOR_IMPL(TransformRowWidget, SystemAllocator);
  84. TransformRowWidget::TransformRowWidget(QWidget* parent)
  85. : QWidget(parent)
  86. {
  87. m_containerWidget = new QWidget();
  88. QGridLayout* layout = new QGridLayout();
  89. layout->setMargin(0);
  90. QGridLayout* layout2 = new QGridLayout();
  91. setLayout(layout);
  92. AzToolsFramework::PropertyRowWidget* parentWidget = static_cast<AzToolsFramework::PropertyRowWidget*>(parent);
  93. QToolButton* toolButton{};
  94. QVBoxLayout* layoutOriginal{};
  95. if (parentWidget != nullptr)
  96. {
  97. toolButton = parentWidget->GetIndicatorButton();
  98. layoutOriginal = parentWidget->GetLeftHandSideLayoutParent();
  99. parentWidget->SetAsCustom(true);
  100. parentWidget->GetNameLabel()->setContentsMargins(0, 0, 0, 0);
  101. }
  102. m_translationWidget = new AzQtComponents::VectorInput(this, 3);
  103. m_translationWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
  104. m_translationWidget->setMinimum(-9999999);
  105. m_translationWidget->setMaximum(9999999);
  106. m_rotationWidget = new AzQtComponents::VectorInput(this, 3);
  107. m_rotationWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
  108. m_rotationWidget->setLabel(0, "P");
  109. m_rotationWidget->setLabel(1, "R");
  110. m_rotationWidget->setLabel(2, "Y");
  111. m_rotationWidget->setMinimum(0);
  112. m_rotationWidget->setMaximum(360);
  113. m_rotationWidget->setSuffix(" degrees");
  114. m_scaleWidget = new AzToolsFramework::PropertyDoubleSpinCtrl(this);
  115. m_scaleWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
  116. m_scaleWidget->setMinimum(0);
  117. m_scaleWidget->setMaximum(10000);
  118. layout2->addWidget(new AzQtComponents::ElidingLabel("Position"), 0, 1);
  119. layout->addWidget(m_translationWidget, 1, 1);
  120. layout2->addWidget(new AzQtComponents::ElidingLabel("Rotation"), 1, 1);
  121. layout->addWidget(m_rotationWidget, 2, 1);
  122. layout2->addWidget(new AzQtComponents::ElidingLabel("Scale"), 2, 1);
  123. layout->addWidget(m_scaleWidget, 3, 1);
  124. layout->setRowMinimumHeight(0,16);
  125. layout2->setColumnMinimumWidth(0, 30);
  126. if (parentWidget != nullptr)
  127. {
  128. toolButton->setArrowType(Qt::DownArrow);
  129. parentWidget->SetIndentSize(1);
  130. toolButton->setVisible(true);
  131. m_containerWidget->setLayout(layout2);
  132. layoutOriginal->addWidget(m_containerWidget);
  133. connect(toolButton, &QToolButton::clicked, this, [&, toolButton]
  134. {
  135. m_expanded = !m_expanded;
  136. if (m_expanded)
  137. {
  138. show();
  139. m_containerWidget->show();
  140. toolButton->setArrowType(Qt::DownArrow);
  141. }
  142. else
  143. {
  144. hide();
  145. m_containerWidget->hide();
  146. toolButton->setArrowType(Qt::RightArrow);
  147. }
  148. });
  149. }
  150. QObject::connect(m_translationWidget, &AzQtComponents::VectorInput::valueChanged, this, [this]
  151. {
  152. AzQtComponents::VectorInput* widget = this->GetTranslationWidget();
  153. AZ::Vector3 translation;
  154. PopulateVector3(widget, translation);
  155. m_transform.SetTranslation(translation);
  156. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(&AzToolsFramework::PropertyEditorGUIMessages::RequestWrite, this);
  157. });
  158. QObject::connect(m_rotationWidget, &AzQtComponents::VectorInput::valueChanged, this, [this]
  159. {
  160. AzQtComponents::VectorInput* widget = this->GetRotationWidget();
  161. AZ::Vector3 rotation;
  162. PopulateVector3(widget, rotation);
  163. m_transform.SetRotation(rotation);
  164. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(&AzToolsFramework::PropertyEditorGUIMessages::RequestWrite, this);
  165. });
  166. QObject::connect(m_scaleWidget, &AzToolsFramework::PropertyDoubleSpinCtrl::valueChanged, this, [this]
  167. {
  168. AzToolsFramework::PropertyDoubleSpinCtrl* widget = this->GetScaleWidget();
  169. float scale = aznumeric_cast<float>(widget->value());
  170. m_transform.SetScale(scale);
  171. AzToolsFramework::PropertyEditorGUIMessages::Bus::Broadcast(&AzToolsFramework::PropertyEditorGUIMessages::RequestWrite, this);
  172. });
  173. }
  174. TransformRowWidget::~TransformRowWidget()
  175. {
  176. if (m_containerWidget)
  177. {
  178. m_containerWidget->deleteLater();
  179. }
  180. }
  181. void TransformRowWidget::SetEnableEdit(bool enableEdit)
  182. {
  183. m_translationWidget->setEnabled(enableEdit);
  184. m_rotationWidget->setEnabled(enableEdit);
  185. m_scaleWidget->setEnabled(enableEdit);
  186. }
  187. void TransformRowWidget::SetTransform(const AZ::Transform& transform)
  188. {
  189. blockSignals(true);
  190. m_transform.SetTransform(transform);
  191. m_translationWidget->setValuebyIndex(m_transform.GetTranslation().GetX(), 0);
  192. m_translationWidget->setValuebyIndex(m_transform.GetTranslation().GetY(), 1);
  193. m_translationWidget->setValuebyIndex(m_transform.GetTranslation().GetZ(), 2);
  194. m_rotationWidget->setValuebyIndex(m_transform.GetRotation().GetX(), 0);
  195. m_rotationWidget->setValuebyIndex(m_transform.GetRotation().GetY(), 1);
  196. m_rotationWidget->setValuebyIndex(m_transform.GetRotation().GetZ(), 2);
  197. m_scaleWidget->setValue(m_transform.GetScale());
  198. blockSignals(false);
  199. }
  200. void TransformRowWidget::GetTransform(AZ::Transform& transform) const
  201. {
  202. m_transform.GetTransform(transform);
  203. }
  204. const ExpandedTransform& TransformRowWidget::GetExpandedTransform() const
  205. {
  206. return m_transform;
  207. }
  208. AzQtComponents::VectorInput* TransformRowWidget::GetTranslationWidget()
  209. {
  210. return m_translationWidget;
  211. }
  212. AzQtComponents::VectorInput* TransformRowWidget::GetRotationWidget()
  213. {
  214. return m_rotationWidget;
  215. }
  216. AzToolsFramework::PropertyDoubleSpinCtrl* TransformRowWidget::GetScaleWidget()
  217. {
  218. return m_scaleWidget;
  219. }
  220. } // namespace SceneUI
  221. } // namespace SceneAPI
  222. } // namespace AZ
  223. #include <RowWidgets/moc_TransformRowWidget.cpp>