diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index 493bb9e2f735230049af73f991025a10e02a443b..60a16eeb882c9e4d5e7bbc0c5f57787538f47fba 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -507,8 +507,7 @@ void DesignDocumentController::deleteSelected() void DesignDocumentController::copySelected() { - QScopedPointer<Model> model(Model::create("QtQuick.Rectangle", 1, 0)); - model->setMetaInfo(m_d->model->metaInfo()); + QScopedPointer<Model> model(Model::create("QtQuick.Rectangle", 1, 0, model())); model->setFileUrl(m_d->model->fileUrl()); model->changeImports(m_d->model->imports(), QList<Import>()); @@ -603,8 +602,7 @@ static void scatterItem(ModelNode pastedNode, const ModelNode targetNode, int of void DesignDocumentController::paste() { - QScopedPointer<Model> model(Model::create("empty")); - model->setMetaInfo(m_d->model->metaInfo()); + QScopedPointer<Model> model(Model::create("empty", 1, 0, model())); model->setFileUrl(m_d->model->fileUrl()); model->changeImports(m_d->model->imports(), QList<Import>()); diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp index 82154c890798ca06e6e440f559ede1c145ac92e0..0fb87afda864c903e009a2dd4701e8bd47165e58 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontrollerview.cpp @@ -155,8 +155,7 @@ void DesignDocumentControllerView::fromClipboard() QString DesignDocumentControllerView::toText() const { - QScopedPointer<Model> outputModel(Model::create("QtQuick.Rectangle", 1, 0)); - outputModel->setMetaInfo(model()->metaInfo()); + QScopedPointer<Model> outputModel(Model::create("QtQuick.Rectangle", 1, 0, model())); QPlainTextEdit textEdit; QString imports; @@ -187,8 +186,7 @@ QString DesignDocumentControllerView::toText() const void DesignDocumentControllerView::fromText(QString text) { - QScopedPointer<Model> inputModel(Model::create("QtQuick.Rectangle", 1, 0)); - inputModel->setMetaInfo(model()->metaInfo()); + QScopedPointer<Model> inputModel(Model::create("QtQuick.Rectangle", 1, 0, model())); inputModel->setFileUrl(model()->fileUrl()); QPlainTextEdit textEdit; QString imports; diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index 2445a7389d89172affceee4a826595f3eb11e360..3e28205dbee0418ce25f4e2852eb27b81d68132c 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -84,7 +84,7 @@ public: virtual ~Model(); - static Model *create(QString type, int major = 4, int minor = 7); + static Model *create(QString type, int major = 4, int minor = 7, Model *metaInfoPropxyModel = 0); Model *masterModel() const; void setMasterModel(Model *model); @@ -96,7 +96,6 @@ public: MetaInfo metaInfo(); NodeMetaInfo metaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1); bool hasNodeMetaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1); - void setMetaInfo(const MetaInfo &metaInfo); void attachView(AbstractView *view); void detachView(AbstractView *view, ViewNotification emitDetachNotify = NotifyView); @@ -109,6 +108,8 @@ public: RewriterView *rewriterView() const; + Model *metaInfoProxyModel(); + protected: Model(); diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index a5652fa76a648646a40955e042329689530a2fb3..f63d67170c6d12d11a40a21b5b38b7a71f791213 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -121,10 +121,11 @@ void ModelPrivate::detachAllViews() } } -Model *ModelPrivate::create(QString type, int major, int minor) +Model *ModelPrivate::create(QString type, int major, int minor, Model *metaInfoPropxyModel) { Model *model = new Model; + model->m_d->m_metaInfoProxyModel = metaInfoPropxyModel; model->m_d->rootNode()->setType(type); model->m_d->rootNode()->setMajorVersion(major); model->m_d->rootNode()->setMinorVersion(minor); @@ -1628,9 +1629,9 @@ Model::~Model() } -Model *Model::create(QString type, int major, int minor) +Model *Model::create(QString type, int major, int minor, Model *metaInfoPropxyModel) { - return Internal::ModelPrivate::create(type, major, minor); + return Internal::ModelPrivate::create(type, major, minor, metaInfoPropxyModel); } @@ -1686,6 +1687,18 @@ RewriterView *Model::rewriterView() const return m_d->rewriterView(); } +/*! + \brief Returns the model that is used for metainfo + \return Return itself if not other metaInfoProxyModel does exist +*/ +Model *Model::metaInfoProxyModel() +{ + if (m_d->m_metaInfoProxyModel) + return m_d->m_metaInfoProxyModel->metaInfoProxyModel(); + else + return this; +} + #if 0 /*! \brief Creates a new empty model @@ -1746,15 +1759,6 @@ NodeMetaInfo Model::metaInfo(const QString &typeName, int majorVersion, int mino return NodeMetaInfo(this, typeName, majorVersion, minorVersion); } -/*! - \brief Sets a specific Metainfo on this Model - */ -void Model::setMetaInfo(const MetaInfo &metaInfo) -{ - Internal::WriteLocker locker(m_d); - m_d->setMetaInfo(metaInfo); -} - /*! \brief Returns list of QML types available within the model. */ diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 2f15c18082f47dff510d75c38775bddc63fa887a..fbd9df9e71d5573acecb1ae7a10ef10741f0ec6e 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -97,7 +97,7 @@ public: ModelPrivate(Model *model); ~ModelPrivate(); - static Model *create(QString type, int major, int minor); + static Model *create(QString type, int major, int minor, Model *metaInfoPropxyModel); QUrl fileUrl() const; void setFileUrl(const QUrl &url); @@ -240,6 +240,8 @@ private: QWeakPointer<Model> m_masterModel; QWeakPointer<RewriterView> m_rewriterView; QWeakPointer<NodeInstanceView> m_nodeInstanceView; + QWeakPointer<Model> m_metaInfoProxyModel; + bool m_writeLock; qint32 m_internalIdCounter; }; diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index d00769284281a81d21f798554b462b8137da165e..d738810418fc5bb24792a43921abddf2b58ea27a 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -740,7 +740,7 @@ const NodeMetaInfo ModelNode::metaInfo() const throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - return NodeMetaInfo(model(), type(), majorVersion(), minorVersion()); + return NodeMetaInfo(model()->metaInfoProxyModel(), type(), majorVersion(), minorVersion()); } /*! \brief has a node the selection of the model diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 8f3920b4ec07b8919f12024be19122afdd6ca803..4d58ca087431a08c3e750079f4110efc8426bf30 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -43,6 +43,7 @@ #include "texttomodelmerger.h" #include "rewriterview.h" #include "variantproperty.h" +#include "nodemetainfo.h" #include <languageutils/componentversion.h> #include <qmljs/qmljsevaluate.h> @@ -727,6 +728,8 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, int majorVersion; int minorVersion; context->lookup(astObjectType, typeName, majorVersion, minorVersion, defaultPropertyName); + if (defaultPropertyName.isEmpty()) //fallback and use the meta system of the model + defaultPropertyName = modelNode.metaInfo().defaultPropertyName(); if (typeName.isEmpty()) { qWarning() << "Skipping node with unknown type" << flatten(astObjectType);