diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e5fde3..3427f69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,10 @@ set(H_HEADER_FILES include/designerView.h include/operationCommand.h + include/propertyType/CustomGadget.h + include/propertyType/CustomType.h + include/propertyType/PropertyTypeCustomization_CustomType.h + include/util/baseSelector.h include/util/creatingSelector.h include/util/movingSelector.h @@ -69,6 +73,8 @@ set(CPP_SOURCE_FILES source/designerView.cpp source/operationCommand.cpp + source/propertyType/PropertyTypeCustomization_CustomType.cpp + source/util/baseSelector.cpp source/util/creatingSelector.cpp source/util/movingSelector.cpp diff --git a/include/CommonInclude.h b/include/CommonInclude.h index 448a985..acb5d46 100644 --- a/include/CommonInclude.h +++ b/include/CommonInclude.h @@ -11,7 +11,7 @@ Type get##Name(){ return Name; } \ void set##Name(Type var){ \ Name = var; \ - qDebug() << "Set" << static_cast(this) <<#Name <<": " < +#include +#include +#include +#include +#include + #include "CommonInclude.h" +#include "propertyType/CustomType.h" +#include "propertyType/CustomGadget.h" #include "graphicsItem/graphicsBaseItem.h" class GraphicsBusSectionItem : public GraphicsBaseItem { Q_OBJECT + Q_CLASSINFO("LimitedDouble", "Min=0,Max=10") public: explicit GraphicsBusSectionItem(const QRect &rect, QGraphicsItem *parent = nullptr); @@ -18,8 +28,35 @@ public: void move(const QPointF&) override; void editShape(int, const QPointF&) override; - public: +public: + enum QCustomEnum { + One, + Two, + Three + }; + Q_ENUM(QCustomEnum); + +public: Q_PROPERTY_VAR(int, Int) = 0; + Q_PROPERTY_VAR(float, Float) = 1.23f; + Q_PROPERTY_VAR(double, LimitedDouble) = 5; + Q_PROPERTY_VAR(QString, String); + Q_PROPERTY_VAR(QDir, Directory) = QDir("."); + Q_PROPERTY_VAR(QVector2D, Vec2) = QVector2D(1, 2); + Q_PROPERTY_VAR(QVector3D, Vec3) = QVector3D(1, 2, 3); + Q_PROPERTY_VAR(QVector4D, Vec4) = QVector4D(1, 2, 3, 4); + Q_PROPERTY_VAR(QMatrix4x4, Mat4); + Q_PROPERTY_VAR(QColor, Color); + Q_PROPERTY_VAR(QList, ColorList) = { Qt::red,Qt::green,Qt::blue }; + + typedef QMap StringColorMap; + Q_PROPERTY_VAR(StringColorMap, ColorMap) = { {"Red",Qt::red},{"Green",Qt::green},{"Blue",Qt::blue} }; + + Q_PROPERTY_VAR(QCustomEnum, CustomEnum) = QCustomEnum::One; + Q_PROPERTY_VAR(QCustomType, CustomType); + Q_PROPERTY_VAR(QCustomGadget, CustomGadget); + Q_PROPERTY_VAR(QCustomGadget*, CustomGadgetPtr) = new QCustomGadget; + Q_PROPERTY_VAR(QSharedPointer, CustomGadgetSharedPtr) = QSharedPointer::create(); protected: virtual QPainterPath shape() override; diff --git a/include/propertyType/CustomGadget.h b/include/propertyType/CustomGadget.h new file mode 100644 index 0000000..2862458 --- /dev/null +++ b/include/propertyType/CustomGadget.h @@ -0,0 +1,20 @@ +#ifndef CustomGadget_h__ +#define CustomGadget_h__ + +#include "CommonInclude.h" + +class QCustomGadget { + Q_GADGET + Q_CLASSINFO("LimitedDouble", "Min=0,Max=10") +public: + Q_PROPERTY_VAR(double, LimitedDouble) = 1; + Q_PROPERTY_VAR(QString, Desc) = "This is inline Gadget"; +}; + +static QDebug operator<<(QDebug debug, const QCustomGadget& gadget) { + return debug << gadget.LimitedDouble << gadget.Desc; +} + +Q_DECLARE_METATYPE(QSharedPointer); + +#endif // CustomGadget_h__ \ No newline at end of file diff --git a/include/propertyType/CustomType.h b/include/propertyType/CustomType.h new file mode 100644 index 0000000..7674a7e --- /dev/null +++ b/include/propertyType/CustomType.h @@ -0,0 +1,18 @@ +#ifndef CustomType_h__ +#define CustomType_h__ + +#include +#include + +struct QCustomType { + unsigned int ArraySize = 0; + QVector Array; +}; + +static QDebug operator<<(QDebug debug, const QCustomType& it) { + return debug << it.Array; +} + +Q_DECLARE_METATYPE(QCustomType) + +#endif // CustomType_h__ diff --git a/include/propertyType/PropertyTypeCustomization_CustomType.h b/include/propertyType/PropertyTypeCustomization_CustomType.h new file mode 100644 index 0000000..3d847cf --- /dev/null +++ b/include/propertyType/PropertyTypeCustomization_CustomType.h @@ -0,0 +1,12 @@ +#ifndef PropertyTypeCustomization_CustomType_h__ +#define PropertyTypeCustomization_CustomType_h__ + +#include "IPropertyTypeCustomization.h" + +class PropertyTypeCustomization_CustomType : public IPropertyTypeCustomization { +protected: + virtual void customizeHeaderRow(QPropertyHandle* inPropertyHandle, QQuickDetailsViewRowBuilder* inBuilder) override; + virtual void customizeChildren(QPropertyHandle* inPropertyHandle, QQuickDetailsViewLayoutBuilder* inBuilder) override; +}; + +#endif // PropertyTypeCustomization_CustomType_h__ diff --git a/source/mainwindow.cpp b/source/mainwindow.cpp index ca0c0b8..61fef0f 100644 --- a/source/mainwindow.cpp +++ b/source/mainwindow.cpp @@ -16,6 +16,9 @@ #include "FloatingDockContainer.h" #include "DockComponentsFactory.h" +#include "QQuickDetailsViewMananger.h" +#include "propertyType/PropertyTypeCustomization_CustomType.h" +#include "propertyType/CustomType.h" #include "QDetailsView.h" #include "util/selectorManager.h" @@ -87,12 +90,15 @@ void CMainWindow::initializeDockUi() m_pDockManager->addDockWidget(DockWidgetArea::LeftDockWidgetArea, grapicElementsDockWidget); ui->menuView->addAction(grapicElementsDockWidget->toggleViewAction()); + QQuickDetailsViewManager::Get()->registerPropertyTypeCustomization(); + m_pPropertiesEditorView = new QDetailsView(); CDockWidget* propertiesDockWidget = new CDockWidget(QString::fromWCharArray(L"属性编辑器")); propertiesDockWidget->setWidget(m_pPropertiesEditorView); propertiesDockWidget->setMinimumSizeHintMode(CDockWidget::MinimumSizeHintFromDockWidget); - propertiesDockWidget->resize(250, 150); - propertiesDockWidget->setMinimumSize(200,150); + propertiesDockWidget->resize(550, 150); + propertiesDockWidget->setMinimumSize(500,150); + m_pPropertiesEditorView->setObject(m_pDrawingPanel->getQGraphicsScene()); m_pDockManager->addDockWidget(DockWidgetArea::RightDockWidgetArea, propertiesDockWidget, centralDockArea); ui->menuView->addAction(propertiesDockWidget->toggleViewAction()); } @@ -171,7 +177,6 @@ void CMainWindow::onSignal_addItem(GraphicsBaseItem* item) { if(item) { - // m_pPropertiesEditorView->setObject(static_cast(item)); QUndoCommand* addItemCommand = new AddItemCommand(item, item->scene()); m_pUndoStack->push(addItemCommand); } diff --git a/source/propertyType/PropertyTypeCustomization_CustomType.cpp b/source/propertyType/PropertyTypeCustomization_CustomType.cpp new file mode 100644 index 0000000..612738f --- /dev/null +++ b/source/propertyType/PropertyTypeCustomization_CustomType.cpp @@ -0,0 +1,73 @@ +#include "propertyType/PropertyTypeCustomization_CustomType.h" +#include "QQuickDetailsViewLayoutBuilder.h" +#include "QPropertyHandle.h" +#include +#include +#include +#include "QQuickDetailsViewModel.h" +#include "propertyType/CustomType.h" +#include "QQuickFunctionLibrary.h" + +void PropertyTypeCustomization_CustomType::customizeHeaderRow(QPropertyHandle* inPropertyHandle, QQuickDetailsViewRowBuilder* inBuilder) +{ + auto editorSlot = inBuilder->makeNameValueSlot(); + inPropertyHandle->setupNameEditor(editorSlot.first); + auto buttonItem = inBuilder->setupItem(editorSlot.second, R"( + import QtQuick; + import QtQuick.Controls; + Button{ + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + width: 80 + height: 20 + text: "Sort" + } + )"); + + + QQuickFunctionLibrary::connect(buttonItem, SIGNAL(clicked()), inPropertyHandle, [inPropertyHandle]() { + QCustomType customType = inPropertyHandle->getVar().value(); + std::sort(customType.Array.begin(), customType.Array.end()); + inPropertyHandle->setVar(QVariant::fromValue(customType)); + if (auto arrayHandle = inPropertyHandle->findChild("Array")) { + } + }); +} + +void PropertyTypeCustomization_CustomType::customizeChildren(QPropertyHandle* inPropertyHandle, QQuickDetailsViewLayoutBuilder* inBuilder) +{ + auto arrayHandle = inPropertyHandle->findOrCreateChild( + QMetaType::fromType>(), + "Array", + [inPropertyHandle]() { + return QVariant::fromValue(inPropertyHandle->getVar().value().Array); + }, + [inPropertyHandle](QVariant var) { + QCustomType customType = inPropertyHandle->getVar().value(); + customType.Array = var.value>(); + inPropertyHandle->setVar(QVariant::fromValue(customType)); + } + ); + + auto arraySizeHandle = inPropertyHandle->findOrCreateChild( + QMetaType::fromType(), + "ArraySize", + [inPropertyHandle]() { + return inPropertyHandle->getVar().value().ArraySize; + }, + [inPropertyHandle, arrayHandle](QVariant var) { + QCustomType customType = inPropertyHandle->getVar().value(); + customType.ArraySize = var.toUInt(); + customType.Array.resize(customType.ArraySize); + for (int i = 0; i < customType.ArraySize; ++i) { + customType.Array[i] = QRandomGenerator::global()->bounded(-100000, 100000); + } + inPropertyHandle->setVar(QVariant::fromValue(customType)); + arrayHandle->invalidateStructure(); + } + ); + + inBuilder->addProperty(arraySizeHandle); + inBuilder->addProperty(arrayHandle); +} +