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/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/MotionSetNameHandler.cpp

114 lines
4.0 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include "MotionSetNameHandler.h"
#include <Integration/Assets/MotionSetAsset.h>
#include <Integration/System/SystemCommon.h>
#include <EMotionFX/Source/MotionSet.h>
namespace EMotionFX
{
AZ_CLASS_ALLOCATOR_IMPL(MotionSetNameHandler, EditorAllocator, 0)
AZ::u32 MotionSetNameHandler::GetHandlerName() const
{
return AZ_CRC("MotionSetName", 0xcf534ea6);
}
QWidget* MotionSetNameHandler::CreateGUI(QWidget* parent)
{
QComboBox* picker = new QComboBox(parent);
connect(picker, &QComboBox::currentTextChanged, this, [picker]()
{
EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, picker);
});
return picker;
}
void MotionSetNameHandler::ConsumeAttribute(QComboBox* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, [[maybe_unused]] const char* debugName)
{
if (attrib == AZ::Edit::Attributes::ReadOnly)
{
bool value;
if (attrValue->Read<bool>(value))
{
GUI->setEnabled(!value);
}
}
else if (attrib == AZ_CRC("MotionSetAsset", 0xd4e88984))
{
AZ::Data::Asset<Integration::MotionSetAsset>* value;
if (attrValue->Read<AZ::Data::Asset<Integration::MotionSetAsset>*>(value))
{
m_motionSetAsset = value;
}
else
{
// emit a warning!
AZ_WarningOnce("MotionSetNameHandler", false, "Failed to read 'MotionSetAsset' attribute from property '%s' into MotionSetNameHandler", debugName);
}
}
}
void MotionSetNameHandler::WriteGUIValuesIntoProperty(size_t index, QComboBox* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node)
{
AZ_UNUSED(index);
AZ_UNUSED(node);
const QString& currentText = GUI->currentText();
instance = AZStd::string(currentText.toUtf8().data(), currentText.length());
}
bool MotionSetNameHandler::ReadValuesIntoGUI(size_t index, QComboBox* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node)
{
AZ_UNUSED(index);
AZ_UNUSED(node);
QSignalBlocker signalBlocker(GUI);
GUI->clear();
if (m_motionSetAsset && m_motionSetAsset->Get() && m_motionSetAsset->Get()->m_emfxMotionSet)
{
const AZStd::unique_ptr<EMotionFX::MotionSet>& emfxMotionSet = m_motionSetAsset->Get()->m_emfxMotionSet;
AZStd::vector<const MotionSet*> motionSets;
const bool isOwnedByRutime = emfxMotionSet->GetIsOwnedByRuntime();
emfxMotionSet->RecursiveGetMotionSets(motionSets, isOwnedByRutime);
for (const EMotionFX::MotionSet* motionSet : motionSets)
{
GUI->addItem(motionSet->GetName());
}
if (!instance.empty())
{
GUI->setCurrentText(instance.c_str());
}
else
{
// Choose the root motion set
GUI->setCurrentText(emfxMotionSet->GetName());
}
}
else if (!GUI->isEnabled() && !instance.empty())
{
// When the game is running, the handler is disabled but we still want to show the value
GUI->addItem(instance.c_str());
GUI->setCurrentText(instance.c_str());
}
return true;
}
} // namespace EMotionFX
#include <Source/Editor/PropertyWidgets/moc_MotionSetNameHandler.cpp>