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.
173 lines
5.4 KiB
C++
173 lines
5.4 KiB
C++
/*
|
|
* 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
|
|
*
|
|
*/
|
|
|
|
#include "EditorDefs.h"
|
|
|
|
#include "PropertyMiscCtrl.h"
|
|
|
|
// Qt
|
|
#include <QHBoxLayout>
|
|
#include <QtWidgets/QLabel>
|
|
#include <QLineEdit>
|
|
#include <QtWidgets/QToolButton>
|
|
#include <QtCore/QTimer>
|
|
#include <QtUtilWin.h>
|
|
|
|
// Editor
|
|
#include "GenericSelectItemDialog.h"
|
|
#include "QtViewPaneManager.h"
|
|
|
|
|
|
UserPropertyEditor::UserPropertyEditor(QWidget *pParent /*= nullptr*/)
|
|
: QWidget(pParent)
|
|
, m_canEdit(false)
|
|
, m_useTree(false)
|
|
{
|
|
m_valueLabel = new QLabel;
|
|
|
|
QToolButton *mainButton = new QToolButton;
|
|
mainButton->setText("..");
|
|
connect(mainButton, &QToolButton::clicked, this, &UserPropertyEditor::onEditClicked);
|
|
|
|
QHBoxLayout *mainLayout = new QHBoxLayout(this);
|
|
mainLayout->addWidget(m_valueLabel, 1);
|
|
mainLayout->addWidget(mainButton);
|
|
mainLayout->setContentsMargins(1, 1, 1, 1);
|
|
}
|
|
|
|
void UserPropertyEditor::SetValue(const QString &value, bool notify /*= true*/)
|
|
{
|
|
if (m_value != value)
|
|
{
|
|
m_value = value;
|
|
m_valueLabel->setText(m_value);
|
|
if (notify)
|
|
{
|
|
emit ValueChanged(m_value);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void UserPropertyEditor::SetData(bool canEdit, bool useTree, const QString &treeSeparator, const QString &dialogTitle, const std::vector<IVariable::IGetCustomItems::SItem>& items)
|
|
{
|
|
m_canEdit = canEdit;
|
|
m_useTree = useTree;
|
|
m_treeSeparator = treeSeparator;
|
|
m_dialogTitle = dialogTitle;
|
|
m_items = items;
|
|
}
|
|
|
|
void UserPropertyEditor::onEditClicked()
|
|
{
|
|
// call the user supplied callback to fill-in items and get dialog title
|
|
emit RefreshItems();
|
|
if (m_canEdit) // if func didn't veto, show the dialog
|
|
{
|
|
CGenericSelectItemDialog gtDlg;
|
|
if (m_useTree)
|
|
{
|
|
gtDlg.SetMode(CGenericSelectItemDialog::eMODE_TREE);
|
|
if (!m_treeSeparator.isEmpty())
|
|
{
|
|
gtDlg.SetTreeSeparator(m_treeSeparator);
|
|
}
|
|
}
|
|
gtDlg.SetItems(m_items);
|
|
if (m_dialogTitle.isEmpty() == false)
|
|
gtDlg.setWindowTitle(m_dialogTitle);
|
|
gtDlg.PreSelectItem(GetValue());
|
|
if (gtDlg.exec() == QDialog::Accepted)
|
|
{
|
|
QString selectedItemStr = gtDlg.GetSelectedItem();
|
|
|
|
if (selectedItemStr.isEmpty() == false)
|
|
{
|
|
SetValue(selectedItemStr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
QWidget* UserPopupWidgetHandler::CreateGUI(QWidget *pParent)
|
|
{
|
|
UserPropertyEditor* newCtrl = aznew UserPropertyEditor(pParent);
|
|
connect(newCtrl, &UserPropertyEditor::ValueChanged, newCtrl, [newCtrl]()
|
|
{
|
|
EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, newCtrl);
|
|
});
|
|
|
|
return newCtrl;
|
|
}
|
|
|
|
void UserPopupWidgetHandler::ConsumeAttribute(UserPropertyEditor* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName)
|
|
{
|
|
Q_UNUSED(GUI);
|
|
Q_UNUSED(attrib);
|
|
Q_UNUSED(attrValue);
|
|
Q_UNUSED(debugName);
|
|
}
|
|
|
|
void UserPopupWidgetHandler::WriteGUIValuesIntoProperty(size_t index, UserPropertyEditor* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node)
|
|
{
|
|
Q_UNUSED(index);
|
|
Q_UNUSED(node);
|
|
CReflectedVarUser val = instance;
|
|
val.m_value = GUI->GetValue().toUtf8().data();
|
|
instance = static_cast<property_t>(val);
|
|
}
|
|
|
|
bool UserPopupWidgetHandler::ReadValuesIntoGUI(size_t index, UserPropertyEditor* GUI, const property_t& instance, AzToolsFramework::InstanceDataNode* node)
|
|
{
|
|
Q_UNUSED(index);
|
|
Q_UNUSED(node);
|
|
CReflectedVarUser val = instance;
|
|
|
|
assert(val.m_itemNames.size() == val.m_itemDescriptions.size());
|
|
|
|
std::vector<IVariable::IGetCustomItems::SItem> items(val.m_itemNames.size());
|
|
int i = -1;
|
|
std::generate(items.begin(), items.end(), [&val, &i]() { ++i; return IVariable::IGetCustomItems::SItem(val.m_itemNames[i].c_str(), val.m_itemDescriptions[i].c_str());});
|
|
|
|
GUI->SetData(val.m_enableEdit, val.m_useTree, val.m_treeSeparator.c_str(), val.m_dialogTitle.c_str(), items);
|
|
GUI->SetValue(val.m_value.c_str(), false);
|
|
return false;
|
|
}
|
|
|
|
#include <Controls/ReflectedPropertyControl/moc_PropertyMiscCtrl.cpp>
|
|
|
|
QWidget* FloatCurveHandler::CreateGUI(QWidget *pParent)
|
|
{
|
|
CSplineCtrl *cSpline = new CSplineCtrl(pParent);
|
|
cSpline->SetUpdateCallback([this](CSplineCtrl* spl) { OnSplineChange(spl); });
|
|
cSpline->SetTimeRange(0, 1);
|
|
cSpline->SetValueRange(0, 1);
|
|
cSpline->SetGrid(12, 12);
|
|
cSpline->setFixedHeight(52);
|
|
return cSpline;
|
|
}
|
|
void FloatCurveHandler::OnSplineChange(CSplineCtrl*)
|
|
{
|
|
// EBUS_EVENT(AzToolsFramework::PropertyEditorGUIMessages::Bus, RequestWrite, splineWidget);
|
|
}
|
|
|
|
void FloatCurveHandler::ConsumeAttribute(CSplineCtrl *, AZ::u32, AzToolsFramework::PropertyAttributeReader*, const char*)
|
|
{}
|
|
|
|
void FloatCurveHandler::WriteGUIValuesIntoProperty([[maybe_unused]] size_t index, [[maybe_unused]] CSplineCtrl* GUI, [[maybe_unused]] property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
|
|
{
|
|
//nothing to do here. the spline itself will have it's new values.
|
|
}
|
|
|
|
bool FloatCurveHandler::ReadValuesIntoGUI([[maybe_unused]] size_t index, CSplineCtrl* GUI, const property_t& instance, [[maybe_unused]] AzToolsFramework::InstanceDataNode* node)
|
|
{
|
|
GUI->SetSpline(reinterpret_cast<ISplineInterpolator*>(instance.m_spline));
|
|
return false;
|
|
}
|