ManifestVectorWidget.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #pragma once
  2. /*
  3. * Copyright (c) Contributors to the Open 3D Engine Project.
  4. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  5. *
  6. * SPDX-License-Identifier: Apache-2.0 OR MIT
  7. *
  8. */
  9. #if !defined(Q_MOC_RUN)
  10. #include <QWidget>
  11. #include <AzCore/Memory/SystemAllocator.h>
  12. #include <AzCore/std/containers/vector.h>
  13. #include <AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h>
  14. #include <SceneAPI/SceneCore/Events/ManifestMetaInfoBus.h>
  15. #endif
  16. namespace AZStd
  17. {
  18. template<class T>
  19. class shared_ptr;
  20. }
  21. namespace AzToolsFramework
  22. {
  23. class ReflectedPropertyEditor;
  24. class InstanceDataNode;
  25. }
  26. namespace SerializeContext
  27. {
  28. class IObjectFactory;
  29. }
  30. namespace AZ
  31. {
  32. class SerializeContext;
  33. namespace SceneAPI
  34. {
  35. namespace DataTypes
  36. {
  37. class IManifestObject;
  38. class IGroup;
  39. }
  40. namespace SceneData
  41. {
  42. template<class T>
  43. class VectorWrapper;
  44. }
  45. namespace UI
  46. {
  47. // QT space
  48. namespace Ui
  49. {
  50. class ManifestVectorWidget;
  51. }
  52. class ManifestVectorWidget
  53. : public QWidget
  54. , public AzToolsFramework::IPropertyEditorNotify
  55. , public Events::ManifestMetaInfoBus::Handler
  56. {
  57. Q_OBJECT
  58. public:
  59. AZ_CLASS_ALLOCATOR_DECL
  60. using ManifestVectorType = AZStd::vector<AZStd::shared_ptr<DataTypes::IManifestObject> >;
  61. ManifestVectorWidget(SerializeContext* serializeContext, QWidget* parent);
  62. ~ManifestVectorWidget() override;
  63. template<typename InputIterator>
  64. void SetManifestVector(InputIterator first, InputIterator last, DataTypes::IManifestObject* ownerObject)
  65. {
  66. AZ_Assert(ownerObject, "ManifestVectorWidgets must be initialized with a non-null owner object.");
  67. m_manifestVector.assign(first, last);
  68. m_ownerObject = ownerObject;
  69. UpdatePropertyGrid();
  70. }
  71. void SetManifestVector(const ManifestVectorType& manifestVector, DataTypes::IManifestObject* ownerObject);
  72. ManifestVectorType GetManifestVector();
  73. void SetCollectionName(const AZStd::string& name);
  74. void SetCollectionTypeName(const AZStd::string& typeName);
  75. // Sets the number of entries the user can add through this widget. It doesn't limit
  76. // the amount of entries that can be stored.
  77. void SetCapSize(size_t cap);
  78. bool ContainsManifestObject(const DataTypes::IManifestObject* object) const;
  79. bool RemoveManifestObject(const DataTypes::IManifestObject* object);
  80. signals:
  81. void valueChanged();
  82. protected:
  83. void DisplayAddPrompt();
  84. void AddNewObject(SerializeContext::IObjectFactory* factory, const AZStd::string& typeName);
  85. void UpdatePropertyGrid();
  86. void UpdatePropertyGridSize();
  87. void EmitObjectChanged(const DataTypes::IManifestObject* object);
  88. // IPropertyEditorNotify
  89. void AfterPropertyModified(AzToolsFramework::InstanceDataNode* /*node*/) override;
  90. void RequestPropertyContextMenu(AzToolsFramework::InstanceDataNode* /*node*/, const QPoint& /*point*/) override;
  91. void BeforePropertyModified(AzToolsFramework::InstanceDataNode* /*node*/) override;
  92. void SetPropertyEditingActive(AzToolsFramework::InstanceDataNode* /*node*/) override;
  93. void SetPropertyEditingComplete(AzToolsFramework::InstanceDataNode* /*node*/) override;
  94. void SealUndoStack() override;
  95. // ManifestMetaInfoBus
  96. void ObjectUpdated(const Containers::Scene& scene, const DataTypes::IManifestObject* target, void* sender) override;
  97. SerializeContext* m_serializeContext;
  98. AzToolsFramework::ReflectedPropertyEditor* m_propertyEditor;
  99. QScopedPointer<Ui::ManifestVectorWidget> m_ui;
  100. DataTypes::IManifestObject* m_ownerObject;
  101. ManifestVectorType m_manifestVector;
  102. size_t m_capSize;
  103. };
  104. } // namespace UI
  105. } // namespace SceneAPI
  106. } // namespace AZ