You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestVectorWidget.h

124 lines
4.4 KiB
C++

#pragma once
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#if !defined(Q_MOC_RUN)
#include <QWidget>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/std/containers/vector.h>
#include <AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h>
#include <SceneAPI/SceneCore/Events/ManifestMetaInfoBus.h>
#endif
namespace AZStd
{
template<class T>
class shared_ptr;
}
namespace AzToolsFramework
{
class ReflectedPropertyEditor;
class InstanceDataNode;
}
namespace SerializeContext
{
class IObjectFactory;
}
namespace AZ
{
class SerializeContext;
namespace SceneAPI
{
namespace DataTypes
{
class IManifestObject;
class IGroup;
}
namespace SceneData
{
template<class T>
class VectorWrapper;
}
namespace UI
{
// QT space
namespace Ui
{
class ManifestVectorWidget;
}
class ManifestVectorWidget
: public QWidget
, public AzToolsFramework::IPropertyEditorNotify
, public Events::ManifestMetaInfoBus::Handler
{
Q_OBJECT
public:
AZ_CLASS_ALLOCATOR_DECL
using ManifestVectorType = AZStd::vector<AZStd::shared_ptr<DataTypes::IManifestObject> >;
ManifestVectorWidget(SerializeContext* serializeContext, QWidget* parent);
~ManifestVectorWidget() override;
template<typename InputIterator>
void SetManifestVector(InputIterator first, InputIterator last, DataTypes::IManifestObject* ownerObject)
{
AZ_Assert(ownerObject, "ManifestVectorWidgets must be initialized with a non-null owner object.");
m_manifestVector.assign(first, last);
m_ownerObject = ownerObject;
UpdatePropertyGrid();
}
void SetManifestVector(const ManifestVectorType& manifestVector, DataTypes::IManifestObject* ownerObject);
ManifestVectorType GetManifestVector();
void SetCollectionName(const AZStd::string& name);
void SetCollectionTypeName(const AZStd::string& typeName);
// Sets the number of entries the user can add through this widget. It doesn't limit
// the amount of entries that can be stored.
void SetCapSize(size_t cap);
bool ContainsManifestObject(const DataTypes::IManifestObject* object) const;
bool RemoveManifestObject(const DataTypes::IManifestObject* object);
signals:
void valueChanged();
protected:
void DisplayAddPrompt();
void AddNewObject(SerializeContext::IObjectFactory* factory, const AZStd::string& typeName);
void UpdatePropertyGrid();
void UpdatePropertyGridSize();
void EmitObjectChanged(const DataTypes::IManifestObject* object);
// IPropertyEditorNotify
void AfterPropertyModified(AzToolsFramework::InstanceDataNode* /*node*/) override;
void RequestPropertyContextMenu(AzToolsFramework::InstanceDataNode* /*node*/, const QPoint& /*point*/) override;
void BeforePropertyModified(AzToolsFramework::InstanceDataNode* /*node*/) override;
void SetPropertyEditingActive(AzToolsFramework::InstanceDataNode* /*node*/) override;
void SetPropertyEditingComplete(AzToolsFramework::InstanceDataNode* /*node*/) override;
void SealUndoStack() override;
// ManifestMetaInfoBus
void ObjectUpdated(const Containers::Scene& scene, const DataTypes::IManifestObject* target, void* sender) override;
SerializeContext* m_serializeContext;
AzToolsFramework::ReflectedPropertyEditor* m_propertyEditor;
QScopedPointer<Ui::ManifestVectorWidget> m_ui;
DataTypes::IManifestObject* m_ownerObject;
ManifestVectorType m_manifestVector;
size_t m_capSize;
};
} // namespace UI
} // namespace SceneAPI
} // namespace AZ