diff --git a/PropertyEditor/source/src/Customization/PropertyTypeCustomization_PointF.cpp b/PropertyEditor/source/src/Customization/PropertyTypeCustomization_PointF.cpp new file mode 100644 index 0000000..aa35383 --- /dev/null +++ b/PropertyEditor/source/src/Customization/PropertyTypeCustomization_PointF.cpp @@ -0,0 +1,71 @@ +#include "PropertyTypeCustomization_PointF.h" +#include "QQuickDetailsViewLayoutBuilder.h" +#include "QQuickDetailsViewMananger.h" +#include "QPropertyHandle.h" +#include +#include +#include + +void PropertyTypeCustomization_PointF::customizeHeaderRow(QPropertyHandle* inPropertyHandle, QQuickDetailsViewRowBuilder* inBuilder) +{ + auto slotPair = inBuilder->makeNameValueSlot(); + + QQuickItem* nameEditor = inPropertyHandle->setupNameEditor(slotPair.first); + + QQuickItem* valueLabel = inBuilder->setupItem(slotPair.second, R"( + import QtQuick; + import QtQuick.Controls; + import ColorPalette; + Item{ + property string pointText + implicitHeight: 25 + width: parent.width + anchors.verticalCenter: parent.verticalCenter + Text { + anchors.fill: parent + verticalAlignment: Text.AlignVCenter + text: pointText + color: ColorPalette.theme.textPrimary + } + } + )"); + + auto updateLabel = [valueLabel](const QVariant& var) { + QPointF pt = var.value(); + valueLabel->setProperty("pointText", QString("(%1, %2)").arg(pt.x(), 0, 'f', 3).arg(pt.y(), 0, 'f', 3)); + }; + updateLabel(inPropertyHandle->getVar()); + + QObject::connect(inPropertyHandle, &QPropertyHandle::asVarChanged, valueLabel, updateLabel); + + QQmlEngine* engine = qmlEngine(inBuilder->rootItem()); + QQmlContext* context = qmlContext(inBuilder->rootItem()); + context->parentContext()->setContextProperty("heightProxy", valueLabel); +} + +void PropertyTypeCustomization_PointF::customizeChildren(QPropertyHandle* inPropertyHandle, QQuickDetailsViewLayoutBuilder* inBuilder) +{ + auto makeChild = [&](const QString& name, std::function getter) { + inBuilder->addProperty( + inPropertyHandle->findOrCreateChild( + QMetaType::fromType(), + name, + [inPropertyHandle, getter]() -> QVariant { + return getter(inPropertyHandle->getVar().value()); + }, + [inPropertyHandle, name](const QVariant& var) { + QPointF pt = inPropertyHandle->getVar().value(); + if (name == "x") + pt.setX(var.toDouble()); + else + pt.setY(var.toDouble()); + inPropertyHandle->setVar(pt); + } + ), + name + ); + }; + + makeChild("x", [](const QPointF& pt) { return pt.x(); }); + makeChild("y", [](const QPointF& pt) { return pt.y(); }); +} diff --git a/PropertyEditor/source/src/Customization/PropertyTypeCustomization_PointF.h b/PropertyEditor/source/src/Customization/PropertyTypeCustomization_PointF.h new file mode 100644 index 0000000..3897b2c --- /dev/null +++ b/PropertyEditor/source/src/Customization/PropertyTypeCustomization_PointF.h @@ -0,0 +1,12 @@ +#ifndef PropertyTypeCustomization_PointF_h__ +#define PropertyTypeCustomization_PointF_h__ + +#include "IPropertyTypeCustomization.h" + +class PropertyTypeCustomization_PointF : public IPropertyTypeCustomization { +protected: + virtual void customizeHeaderRow(QPropertyHandle* inPropertyHandle, QQuickDetailsViewRowBuilder* inBuilder) override; + virtual void customizeChildren(QPropertyHandle* inPropertyHandle, QQuickDetailsViewLayoutBuilder* inBuilder) override; +}; + +#endif // PropertyTypeCustomization_PointF_h__ diff --git a/PropertyEditor/source/src/QQuickDetailsViewMananger.cpp b/PropertyEditor/source/src/QQuickDetailsViewMananger.cpp index 91cb3c7..34dd494 100644 --- a/PropertyEditor/source/src/QQuickDetailsViewMananger.cpp +++ b/PropertyEditor/source/src/QQuickDetailsViewMananger.cpp @@ -8,9 +8,11 @@ #include "Customization/PropertyTypeCustomization_ObjectDefault.h" #include "Customization/PropertyTypeCustomization_Matrix4x4.h" #include "Customization/PropertyTypeCustomization_Font.h" +#include "Customization/PropertyTypeCustomization_PointF.h" #include #include #include +#include QQuickDetailsViewManager* QQuickDetailsViewManager::Get() { @@ -144,5 +146,9 @@ QQuickDetailsViewManager::QQuickDetailsViewManager() mMetaTypeCustomizationMap.insert(QMetaType::fromType(), []() { return QSharedPointer::create(); }); + + mMetaTypeCustomizationMap.insert(QMetaType::fromType(), []() { + return QSharedPointer::create(); + }); }