diff --git a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp index ed8a3bcec0e..ddb75459eb1 100644 --- a/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocumentcontroller.cpp @@ -625,7 +625,7 @@ void DesignDocumentController::paste() int offset = double(qrand()) / RAND_MAX * 20 - 10; foreach (const ModelNode &node, selectedNodes) { - QString defaultProperty(targetNode.metaInfo().defaultProperty()); + QString defaultProperty(targetNode.metaInfo().defaultPropertyName()); ModelNode pastedNode(view.insertModel(node)); pastedNodeList.append(pastedNode); scatterItem(pastedNode, targetNode, offset); @@ -658,7 +658,7 @@ void DesignDocumentController::paste() targetNode = targetNode.parentProperty().parentModelNode(); - QString defaultProperty(targetNode.metaInfo().defaultProperty()); + QString defaultProperty(targetNode.metaInfo().defaultPropertyName()); scatterItem(pastedNode, targetNode); if (targetNode.nodeListProperty(defaultProperty).isValid()) { diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 2704c336d6f..8dbfcf80a68 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -137,7 +136,7 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data, if (!parentNode.metaInfo().hasDefaultProperty()) return false; targetIndex -= visibleProperties(parentNode).count(); - parentPropertyName = parentNode.metaInfo().defaultProperty(); + parentPropertyName = parentNode.metaInfo().defaultPropertyName(); } else { parentItemIndex = parentIndex.parent(); @@ -482,7 +481,7 @@ void NavigatorTreeModel::removeSubTree(const ModelNode &node) void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty parentProperty, const QList &modelNodes, int targetIndex) { try { - QString propertyQmlType = qmlTypeInQtContainer(parentProperty.metaInfo().type()); + QString propertyQmlType = qmlTypeInQtContainer(parentProperty.parentModelNode().metaInfo().propertyTypeName(parentProperty.name())); RewriterTransaction transaction = m_view->beginRewriterTransaction(); foreach (const ModelNode &node, modelNodes) { @@ -539,7 +538,7 @@ QList NavigatorTreeModel::modelNodeChildren(const ModelNode &parentNo QStringList properties; if (parentNode.metaInfo().hasDefaultProperty()) - properties << parentNode.metaInfo().defaultProperty(); + properties << parentNode.metaInfo().defaultPropertyName(); properties << visibleProperties(parentNode); @@ -565,7 +564,7 @@ QString NavigatorTreeModel::qmlTypeInQtContainer(const QString &qtContainerType) if (typeName.endsWith('*')) typeName.chop(1); - return m_view->model()->metaInfo().fromQtTypes(typeName); + return typeName; } @@ -573,13 +572,13 @@ QStringList NavigatorTreeModel::visibleProperties(const ModelNode &node) const { QStringList propertyList; - foreach (const QString &propertyName, node.metaInfo().propertyNamesOnlyContainer()) { - if (!m_hiddenProperties.contains(propertyName) && - propertyName != node.metaInfo().defaultProperty()) { // TODO: ask the node instances + foreach (const QString &propertyName, node.metaInfo().propertyNames()) { + if (node.metaInfo().propertyIsWritable(propertyName) && !m_hiddenProperties.contains(propertyName) && + propertyName != node.metaInfo().defaultPropertyName()) { // TODO: ask the node instances - QString qmlType = qmlTypeInQtContainer(node.metaInfo().propertyType(propertyName)); - if (node.metaInfo().metaInfo().hasNodeMetaInfo(qmlType) && - node.metaInfo().metaInfo().nodeMetaInfo(qmlType).isSubclassOf("QGraphicsObject", -1, -1)) { + QString qmlType = qmlTypeInQtContainer(node.metaInfo().propertyTypeName(propertyName)); + if (node.model()->metaInfo(qmlType).isValid() && + node.model()->metaInfo(qmlType).isSubclassOf("QGraphicsObject", -1, -1)) { propertyList.append(propertyName); } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp index 3dca495b22b..9ba38256f6e 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditor.cpp @@ -32,13 +32,10 @@ #include #include -#include - #include #include #include #include -#include #include @@ -226,10 +223,10 @@ void PropertyEditor::NodeType::initialSetup(const QString &typeName, const QUrl { QDeclarativeContext *ctxt = m_view->rootContext(); - NodeMetaInfo metaInfo = propertyEditor->model()->metaInfo().nodeMetaInfo(typeName, 4, 7); + NodeMetaInfo metaInfo = propertyEditor->model()->metaInfo(typeName, 4, 7); foreach (const QString &propertyName, metaInfo.propertyNames()) - setupPropertyEditorValue(propertyName, &m_backendValuesPropertyMap, propertyEditor, metaInfo.propertyType(propertyName)); + setupPropertyEditorValue(propertyName, &m_backendValuesPropertyMap, propertyEditor, metaInfo.propertyTypeName(propertyName)); PropertyEditorValue *valueObject = qobject_cast(QDeclarativeMetaType::toQObject(m_backendValuesPropertyMap.value("className"))); if (!valueObject) @@ -388,7 +385,7 @@ void PropertyEditor::changeValue(const QString &propertyName) QVariant castedValue; if (fxObjectNode.modelNode().metaInfo().isValid() && fxObjectNode.modelNode().metaInfo().hasProperty(propertyName)) { - castedValue = fxObjectNode.modelNode().metaInfo().nativePropertyValue(propertyName, value->value()); + castedValue = fxObjectNode.modelNode().metaInfo().propertyCastedValue(propertyName, value->value()); } else { qWarning() << "PropertyEditor:" <fileUrl().toLocalFile()).absolutePath()); @@ -448,12 +445,12 @@ void PropertyEditor::changeExpression(const QString &name) PropertyEditorValue *value = qobject_cast(QDeclarativeMetaType::toQObject(m_currentType->m_backendValuesPropertyMap.value(underscoreName))); if (fxObjectNode.modelNode().metaInfo().isValid() && fxObjectNode.modelNode().metaInfo().hasProperty(name)) { - if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("QColor")) { + if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("QColor")) { if (QColor(value->expression().remove('"')).isValid()) { fxObjectNode.setVariantProperty(name, QColor(value->expression().remove('"'))); return; } - } else if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("bool")) { + } else if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("bool")) { if (value->expression().compare("false", Qt::CaseInsensitive) == 0 || value->expression().compare("true", Qt::CaseInsensitive) == 0) { if (value->expression().compare("true", Qt::CaseInsensitive) == 0) fxObjectNode.setVariantProperty(name, true); @@ -461,14 +458,14 @@ void PropertyEditor::changeExpression(const QString &name) fxObjectNode.setVariantProperty(name, false); return; } - } else if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("int")) { + } else if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("int")) { bool ok; int intValue = value->expression().toInt(&ok); if (ok) { fxObjectNode.setVariantProperty(name, intValue); return; } - } else if (fxObjectNode.modelNode().metaInfo().propertyType(name) == QLatin1String("qreal")) { + } else if (fxObjectNode.modelNode().metaInfo().propertyTypeName(name) == QLatin1String("qreal")) { bool ok; qreal realValue = value->expression().toFloat(&ok); if (ok) { @@ -585,7 +582,7 @@ QString templateGeneration(NodeMetaInfo type, NodeMetaInfo superType, const QmlO QString properName = name; properName.replace(".", "_"); - QString typeName = type.propertyType(name); + QString typeName = type.propertyTypeName(name); //alias resolution only possible with instance if (typeName == QLatin1String("alias") && objectNode.isValid()) typeName = objectNode.instanceType(name); @@ -650,7 +647,7 @@ void PropertyEditor::resetView() if (m_selectedNode.isValid() && !QFileInfo(qmlSpecificsFile.toLocalFile()).exists() && m_selectedNode.metaInfo().isValid()) { //do magic !! - specificQmlData = templateGeneration(m_selectedNode.metaInfo(), model()->metaInfo().nodeMetaInfo(specificsClassName), m_selectedNode); + specificQmlData = templateGeneration(m_selectedNode.metaInfo(), model()->metaInfo(specificsClassName), m_selectedNode); } NodeType *type = m_typeHash.value(qmlFile.toString()); diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index 776f2aa2c4c..079d4975d1e 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -34,7 +34,6 @@ #include #include #include -#include #include #include @@ -54,7 +53,7 @@ QVariant PropertyEditorValue::value() const { QVariant returnValue = m_value; if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) - if (modelNode().metaInfo().propertyType(name()) == QLatin1String("QUrl")) { + if (modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("QUrl")) { returnValue = returnValue.toUrl().toString(); } return returnValue; @@ -98,7 +97,7 @@ void PropertyEditorValue::setValueWithEmit(const QVariant &value) if (m_value != value) { QVariant newValue = value; if (modelNode().isValid() && modelNode().metaInfo().isValid() && modelNode().metaInfo().hasProperty(name())) - if (modelNode().metaInfo().propertyType(name()) == QLatin1String("QUrl")) { + if (modelNode().metaInfo().propertyTypeName(name()) == QLatin1String("QUrl")) { newValue = QUrl(newValue.toString()); } @@ -272,7 +271,7 @@ void PropertyEditorNodeWrapper::add(const QString &type) if ((m_editorValue && m_editorValue->modelNode().isValid())) { if (propertyType.isEmpty()) - propertyType = m_editorValue->modelNode().metaInfo().propertyType(m_editorValue->name()); + propertyType = m_editorValue->modelNode().metaInfo().propertyTypeName(m_editorValue->name()); while (propertyType.contains('*')) //strip star propertyType.chop(1); m_modelNode = m_editorValue->modelNode().view()->createModelNode(propertyType, 4, 7); diff --git a/src/plugins/qmldesigner/designercore/designercore.pri b/src/plugins/qmldesigner/designercore/designercore.pri index f27e22c7101..10570f523b1 100644 --- a/src/plugins/qmldesigner/designercore/designercore.pri +++ b/src/plugins/qmldesigner/designercore/designercore.pri @@ -11,10 +11,8 @@ DEPENDPATH += $$PWD $$PWD/include SOURCES += $$PWD/model/abstractview.cpp \ $$PWD/instances/nodeinstanceview.cpp \ $$PWD/model/rewriterview.cpp \ - $$PWD/metainfo/enumeratormetainfo.cpp \ $$PWD/metainfo/metainfo.cpp \ $$PWD/metainfo/metainfoparser.cpp \ - $$PWD/metainfo/propertymetainfo.cpp \ $$PWD/metainfo/nodemetainfo.cpp \ $$PWD/metainfo/itemlibraryinfo.cpp \ $$PWD/metainfo/subcomponentmanager.cpp \ @@ -126,11 +124,9 @@ HEADERS += $$PWD/include/corelib_global.h \ $$PWD/include/abstractview.h \ $$PWD/include/nodeinstanceview.h \ $$PWD/include/rewriterview.h \ - $$PWD/include/enumeratormetainfo.h \ $$PWD/include/metainfo.h \ $$PWD/include/metainfoparser.h \ $$PWD/include/nodemetainfo.h \ - $$PWD/include/propertymetainfo.h \ $$PWD/include/itemlibraryinfo.h \ $$PWD/model/internalproperty.h \ $$PWD/include/modelnode.h \ diff --git a/src/plugins/qmldesigner/designercore/include/abstractproperty.h b/src/plugins/qmldesigner/designercore/include/abstractproperty.h index 6a33e2d5216..2664fb1e1b7 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractproperty.h +++ b/src/plugins/qmldesigner/designercore/include/abstractproperty.h @@ -52,7 +52,6 @@ namespace QmlDesigner { class Model; class ModelNode; class AbstractView; -class PropertyMetaInfo; class CORESHARED_EXPORT VariantProperty; class CORESHARED_EXPORT NodeListProperty; class CORESHARED_EXPORT NodeAbstractProperty; @@ -88,7 +87,6 @@ public: ModelNode parentModelNode() const; QmlObjectNode parentQmlObjectNode() const; - PropertyMetaInfo metaInfo() const; bool isDefaultProperty() const; VariantProperty toVariantProperty() const; NodeListProperty toNodeListProperty() const; diff --git a/src/plugins/qmldesigner/designercore/include/enumeratormetainfo.h b/src/plugins/qmldesigner/designercore/include/enumeratormetainfo.h deleted file mode 100644 index 5d3ac3f3171..00000000000 --- a/src/plugins/qmldesigner/designercore/include/enumeratormetainfo.h +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#ifndef ENUMERATORMETAINFO_H -#define ENUMERATORMETAINFO_H - -#include "corelib_global.h" - -#include -#include -#include - - -namespace QmlDesigner { - -class MetaInfo; - -namespace Internal { - -class MetaInfoParser; -class MetaInfoPrivate; -class EnumeratorMetaInfoData; - -} - -class CORESHARED_EXPORT EnumeratorMetaInfo -{ - friend class QmlDesigner::MetaInfo; - friend class QmlDesigner::Internal::MetaInfoPrivate; - friend class QmlDesigner::Internal::MetaInfoParser; -public: - EnumeratorMetaInfo(); - ~EnumeratorMetaInfo(); - - EnumeratorMetaInfo(const EnumeratorMetaInfo &other); - EnumeratorMetaInfo& operator=(const EnumeratorMetaInfo &other); - - QString name() const; - QString scope() const; - bool isFlagType() const; - bool isValid() const; - QString scopeAndName(const QString &combiner = QString("::")) const; - QList elementNames() const; - int elementValue(const QString &enumeratorName) const; - QString valueToString(int value) const; - -private: - void setScope(const QString &scope); - void setName(const QString &name); - void setIsFlagType(bool isFlagType); - void setValid(bool valid); - void addElement(const QString &enumeratorName, int enumeratorValue); - -private: - QExplicitlySharedDataPointer m_data; -}; - -} - -#endif // ENUMERATORMETAINFO_H diff --git a/src/plugins/qmldesigner/designercore/include/metainfo.h b/src/plugins/qmldesigner/designercore/include/metainfo.h index 2d4af4dbd0d..1a4e0a5fcc2 100644 --- a/src/plugins/qmldesigner/designercore/include/metainfo.h +++ b/src/plugins/qmldesigner/designercore/include/metainfo.h @@ -38,10 +38,7 @@ #include #include -#include "propertymetainfo.h" #include "itemlibraryinfo.h" -#include "enumeratormetainfo.h" - namespace QmlDesigner { @@ -66,7 +63,6 @@ class CORESHARED_EXPORT MetaInfo friend class QmlDesigner::Internal::ModelPrivate; friend class QmlDesigner::Internal::MetaInfoParser; friend class QmlDesigner::Internal::SubComponentManagerPrivate; - friend class QmlDesigner::NodeMetaInfo; friend bool QmlDesigner::operator==(const MetaInfo &, const MetaInfo &); public: @@ -74,17 +70,7 @@ public: ~MetaInfo(); MetaInfo& operator=(const MetaInfo &other); - bool hasNodeMetaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1) const; - NodeMetaInfo nodeMetaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1) const; - - bool hasEnumerator(const QString &enumeratorName) const; - EnumeratorMetaInfo enumerator(const QString &enumeratorName) const; - ItemLibraryInfo *itemLibraryInfo() const; - - QString fromQtTypes(const QString &type) const; - - public: static MetaInfo global(); static void clearGlobal(); @@ -92,12 +78,6 @@ public: static void setPluginPaths(const QStringList &paths); private: - void addNodeInfo(NodeMetaInfo &info); - void removeNodeInfo(NodeMetaInfo &info); - - EnumeratorMetaInfo addEnumerator(const QString &enumeratorScope, const QString &enumeratorName); - EnumeratorMetaInfo addFlag(const QString &enumeratorScope, const QString &enumeratorName); - bool isGlobal() const; private: diff --git a/src/plugins/qmldesigner/designercore/include/model.h b/src/plugins/qmldesigner/designercore/include/model.h index a8523623d9e..04b950624bd 100644 --- a/src/plugins/qmldesigner/designercore/include/model.h +++ b/src/plugins/qmldesigner/designercore/include/model.h @@ -55,9 +55,11 @@ class AbstractView; class WidgetQueryView; class NodeStateChangeSet; class MetaInfo; +class NodeMetaInfo; class ModelState; class NodeAnchors; class AbstractProperty; +class RewriterView; typedef QList > PropertyListType; @@ -88,6 +90,7 @@ public: const MetaInfo metaInfo() const; MetaInfo metaInfo(); + NodeMetaInfo metaInfo(const QString &typeName, int majorVersion = -1, int minorVersion = -1); void setMetaInfo(const MetaInfo &metaInfo); void attachView(AbstractView *view); @@ -100,6 +103,8 @@ public: void addImport(const Import &import); void removeImport(const Import &import); + RewriterView *rewriterView() const; + protected: Model(); diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 774a860630a..7b8f4f615e0 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -45,93 +45,60 @@ QT_END_NAMESPACE namespace QmlDesigner { class MetaInfo; +class Model; class AbstractProperty; namespace Internal { class MetaInfoPrivate; class MetaInfoParser; - class NodeMetaInfoData; class SubComponentManagerPrivate; class ItemLibraryEntryData; + class NodeMetaInfoPrivate; } -class PropertyMetaInfo; - class CORESHARED_EXPORT NodeMetaInfo { - friend class QmlDesigner::MetaInfo; - friend class QmlDesigner::Internal::ItemLibraryEntryData; - friend class QmlDesigner::Internal::MetaInfoPrivate; - friend class QmlDesigner::Internal::MetaInfoParser; - friend class QmlDesigner::Internal::SubComponentManagerPrivate; - friend class QmlDesigner::AbstractProperty; - friend CORESHARED_EXPORT uint qHash(const NodeMetaInfo &nodeMetaInfo); - friend CORESHARED_EXPORT bool operator ==(const NodeMetaInfo &firstNodeInfo, const NodeMetaInfo &secondNodeInfo); - public: + NodeMetaInfo(); + NodeMetaInfo(Model *model, QString type, int maj, int min); + ~NodeMetaInfo(); NodeMetaInfo(const NodeMetaInfo &other); NodeMetaInfo &operator=(const NodeMetaInfo &other); bool isValid() const; - MetaInfo metaInfo() const; + bool isComponent() const; + bool hasProperty(const QString &propertyName) const; + QStringList propertyNames() const; + QStringList directPropertyNames() const; + QString defaultPropertyName() const; + bool hasDefaultProperty() const; + QString propertyTypeName(const QString &propertyName) const; + bool propertyIsWritable(const QString &propertyName) const; + bool propertyIsListProperty(const QString &propertyName) const; + bool propertyIsEnumType(const QString &propertyName) const; + QString propertyEnumScope(const QString &propertyName) const; + QStringList propertyKeysForEnum(const QString &propertyName) const; + QVariant propertyCastedValue(const QString &propertyName, const QVariant &value) const; QList superClasses() const; NodeMetaInfo directSuperClass() const; - - QStringList propertyNames() const; - QStringList propertyNamesOnlyContainer() const; - QString propertyType(const QString &propertyName) const; - QVariant nativePropertyValue(const QString &propertyName, const QVariant &value) const; - QString typeName() const; int majorVersion() const; int minorVersion() const; + QString componentSource() const; + QString componentFileName() const; + bool availableInVersion(int majorVersion, int minorVersion) const; - - bool hasDefaultProperty() const; - QString defaultProperty() const; - - bool hasProperty(const QString &propertyName) const; - bool isContainer() const; - bool isComponent() const; bool isSubclassOf(const QString& type, int majorVersion, int minorVersio) const; - QString componentString() const; - QIcon icon() const; - private: - NodeMetaInfo(); - NodeMetaInfo(const MetaInfo &metaInfo); - - void setInvalid(); - void setType(const QString &typeName, int majorVersion, int minorVersion); - void addProperty(const PropertyMetaInfo &property); - void setIsContainer(bool isContainer); - void setIcon(const QIcon &icon); - void setQmlFile(const QString &filePath); - void setDefaultProperty(const QString &defaultProperty); - void setSuperClass(const QString &typeName, int majorVersion = -1, int minorVersion = -1); - - bool hasLocalProperty(const QString &propertyName, bool resolveDotSyntax = true) const; - QHash dotProperties() const; - QHash properties(bool resolveDotSyntax = true) const; - PropertyMetaInfo property(const QString &propertyName, bool resolveDotSyntax = true) const; - - -private: - QExplicitlySharedDataPointer m_data; + QSharedPointer m_privateData; }; -CORESHARED_EXPORT uint qHash(const NodeMetaInfo &nodeMetaInfo); -CORESHARED_EXPORT bool operator ==(const NodeMetaInfo &firstNodeInfo, - const NodeMetaInfo &secondNodeInfo); - -//QDataStream& operator<<(QDataStream& stream, const NodeMetaInfo& nodeMetaInfo); -//QDataStream& operator>>(QDataStream& stream, NodeMetaInfo& nodeMetaInfo); -} +} //QmlDesigner #endif // NODEMETAINFO_H diff --git a/src/plugins/qmldesigner/designercore/include/propertycontainer.h b/src/plugins/qmldesigner/designercore/include/propertycontainer.h index a1d8e509dd5..7bc90551c7b 100644 --- a/src/plugins/qmldesigner/designercore/include/propertycontainer.h +++ b/src/plugins/qmldesigner/designercore/include/propertycontainer.h @@ -37,8 +37,6 @@ #include #include -#include - namespace QmlDesigner { class PropertyContainer; diff --git a/src/plugins/qmldesigner/designercore/include/propertymetainfo.h b/src/plugins/qmldesigner/designercore/include/propertymetainfo.h deleted file mode 100644 index b59b120b5c7..00000000000 --- a/src/plugins/qmldesigner/designercore/include/propertymetainfo.h +++ /dev/null @@ -1,123 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#ifndef PROPERTYMETAINFO_H -#define PROPERTYMETAINFO_H - -#include "corelib_global.h" - -#include -#include -#include - -#include - -namespace QmlDesigner { - -class AbstractProperty; -class MetaInfo; -class NodeMetaInfo; - -namespace Internal { - -class MetaInfoPrivate; -class MetaInfoParser; -class PropertyMetaInfoData; -class ObjectNodeInstance; -class SubComponentManagerPrivate; - -} - -class CORESHARED_EXPORT PropertyMetaInfo -{ - friend class QmlDesigner::Internal::MetaInfoPrivate; - friend class QmlDesigner::Internal::MetaInfoParser; - friend class QmlDesigner::Internal::ObjectNodeInstance; - friend class QmlDesigner::Internal::SubComponentManagerPrivate; - friend class QmlDesigner::MetaInfo; - friend class QmlDesigner::AbstractProperty; - friend class QmlDesigner::NodeMetaInfo; -public: - PropertyMetaInfo(); - ~PropertyMetaInfo(); - - PropertyMetaInfo(const PropertyMetaInfo &other); - PropertyMetaInfo& operator=(const PropertyMetaInfo &other); - - bool isValid() const; - - QString name() const; - QString type() const; - - QVariant::Type variantTypeId() const; - - bool isReadable() const; - bool isWriteable() const; - bool isResettable() const; - bool isValueType() const; - bool isListProperty() const; - - bool isEnumType() const; - bool isFlagType() const; - - QVariant defaultValue(const NodeMetaInfo &nodeMetaInfo) const; - bool isVisibleToPropertyEditor() const; - - const EnumeratorMetaInfo enumerator() const; - - QVariant castedValue(const QVariant &variant) const; - -private: - void setName(const QString &name); - void setType(const QString &type); - void setValid(bool isValid); - - void setReadable(bool isReadable); - void setWritable(bool isWritable); - void setResettable(bool isRessetable); - - void setEnumType(bool isEnumType); - void setFlagType(bool isFlagType); - - void setDefaultValue(const NodeMetaInfo &nodeMetaInfo, const QVariant &value); - void setIsVisibleToPropertyEditor(bool isVisible); - - void setEnumerator(const EnumeratorMetaInfo &info); - - bool hasDotSubProperties() const; - - -private: - QExplicitlySharedDataPointer m_data; -}; - -} - - -#endif // PROPERTYMETAINFO_H diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 0665fd9ce4d..6def1990c61 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -63,7 +63,6 @@ class ModelNodePositionStorage; } //Internal - class CORESHARED_EXPORT RewriterView : public AbstractView { Q_OBJECT diff --git a/src/plugins/qmldesigner/designercore/instances/dummynodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/dummynodeinstance.cpp index 9cfd2efb013..5423b63364b 100644 --- a/src/plugins/qmldesigner/designercore/instances/dummynodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/dummynodeinstance.cpp @@ -32,7 +32,6 @@ #include #include -#include namespace QmlDesigner { namespace Internal { diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index b6648f7bb9d..1c43b54b839 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -42,7 +42,6 @@ #include #include -#include #include #include @@ -698,7 +697,7 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis { QVector containerList; foreach(const NodeInstance &instance, instanceList) { - InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(), instance.modelNode().metaInfo().componentString()); + InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(), instance.modelNode().metaInfo().componentFileName()); containerList.append(container); } diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp index 0d7c6d09369..312c023e58a 100644 --- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp @@ -40,7 +40,6 @@ #include #include #include -#include #include #include diff --git a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp index 61474fdf891..b1667dedd62 100644 --- a/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp +++ b/src/plugins/qmldesigner/designercore/instances/qmlgraphicsitemnodeinstance.cpp @@ -30,7 +30,6 @@ #include "qmlgraphicsitemnodeinstance.h" #include -#include #include "bindingproperty.h" #include "variantproperty.h" diff --git a/src/plugins/qmldesigner/designercore/metainfo/enumeratormetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/enumeratormetainfo.cpp deleted file mode 100644 index 3288f2e2816..00000000000 --- a/src/plugins/qmldesigner/designercore/metainfo/enumeratormetainfo.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#include "enumeratormetainfo.h" - -#include -#include -#include -#include - -namespace QmlDesigner { - -namespace Internal { - -class EnumeratorMetaInfoData : public QSharedData -{ -public: - QString name; - QString scope; - bool isFlagType; - bool isValid; - QMap elements; -}; - -} - -/*! -\class QmlDesigner::EnumeratorMetaInfo -\ingroup CoreModel -\brief The EnumeratorMetaInfo class provides meta information about an enumerator type. - -TODO - -\see QmlDesigner::MetaInfo, QmlDesigner::NodeMetaInfo, QmlDesigner::PropertyMetaInfo -*/ - -EnumeratorMetaInfo::EnumeratorMetaInfo() - : m_data(new Internal::EnumeratorMetaInfoData) -{ - m_data->isFlagType = false; - m_data->isValid = false; -} - -EnumeratorMetaInfo::~EnumeratorMetaInfo() -{} - -EnumeratorMetaInfo::EnumeratorMetaInfo(const EnumeratorMetaInfo &other) - : m_data(other.m_data) -{ -} - -EnumeratorMetaInfo& EnumeratorMetaInfo::operator=(const EnumeratorMetaInfo &other) -{ - if (this !=&other) - m_data = other.m_data; - - return *this; -} - -QString EnumeratorMetaInfo::name() const -{ - return m_data->name; -} - -QString EnumeratorMetaInfo::scope() const -{ - return m_data->scope; -} - -bool EnumeratorMetaInfo::isValid() const -{ - return m_data->isValid; -} - -QString EnumeratorMetaInfo::scopeAndName(const QString &combiner) const -{ - return m_data->scope + combiner + m_data->name; -} - -QList EnumeratorMetaInfo::elementNames() const -{ - return m_data->elements.keys(); -} - -int EnumeratorMetaInfo::elementValue(const QString &enumeratorName) const -{ - QString possibleScope = scope(); - if (!possibleScope.isEmpty()) - possibleScope.append("::"); - QString unscoped = enumeratorName; - unscoped.remove(possibleScope); - return m_data->elements.value(unscoped, -1); -} - -QString EnumeratorMetaInfo::valueToString(int value) const -{ - return m_data->elements.key(value); -} - -void EnumeratorMetaInfo::setScope(const QString &scope) -{ - Q_ASSERT(!scope.isEmpty()); - m_data->scope = scope; -} - -void EnumeratorMetaInfo::setName(const QString &name) -{ - Q_ASSERT(!name.isEmpty()); - m_data->name = name; -} - -void EnumeratorMetaInfo::addElement(const QString &enumeratorName, int enumeratorValue) -{ - m_data->elements.insert(enumeratorName, enumeratorValue); -} - -bool EnumeratorMetaInfo::isFlagType() const -{ - return m_data->isFlagType; -} - -void EnumeratorMetaInfo::setIsFlagType(bool isFlagType) -{ - m_data->isFlagType = isFlagType; -} - -void EnumeratorMetaInfo::setValid(bool valid) -{ - m_data->isValid = valid; -} - -} diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp index 0c2a2209c0d..757d3e56594 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp @@ -33,7 +33,6 @@ #include "modelnode.h" #include "invalidmodelnodeexception.h" #include "invalidargumentexception.h" -#include "propertymetainfo.h" #include "metainfoparser.h" #include "iwidgetplugin.h" @@ -43,11 +42,6 @@ #include #include #include -#include -#include - -#include -#include enum { debug = false @@ -68,22 +62,9 @@ public: void clear(); void initialize(); - void loadPlugins(QDeclarativeEngine *engine); - void parseQmlTypes(); - void parseNonQmlTypes(); - void parseValueTypes(); - void parseNonQmlClassRecursively(const QMetaObject *qMetaObject); - void parseProperties(NodeMetaInfo &nodeMetaInfo, const QMetaObject *qMetaObject) const; - void parseClassInfo(NodeMetaInfo &nodeMetaInfo, const QMetaObject *qMetaObject) const; - - QList qmlTypes(); - void typeInfo(const QMetaObject *qMetaObject, QString *typeName, int *majorVersion = 0, int *minorVersion = 0) const; void parseXmlFiles(); - QMultiHash m_nodeMetaInfoHash; - QHash m_enumeratorMetaInfoHash; - QHash m_QtTypesToQmlTypes; QScopedPointer m_itemLibraryInfo; MetaInfo *m_q; @@ -101,49 +82,16 @@ MetaInfoPrivate::MetaInfoPrivate(MetaInfo *q) : void MetaInfoPrivate::clear() { - m_nodeMetaInfoHash.clear(); - m_enumeratorMetaInfoHash.clear(); m_itemLibraryInfo->clearEntries(); m_isInitialized = false; } void MetaInfoPrivate::initialize() { - // make sure QmlGraphicsItemsModule gets initialized, that is - // QmlGraphicsItemsModule::defineModule called - QDeclarativeEngine engine; - Q_UNUSED(engine); - - loadPlugins(&engine); - parseQmlTypes(); - parseNonQmlTypes(); - parseValueTypes(); parseXmlFiles(); - m_isInitialized = true; } -void MetaInfoPrivate::loadPlugins(QDeclarativeEngine *engine) -{ - // hack to load plugins - QDeclarativeComponent pluginComponent(engine, 0); - - QStringList pluginList; - pluginList += "import Qt 4.7"; - pluginList += "import QtWebKit 1.0"; - - // load maybe useful plugins - pluginList += "import Qt.labs.folderlistmodel 1.0"; - pluginList += "import Qt.labs.gestures 1.0"; - pluginList += "import Qt.labs.particles 1.0"; - pluginList += "import Qt.labs.components 1.0"; - - QString componentString = QString("%1\n Item {}\n").arg(pluginList.join("\n")); - - - pluginComponent.setData(componentString.toLatin1(), QUrl()); -} - QString static inline stripPrefix(const QString &typeName) { QStringList list = typeName.split('/'); @@ -152,131 +100,6 @@ QString static inline stripPrefix(const QString &typeName) return typeName; } -void MetaInfoPrivate::parseProperties(NodeMetaInfo &nodeMetaInfo, const QMetaObject *qMetaObject) const -{ - Q_ASSERT_X(qMetaObject, Q_FUNC_INFO, "invalid QMetaObject"); - Q_ASSERT_X(nodeMetaInfo.isValid(), Q_FUNC_INFO, "invalid NodeMetaInfo"); - - for (int i = qMetaObject->propertyOffset(); i < qMetaObject->propertyCount(); ++i) { - QMetaProperty qProperty = qMetaObject->property(i); - - PropertyMetaInfo propertyInfo; - - propertyInfo.setName(QLatin1String(qProperty.name())); - - QString typeName(qProperty.typeName()); - QString noStar = typeName; - bool star = false; - while (noStar.contains('*')) {//strip star - noStar.chop(1); - star = true; - } - if (m_QtTypesToQmlTypes.contains(noStar)) { - typeName = star ? m_QtTypesToQmlTypes.value(noStar) + '*' : m_QtTypesToQmlTypes.value(noStar); - //### versions - } - propertyInfo.setType(typeName); - propertyInfo.setValid(true); - propertyInfo.setReadable(qProperty.isReadable()); - propertyInfo.setWritable(qProperty.isWritable()); - propertyInfo.setResettable(qProperty.isResettable()); - propertyInfo.setEnumType(qProperty.isEnumType()); - propertyInfo.setFlagType(qProperty.isFlagType()); - - if (propertyInfo.isEnumType()) { - QMetaEnum qEnumerator = qProperty.enumerator(); - EnumeratorMetaInfo enumerator = m_q->addEnumerator(qEnumerator.scope(), qEnumerator.name()); - - enumerator.setValid(qEnumerator.isValid()); - enumerator.setIsFlagType(qEnumerator.isFlag()); - QString scope = qEnumerator.scope(); - if (m_QtTypesToQmlTypes.contains(scope)) - scope = stripPrefix(m_QtTypesToQmlTypes.value(scope)); - - enumerator.setScope(scope); - enumerator.setName(qEnumerator.name()); - for (int i = 0 ;i < qEnumerator.keyCount(); i++) - { - enumerator.addElement(qEnumerator.valueToKey(i), i); - } - - propertyInfo.setEnumerator(enumerator); - - } - - nodeMetaInfo.addProperty(propertyInfo); - } -} - -void MetaInfoPrivate::parseClassInfo(NodeMetaInfo &nodeMetaInfo, const QMetaObject *qMetaObject) const -{ - Q_ASSERT_X(qMetaObject, Q_FUNC_INFO, "invalid QMetaObject"); - Q_ASSERT_X(nodeMetaInfo.isValid(), Q_FUNC_INFO, "invalid NodeMetaInfo"); - for (int index = qMetaObject->classInfoCount() - 1 ; index >= 0 ; --index) { - QMetaClassInfo classInfo = qMetaObject->classInfo(index); - if (QLatin1String(classInfo.name()) == QLatin1String("DefaultProperty")) { - nodeMetaInfo.setDefaultProperty(classInfo.value()); - return; - } - } -} - -void MetaInfoPrivate::parseNonQmlClassRecursively(const QMetaObject *qMetaObject) -{ - Q_ASSERT_X(qMetaObject, Q_FUNC_INFO, "invalid QMetaObject"); - - QString typeName; - int majorVersion = -1; - int minorVersion = -1; - typeInfo(qMetaObject, &typeName, &majorVersion, &minorVersion); - - if (typeName.isEmpty()) { - qWarning() << "Meta type system: Registered class has no name."; - return; - } - - NodeMetaInfo existingInfo = m_q->nodeMetaInfo(typeName, majorVersion, minorVersion); - if (existingInfo.isValid() - && existingInfo.majorVersion() == majorVersion - && existingInfo.minorVersion() == minorVersion) { - return; - } - - NodeMetaInfo nodeMetaInfo(*m_q); - nodeMetaInfo.setType(typeName, majorVersion, minorVersion); - parseProperties(nodeMetaInfo, qMetaObject); - parseClassInfo(nodeMetaInfo, qMetaObject); - - QString superTypeName; - int superTypeMajorVersion = -1; - int superTypeMinorVersion = -1; - - if (qMetaObject->superClass()) { - typeInfo(qMetaObject->superClass(), &superTypeName, &superTypeMajorVersion, &superTypeMinorVersion); - nodeMetaInfo.setSuperClass(superTypeName, superTypeMajorVersion, superTypeMinorVersion); - } - if (debug) - qDebug() << "adding non qml type" << nodeMetaInfo.typeName() << nodeMetaInfo.majorVersion() << nodeMetaInfo.minorVersion() - << ", parent type" << superTypeName << superTypeMajorVersion << superTypeMinorVersion; - - m_q->addNodeInfo(nodeMetaInfo); - - if (const QMetaObject *superClass = qMetaObject->superClass()) - parseNonQmlClassRecursively(superClass); -} - -QList MetaInfoPrivate::qmlTypes() -{ - QList list; - foreach (QDeclarativeType *type, QDeclarativeMetaType::qmlTypes()) { - if (!type->qmlTypeName().startsWith("Bauhaus/") - && !type->qmlTypeName().startsWith("QmlProject/")) - list += type; - } - return list; -} - - static inline bool isDepricatedQtType(const QString &typeName) { if (typeName.length() < 8) @@ -285,158 +108,6 @@ static inline bool isDepricatedQtType(const QString &typeName) return typeName.contains("QtQuick/"); } -void MetaInfoPrivate::typeInfo(const QMetaObject *qMetaObject, QString *typeName, int *majorVersion, int *minorVersion) const -{ - Q_ASSERT(typeName); - - if (!qMetaObject) - return; - - *typeName = qMetaObject->className(); - int majVersion = -1; - int minVersion = -1; - QDeclarativeType *qmlType = QDeclarativeMetaType::qmlType(qMetaObject); - if (qmlType) { - if (!qmlType->qmlTypeName().isEmpty()) { - *typeName = qmlType->qmlTypeName(); - majVersion = qmlType->majorVersion(); - minVersion = qmlType->minorVersion(); - } - if (isDepricatedQtType(qmlType->qmlTypeName())) { //### todo there has to be an alternative - QString properTypeName = qmlType->qmlTypeName(); - properTypeName.replace("QtQuick/", "Qt/"); - *typeName = properTypeName; - majVersion = 1; - minVersion = 0; - } - } - if (majorVersion) - *majorVersion = majVersion; - if (minorVersion) - *minorVersion = minVersion; -} - -void MetaInfoPrivate::parseValueTypes() -{ - QStringList valueTypes; - //there is no global list of all supported value types - valueTypes << "QFont" - << "QPoint" - << "QPointF" - << "QRect" - << "QRectF" - << "QSize" - << "QSizeF" - << "QVector3D" - << "QEasingCurve"; - - foreach (const QString &type, valueTypes) { - NodeMetaInfo nodeMetaInfo(*m_q); - nodeMetaInfo.setType(type, -1, -1); - foreach (const QString &propertyName, VariantParser::create(type).properties()) { - PropertyMetaInfo propertyInfo; - propertyInfo.setName(propertyName); - propertyInfo.setType("real"); - if (type == ("QFont")) { - if (propertyName == "bold") - propertyInfo.setType("bool"); - else if (propertyName == "italic") - propertyInfo.setType("bool"); - else if (propertyName == "underline") - propertyInfo.setType("bool"); - else if (propertyName == "strikeout") - propertyInfo.setType("bool"); - else if (propertyName == "family") - propertyInfo.setType("string"); - else if (propertyName == "pixelSize") - propertyInfo.setType("int"); - } else if (type == ("QPoint")) { - propertyInfo.setType("int"); - } else if (type == ("QSize")) { - propertyInfo.setType("int"); - } else if (type == ("QRect")) { - propertyInfo.setType("int"); - } else if (type == ("QEasingCurve")) { - if (propertyName == "type") { - propertyInfo.setEnumType("true"); - propertyInfo.setType("QEasingCurve::Type"); - propertyInfo.setEnumerator(m_q->enumerator("QEasingCurve::Type")); - } - } - propertyInfo.setValid(true); - propertyInfo.setReadable(true); - propertyInfo.setWritable(true); - nodeMetaInfo.addProperty(propertyInfo); - } - if (debug) - qDebug() << "adding value type" << nodeMetaInfo.typeName(); - m_q->addNodeInfo(nodeMetaInfo); - } -} - -void MetaInfoPrivate::parseQmlTypes() -{ - foreach (QDeclarativeType *qmlType, qmlTypes()) { - const QString qtTypeName(qmlType->typeName()); - const QString qmlTypeName(qmlType->qmlTypeName()); - - if (!isDepricatedQtType(qmlType->qmlTypeName())) - m_QtTypesToQmlTypes.insert(qtTypeName, qmlTypeName); - } - foreach (QDeclarativeType *qmlType, qmlTypes()) { - const QMetaObject *qMetaObject = qmlType->metaObject(); - - // parseQmlTypes is called iteratively e.g. when plugins are loaded - if (m_q->hasNodeMetaInfo(qmlType->qmlTypeName(), qmlType->majorVersion(), qmlType->minorVersion())) - continue; - - // we ignore the deprecated Qt/ namespace - if (isDepricatedQtType(qmlType->qmlTypeName())) - continue; - - NodeMetaInfo nodeMetaInfo(*m_q); - nodeMetaInfo.setType(qmlType->qmlTypeName(), qmlType->majorVersion(), qmlType->minorVersion()); - - parseProperties(nodeMetaInfo, qMetaObject); - if (qmlType->baseMetaObject() != qMetaObject) { - // type is declared with Q_DECLARE_EXTENDED_TYPE - parseProperties(nodeMetaInfo, qmlType->baseMetaObject()); - } - - parseClassInfo(nodeMetaInfo, qMetaObject); - - QString superTypeName; - int superTypeMajorVersion = -1; - int superTypeMinorVersion = -1; - if (const QMetaObject *superClassObject = qmlType->baseMetaObject()->superClass()) - typeInfo(superClassObject, &superTypeName, &superTypeMajorVersion, &superTypeMinorVersion); - - if (!superTypeName.isEmpty()) - nodeMetaInfo.setSuperClass(superTypeName, superTypeMajorVersion, superTypeMinorVersion); - - if (debug) { - qDebug() << "adding qml type" << nodeMetaInfo.typeName() << nodeMetaInfo.majorVersion() << nodeMetaInfo.minorVersion() - << ", super class" << superTypeName << superTypeMajorVersion << superTypeMinorVersion; - } - - m_q->addNodeInfo(nodeMetaInfo); - } -} - -void MetaInfoPrivate::parseNonQmlTypes() -{ - foreach (QDeclarativeType *qmlType, qmlTypes()) { - if (qmlType->qmlTypeName().startsWith("Bauhaus/") - || qmlType->qmlTypeName().startsWith("QmlProject/")) - continue; - if (qmlType->metaObject()->superClass()) - parseNonQmlClassRecursively(qmlType->metaObject()->superClass()); - } - - parseNonQmlClassRecursively(&QDeclarativeAnchors::staticMetaObject); -} - - void MetaInfoPrivate::parseXmlFiles() { Internal::WidgetPluginManager pluginManager; @@ -444,7 +115,6 @@ void MetaInfoPrivate::parseXmlFiles() pluginManager.addPath(pluginDir); QList widgetPluginList = pluginManager.instances(); foreach (IWidgetPlugin *plugin, widgetPluginList) { - parseQmlTypes(); Internal::MetaInfoParser parser(*m_q); parser.parseFile(plugin->metaInfo()); } @@ -462,18 +132,6 @@ QStringList MetaInfo::s_pluginDirs; \class QmlDesigner::MetaInfo \ingroup CoreModel \brief The MetaInfo class provides meta information about qml types and properties. - -The MetaInfo, NodeMetaInfo, PropertyMetaInfo and EnumeratorMetaInfo -classes provide information about the (static and dynamic) qml types available in -a specific model. Just like their Model, ModelNode and AbstractProperty counterparts, -objects of these classes are handles - that means, they are implicitly shared, and -should be created on the stack. - -The MetaInfo object should always be accessed via the model (see Model::metaInfo()). -Otherwise types specific to a model (like sub components) might -be missed. - -\see Model::metaInfo(), QmlDesigner::NodeMetaInfo, QmlDesigner::PropertyMetaInfo, QmlDesigner::EnumeratorMetaInfo */ /*! @@ -510,75 +168,6 @@ MetaInfo& MetaInfo::operator=(const MetaInfo &other) return *this; } -/*! - \brief Returns whether a type with the given name is registered in the meta system. - */ -bool MetaInfo::hasNodeMetaInfo(const QString &typeName, int majorVersion, int minorVersion) const -{ - foreach (const NodeMetaInfo &info, m_p->m_nodeMetaInfoHash.values(typeName)) { - if (info.availableInVersion(majorVersion, minorVersion)) { { - return true; - } - } - } - if (!isGlobal()) - return global().hasNodeMetaInfo(typeName); - - return false; -} - -/*! - \brief Returns meta information for a qml type. An invalid NodeMetaInfo object if the type is unknown. - */ -NodeMetaInfo MetaInfo::nodeMetaInfo(const QString &typeName, int majorVersion, int minorVersion) const -{ - NodeMetaInfo returnInfo; - foreach (const NodeMetaInfo &info, m_p->m_nodeMetaInfoHash.values(typeName)) { - if (info.availableInVersion(majorVersion, minorVersion)) { - if (!returnInfo.isValid() - || returnInfo.majorVersion() < info.majorVersion() - || (returnInfo.majorVersion() == info.minorVersion() - && returnInfo.minorVersion() < info.minorVersion())) - returnInfo = info; - } - } - if (!returnInfo.isValid() - && !isGlobal()) - return global().nodeMetaInfo(typeName); - - return returnInfo; -} - -QString MetaInfo::fromQtTypes(const QString &type) const -{ - if (m_p->m_QtTypesToQmlTypes.contains(type)) - return m_p->m_QtTypesToQmlTypes.value(type); - if (!isGlobal()) - return global().fromQtTypes(type); - return type; -} - -/*! - \brief Returns whether an enumerator is registered in the meta type system. - */ -bool MetaInfo::hasEnumerator(const QString &enumeratorName) const -{ - return m_p->m_enumeratorMetaInfoHash.contains(enumeratorName) - || (!isGlobal() ? global().hasEnumerator(enumeratorName) : false); -} - -/*! - \brief Returns meta information about an enumerator. An invalid EnumeratorMetaInfo object if the enumerator is not known. - */ -EnumeratorMetaInfo MetaInfo::enumerator(const QString &enumeratorName) const -{ - if (m_p->m_enumeratorMetaInfoHash.contains(enumeratorName)) - return m_p->m_enumeratorMetaInfoHash.value(enumeratorName); - if (!isGlobal()) - return global().enumerator(enumeratorName); - return EnumeratorMetaInfo(); -} - ItemLibraryInfo *MetaInfo::itemLibraryInfo() const { return m_p->m_itemLibraryInfo.data(); @@ -617,67 +206,6 @@ void MetaInfo::setPluginPaths(const QStringList &paths) s_pluginDirs = paths; } -void MetaInfo::addNodeInfo(NodeMetaInfo &nodeInfo) -{ - if (nodeInfo.typeName().isEmpty() || nodeInfo.metaInfo() != *this) - throw new InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, QLatin1String("nodeInfo")); - - - m_p->m_nodeMetaInfoHash.insertMulti(nodeInfo.typeName(), nodeInfo); -} - -void MetaInfo::removeNodeInfo(NodeMetaInfo &info) -{ - if (!info.isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return; - } - - if (m_p->m_nodeMetaInfoHash.contains(info.typeName()) - && m_p->m_nodeMetaInfoHash.remove(info.typeName(), info)) { - - foreach (const ItemLibraryEntry &entry, - m_p->m_itemLibraryInfo->entriesForType(info.typeName(), info.majorVersion(), info.minorVersion())) { - m_p->m_itemLibraryInfo->removeEntry(entry.name()); - } - - } else if (!isGlobal()) { - global().removeNodeInfo(info); - } else { - Q_ASSERT_X(0, Q_FUNC_INFO, "Node meta info not in db"); - } - - info.setInvalid(); -} - -EnumeratorMetaInfo MetaInfo::addEnumerator(const QString &enumeratorScope, const QString &enumeratorName) -{ - Q_ASSERT(!enumeratorName.isEmpty()); - - EnumeratorMetaInfo enumeratorMetaInfo; - enumeratorMetaInfo.setName(enumeratorName); - enumeratorMetaInfo.setScope(enumeratorScope); - enumeratorMetaInfo.setIsFlagType(false); - enumeratorMetaInfo.setValid(true); - - m_p->m_enumeratorMetaInfoHash.insert(enumeratorMetaInfo.scopeAndName(), enumeratorMetaInfo); - - return enumeratorMetaInfo; -} - -EnumeratorMetaInfo MetaInfo::addFlag(const QString &enumeratorScope, const QString &enumeratorName) -{ - Q_ASSERT(!enumeratorName.isEmpty()); - - EnumeratorMetaInfo enumeratorMetaInfo; - enumeratorMetaInfo.setName(enumeratorName); - enumeratorMetaInfo.setScope(enumeratorScope); - enumeratorMetaInfo.setIsFlagType(true); - m_p->m_enumeratorMetaInfoHash.insert(enumeratorMetaInfo.scopeAndName(), enumeratorMetaInfo); - - return enumeratorMetaInfo; -} - bool MetaInfo::isGlobal() const { return (this->m_p == s_global.m_p); diff --git a/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp b/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp index 037fbf79400..21985d0a4f2 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/metainfoparser.cpp @@ -30,7 +30,6 @@ #include "metainfoparser.h" #include "metainfo.h" -#include "propertymetainfo.h" #include "model/propertyparser.h" #include #include diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 122c5deace5..313778f4a41 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -33,7 +33,8 @@ #include "invalidargumentexception.h" #include "metainfo.h" -#include "propertymetainfo.h" +#include +#include #include #include @@ -42,49 +43,26 @@ #include #include +#include +#include +#include +#include +#include #include +#include namespace QmlDesigner { namespace Internal { -class NodeMetaInfoData : public QSharedData +struct TypeDescription { -public: - typedef enum { - No = -1, - Unknown = 0, - Yes = 1, - } TristateBoolean; - -public: - NodeMetaInfoData(const MetaInfo &metaInfo) : - metaInfo(metaInfo), - isContainer(false), - isFXItem(Unknown), - icon(), - category("misc") - { } - - MetaInfo metaInfo; - QString typeName; - bool isContainer; - TristateBoolean isFXItem; - QHash propertyMetaInfoHash; - QIcon icon; - QString category; - QString qmlFile; - QString defaultProperty; - - QString superClassType; - int superClassMajorVersion; - int superClassMinorVersion; - - int majorVersion; + QString className; int minorVersion; + int majorVersion; }; -} // namespace Internal +} //Internal /*! \class QmlDesigner::NodeMetaInfo @@ -103,493 +81,875 @@ NodeMetaInfo object will result in an InvalidMetaInfoException being thrown. \see QmlDesigner::MetaInfo, QmlDesigner::PropertyMetaInfo, QmlDesigner::EnumeratorMetaInfo */ -NodeMetaInfo::NodeMetaInfo() - : m_data(0) +namespace Internal { + +using namespace QmlJS; + +typedef QPair PropertyInfo; + +class PropertyMemberProcessor : public Interpreter::MemberProcessor { - // create invalid node +public: + virtual bool processProperty(const QString &name, const Interpreter::Value *value) + { + const Interpreter::ASTPropertyReference *ref = dynamic_cast(value); + if (ref) { + QString type = "unkown"; + if (ref->ast()->memberType) + type = ref->ast()->memberType->asString(); + m_properties.append(qMakePair(name, type)); + } else { + if (const Interpreter::QmlObjectValue * ov = dynamic_cast(value)) { + QString qualifiedTypeName = ov->packageName().isEmpty() ? ov->className() : ov->packageName() + "/" + ov->className(); + m_properties.append(qMakePair(name, qualifiedTypeName)); + } else { + Interpreter::TypeId typeId; + QString typeName = typeId(value); + if (typeName == QLatin1String("number")) { + if (value->asRealValue()) { + typeName = "real"; + } else { + typeName = "int"; + } + } + m_properties.append(qMakePair(name, typeName)); + } + } + return true; + } + + QList properties() const { return m_properties; } + +private: + QList m_properties; +}; + +static inline bool isValueType(const QString &type) +{ + QStringList objectValuesList; + objectValuesList << "QFont" << "QPoint" << "QPointF" << "QSize" << "QSizeF" << "QVector3D" << "QVector2D"; + return objectValuesList.contains(type); } -NodeMetaInfo::NodeMetaInfo(const MetaInfo &metaInfo) - : m_data(new Internal::NodeMetaInfoData(metaInfo)) +const Interpreter::QmlObjectValue *findQmlPrototype(const Interpreter::ObjectValue *ov, LookupContext *context) { + if (!ov) + return 0; + + const Interpreter::QmlObjectValue * qmlValue = dynamic_cast(ov); + if (qmlValue) + return qmlValue; + + return findQmlPrototype(ov->prototype(context->context()), context); +} + +QStringList prototypes(const Interpreter::ObjectValue *ov, LookupContext::Ptr context, bool versions = false) +{ + QStringList list; + if (!ov) + return list; + ov = ov->prototype(context->context()); + while (ov) { + const Interpreter::QmlObjectValue * qmlValue = dynamic_cast(ov); + if (qmlValue) { + if (versions) { + list << qmlValue->packageName() + "/" + qmlValue->className() + + " " + QString::number(qmlValue->version().majorVersion()) + + "." + QString::number(qmlValue->version().minorVersion()); + } else { + list << qmlValue->packageName() + "/" + qmlValue->className(); + } + } else { + if (versions) { + list << ov->className() + " -1.-1"; + } else { + list << ov->className(); + } + } + ov = ov->prototype(context->context()); + } + return list; +} + +QList getObjectTypes(const Interpreter::ObjectValue *ov, LookupContext *context, bool local = false); + +QList getQmlTypes(const Interpreter::QmlObjectValue *ov, LookupContext *context, bool local = false) +{ + QList list; + if (!ov) + return list; + + PropertyMemberProcessor processor; + ov->processMembers(&processor); + + QList newList = processor.properties(); + + foreach (PropertyInfo property, newList) { + QString name = property.first; + if (!ov->isWritable(name) && ov->isPointer(name)) { + //dot property + const Interpreter::QmlObjectValue * qmlValue = dynamic_cast(ov->property(name, context->context())); + if (qmlValue) { + QList dotProperties = getQmlTypes(qmlValue, context); + foreach (const PropertyInfo &propertyInfo, dotProperties) { + QString dotName = propertyInfo.first; + QString type = propertyInfo.second; + dotName = name + '.' + dotName; + list.append(qMakePair(dotName, type)); + } + } + } + if (isValueType(ov->propertyType(name))) { + const Interpreter::ObjectValue *dotObjectValue = dynamic_cast(ov->property(name, context->context())); + if (dotObjectValue) { + QList dotProperties = getObjectTypes(dotObjectValue, context); + foreach (const PropertyInfo &propertyInfo, dotProperties) { + QString dotName = propertyInfo.first; + QString type = propertyInfo.second; + dotName = name + '.' + dotName; + list.append(qMakePair(dotName, type)); + } + } + } + QString type = property.second; + if (!ov->isPointer(name) && !ov->isListProperty(name)) + type = ov->propertyType(name); + list.append(qMakePair(name, type)); + } + + if (!local) { + const Interpreter::ObjectValue* prototype = ov->prototype(context->context()); + + const Interpreter::QmlObjectValue * qmlObjectValue = dynamic_cast(prototype); + + if (qmlObjectValue) { + list << getQmlTypes(qmlObjectValue, context); + } else { + list << getObjectTypes(prototype, context); + } + } + + return list; +} + +QList getTypes(const Interpreter::ObjectValue *ov, LookupContext *context, bool local = false) +{ + QList list; + + const Interpreter::QmlObjectValue * qmlObjectValue = dynamic_cast(ov); + + if (qmlObjectValue) { + list << getQmlTypes(qmlObjectValue, context, local); + } else { + list << getObjectTypes(ov, context, local); + } + + return list; +} + +QList getObjectTypes(const Interpreter::ObjectValue *ov, LookupContext *context, bool local) +{ + QList list; + if (!ov) + return list; + PropertyMemberProcessor processor; + ov->processMembers(&processor); + + list << processor.properties(); + + if (!local) { + const Interpreter::ObjectValue* prototype = ov->prototype(context->context()); + + const Interpreter::QmlObjectValue * qmlObjectValue = dynamic_cast(prototype); + + if (qmlObjectValue) { + list << getQmlTypes(qmlObjectValue, context); + } else { + list << getObjectTypes(prototype, context); + } + } + + return list; +} + +class NodeMetaInfoPrivate +{ +public: + typedef QSharedPointer Pointer; + NodeMetaInfoPrivate(); + ~NodeMetaInfoPrivate() {} + + bool isValid() const; + + bool isComponent() const + { + return m_isComponent; + } + + QStringList properties() const + { + return m_properties; + } + + QStringList localProperties() const + { + return m_localProperties; + } + + QString defaultPropertyName() const + { + return m_defaultPropertyName; + } + + QString propertyType(const QString &propertyName) const; + + QList prototypes() const; + + bool isPropertyWritable(const QString &propertyName) const; + bool isPropertyPointer(const QString &propertyName) const; + bool isPropertyList(const QString &propertyName) const; + bool isPropertyEnum(const QString &propertyName) const; + QString propertyEnumScope(const QString &propertyName) const; + QStringList keysForEnum(const QString &enumName) const; + bool cleverCheckType(const QString &otherType) const; + QVariant::Type variantTypeId(const QString &properyName) const; + + int majorVersion() const + { return m_majorVersion; } + + int minorVersion() const + { return m_minorVersion; } + + QString qualfiedTypeName() const + { return m_qualfiedTypeName; } + + Model *model() const + { return m_model; } + + QString packageName() const; + + QString componentSource() const; + QString componentFileName() const; + + static Pointer create(Model *model, QString type, int maj = -1, int min = -1); + +private: + NodeMetaInfoPrivate(Model *model, QString type, int maj = -1, int min = -1); + + const QmlJS::Interpreter::QmlObjectValue *getQmlObjectValue() const; + const QmlJS::Interpreter::ObjectValue *getObjectValue() const; + void setupPropertyInfo(QList propertyInfos); + void setupLocalPropertyInfo(QList propertyInfos); + QString lookupName() const; + QStringList lookupNameComponent() const; + const QmlJS::Interpreter::QmlObjectValue *getNearestQmlObjectValue() const; + + QString m_qualfiedTypeName; + int m_majorVersion; + int m_minorVersion; + bool m_isValid; + bool m_isComponent; + QStringList m_properties; + QStringList m_propertyTypes; + QStringList m_localProperties; + QString m_defaultPropertyName; + + //storing the pointer would not be save + QmlJS::LookupContext *lookupContext() const; + QmlJS::Document *document() const; + + QPointer m_model; + static QList m_nodeMetaInfoCache; +}; + +QList NodeMetaInfoPrivate::m_nodeMetaInfoCache; + +NodeMetaInfoPrivate::Pointer NodeMetaInfoPrivate::create(Model *model, QString type, int maj, int min) +{ + if (!m_nodeMetaInfoCache.isEmpty()) { + if (m_nodeMetaInfoCache.first()->model() != model) { + m_nodeMetaInfoCache.clear(); + } else { + foreach (const Pointer &info, m_nodeMetaInfoCache) + if (info->m_qualfiedTypeName == type && info->m_majorVersion == maj && info->m_minorVersion == min) + return info; + } + } + Pointer newData(new NodeMetaInfoPrivate(model, type, maj, min)); + if (newData->isValid()) + m_nodeMetaInfoCache.append(newData); + return newData; +} + +NodeMetaInfoPrivate::NodeMetaInfoPrivate() : m_isValid(false) +{ + +} + +NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, QString type, int maj, int min) : m_model(model), + m_qualfiedTypeName(type), m_majorVersion(maj), + m_minorVersion(min), m_isValid(true), m_isComponent(false) +{ + if (!lookupContext()) { + m_isValid = false; + return; + } + + if (const Interpreter::QmlObjectValue *objectValue = getQmlObjectValue()) { + setupPropertyInfo(getTypes(objectValue, lookupContext())); + setupLocalPropertyInfo(getTypes(objectValue, lookupContext(), true)); + m_defaultPropertyName = objectValue->defaultPropertyName(); + return; + } + m_qualfiedTypeName = m_qualfiedTypeName.split('/').last(); + if (const Interpreter::ObjectValue *objectValue = getObjectValue()) { + if (const Interpreter::QmlObjectValue *qmlValue = dynamic_cast(objectValue)) { + m_majorVersion = qmlValue->version().majorVersion(); + m_minorVersion = qmlValue->version().minorVersion(); + m_qualfiedTypeName = qmlValue->packageName() + '/' + qmlValue->className(); + } else { + m_isComponent = true; + } + setupPropertyInfo(getTypes(objectValue, lookupContext())); + setupLocalPropertyInfo(getTypes(objectValue, lookupContext(), true)); + m_defaultPropertyName = lookupContext()->context()->defaultPropertyName(objectValue); + return; + } + m_isValid = false; +} + +const QmlJS::Interpreter::QmlObjectValue *NodeMetaInfoPrivate::getQmlObjectValue() const +{ + return lookupContext()->engine()->cppQmlTypes().types().value(lookupName()); +} + +const QmlJS::Interpreter::ObjectValue *NodeMetaInfoPrivate::getObjectValue() const +{ + return lookupContext()->context()->lookupType(document(), lookupNameComponent()); +} + +QmlJS::LookupContext *NodeMetaInfoPrivate::lookupContext() const +{ + if (m_model && m_model->rewriterView()) { + return m_model->rewriterView()->lookupContext(); + } + return 0; +} + +QmlJS::Document *NodeMetaInfoPrivate::document() const +{ + if (m_model && m_model->rewriterView()) { + return m_model->rewriterView()->document(); + } + return 0; +} + +void NodeMetaInfoPrivate::setupLocalPropertyInfo(QList localPropertyInfos) +{ + foreach (const PropertyInfo &propertyInfo, localPropertyInfos) { + m_localProperties.append(propertyInfo.first); + } +} + +void NodeMetaInfoPrivate::setupPropertyInfo(QList propertyInfos) +{ + foreach (const PropertyInfo &propertyInfo, propertyInfos) { + m_properties.append(propertyInfo.first); + m_propertyTypes.append(propertyInfo.second); + } +} + +bool NodeMetaInfoPrivate::isPropertyWritable(const QString &propertyName) const +{ + if (!isValid()) + return false; + + if (propertyName.contains('.')) { + const QString objectName = propertyName.split(".").first(); + const QString rawPropertyName = propertyName.split(".").last(); + const QString objectType = propertyType(objectName); + + if (isValueType(objectType)) { + return true; + } + + QSharedPointer objectInfo(create(m_model, objectType)); + if (objectInfo->isValid()) + return objectInfo->isPropertyWritable(rawPropertyName); + else + return true; + } + + const QmlJS::Interpreter::QmlObjectValue *qmlObjectValue = getNearestQmlObjectValue(); + if (qmlObjectValue->hasProperty(propertyName)) + return qmlObjectValue->isWritable(propertyName); + else + return true; //all properties of components are writable +} + + +bool NodeMetaInfoPrivate::isPropertyList(const QString &propertyName) const +{ + if (!isValid()) + return false; + + if (propertyName.contains('.')) { + const QString objectName = propertyName.split(".").first(); + const QString rawPropertyName = propertyName.split(".").last(); + const QString objectType = propertyType(objectName); + + if (isValueType(objectType)) { + return false; + } + + QSharedPointer objectInfo(create(m_model, objectType)); + if (objectInfo->isValid()) + return objectInfo->isPropertyList(rawPropertyName); + else + return true; + } + + return getNearestQmlObjectValue()->isListProperty(propertyName); +} + +bool NodeMetaInfoPrivate::isPropertyPointer(const QString &propertyName) const +{ + if (!isValid()) + return false; + + if (propertyName.contains('.')) { + const QString objectName = propertyName.split(".").first(); + const QString rawPropertyName = propertyName.split(".").last(); + const QString objectType = propertyType(objectName); + + if (isValueType(objectType)) { + return false; + } + + QSharedPointer objectInfo(create(m_model, objectType)); + if (objectInfo->isValid()) + return objectInfo->isPropertyPointer(rawPropertyName); + else + return true; + } + + return getNearestQmlObjectValue()->isPointer(propertyName); +} + +bool NodeMetaInfoPrivate::isPropertyEnum(const QString &propertyName) const +{ + if (!isValid()) + return false; + + if (propertyName.contains('.')) { + const QString objectName = propertyName.split(".").first(); + const QString rawPropertyName = propertyName.split(".").last(); + const QString objectType = propertyType(objectName); + + if (isValueType(objectType)) { + return false; + } + + QSharedPointer objectInfo(create(m_model, objectType)); + if (objectInfo->isValid()) + return objectInfo->isPropertyEnum(rawPropertyName); + else + return true; + } + + QList objects; + objects = Interpreter::PrototypeIterator(getNearestQmlObjectValue(), lookupContext()->context()).all(); + + //We have to run the prototype chain + foreach (const Interpreter::ObjectValue *ov, objects) { + if (const Interpreter::QmlObjectValue * qmlValue = dynamic_cast(ov)) { + if (qmlValue->isEnum(propertyType(propertyName))) + return true; + } + } + + return false; +} + +QString NodeMetaInfoPrivate::propertyEnumScope(const QString &propertyName) const +{ + if (!isValid()) + return QString(); + + if (propertyName.contains('.')) { + const QString objectName = propertyName.split(".").first(); + const QString rawPropertyName = propertyName.split(".").last(); + const QString objectType = propertyType(objectName); + + if (isValueType(objectType)) { + return QString(); + } + + QSharedPointer objectInfo(create(m_model, objectType)); + if (objectInfo->isValid()) + return objectInfo->propertyEnumScope(rawPropertyName); + else + return QString(); + } + + QList objects; + objects = Interpreter::PrototypeIterator(getNearestQmlObjectValue(), lookupContext()->context()).all(); + + //We have to run the prototype chain + foreach (const Interpreter::ObjectValue *ov, objects) { + if (const Interpreter::QmlObjectValue * qmlValue = dynamic_cast(ov)) { + if (qmlValue->isEnum(propertyType(propertyName))) + return qmlValue->className(); + } + } + + return QString(); +} + +bool NodeMetaInfoPrivate::cleverCheckType(const QString &otherType) const +{ + if (otherType == qualfiedTypeName()) + return true; + + if (isComponent()) + return false; + QStringList split = otherType.split('/'); + QString package; + QString typeName = otherType; + if (split.count() > 1) { + package = split.first(); + typeName = split.at(1); + } + if (packageName() == package) + return QString(package + "/" + typeName) == qualfiedTypeName(); + + const QString convertedName = getQmlObjectValue()->nameInPackage(package); + return QString(package + "/" + typeName) == QString(package + "/" + convertedName); +} + +QVariant::Type NodeMetaInfoPrivate::variantTypeId(const QString &properyName) const +{ + QString typeName = propertyType(properyName); + if (typeName == "string") + return QVariant::String; + + if (typeName == "color") + return QVariant::Color; + + if (typeName == "int") + return QVariant::Int; + + if (typeName == "url") + return QVariant::Url; + + if (typeName == "real") + return QVariant::Double; + + if (typeName == "bool") + return QVariant::Bool; + + if (typeName == "boolean") + return QVariant::Bool; + + if (typeName == "date") + return QVariant::Date; + + if (typeName == "alias") + return QVariant::UserType; + + if (typeName == "var") + return QVariant::UserType; + + return QVariant::nameToType(typeName.toLatin1().data()); +} + + +QStringList NodeMetaInfoPrivate::keysForEnum(const QString &enumName) const +{ + if (!isValid()) + return QStringList(); + + return getNearestQmlObjectValue()->keysForEnum(enumName); +} + +QString NodeMetaInfoPrivate::packageName() const +{ + if (!isComponent()) + return getQmlObjectValue()->packageName(); + return QString(); +} + +QString NodeMetaInfoPrivate::componentSource() const +{ + if (isComponent()) { + const Interpreter::ASTObjectValue * astObjectValue = dynamic_cast(getObjectValue()); + if (astObjectValue) + return astObjectValue->document()->source().mid(astObjectValue->typeName()->identifierToken.begin(), + astObjectValue->initializer()->rbraceToken.end()); + } + return QString(); +} + +QString NodeMetaInfoPrivate::componentFileName() const +{ + if (isComponent()) { + const Interpreter::ASTObjectValue * astObjectValue = dynamic_cast(getObjectValue()); + if (astObjectValue) { + QString fileName; + int line; + int column; + if (astObjectValue->getSourceLocation(&fileName, &line, &column)) + return fileName; + } + } + return QString(); +} + + +QString NodeMetaInfoPrivate::lookupName() const +{ + QString tempString = m_qualfiedTypeName; + tempString.replace('/', '.'); + if (!tempString.contains('.')) + tempString.prepend('.'); + tempString.append(' '); + + tempString.append(QString::number(m_majorVersion)); + tempString.append('.'); + tempString.append(QString::number(m_minorVersion)); + + return tempString; +} + +QStringList NodeMetaInfoPrivate::lookupNameComponent() const +{ + QString tempString = m_qualfiedTypeName; + tempString.replace('/', '.'); + + return tempString.split("."); +} + +bool NodeMetaInfoPrivate::isValid() const +{ + return m_isValid && lookupContext() && document(); +} + +QString NodeMetaInfoPrivate::propertyType(const QString &propertyName) const +{ + if (!m_properties.contains(propertyName)) + return QString(); + return m_propertyTypes.at(m_properties.indexOf(propertyName)); +} + +QList NodeMetaInfoPrivate::prototypes() const +{ + QList list; + QList objects; + if (m_isComponent) + objects = Interpreter::PrototypeIterator(getObjectValue(), lookupContext()->context()).all(); + else + objects = Interpreter::PrototypeIterator(getQmlObjectValue(), lookupContext()->context()).all(); + foreach (const Interpreter::ObjectValue *ov, objects) { + TypeDescription description; + description.className = ov->className(); + description.minorVersion = -1; + description.majorVersion = -1; + if (const Interpreter::QmlObjectValue * qmlValue = dynamic_cast(ov)) { + description.minorVersion = qmlValue->version().minorVersion(); + description.majorVersion = qmlValue->version().majorVersion(); + if (!qmlValue->packageName().isEmpty()) + description.className = qmlValue->packageName() + "/" + description.className; + } + list.append(description); + } + return list; +} + +const QmlJS::Interpreter::QmlObjectValue *NodeMetaInfoPrivate::getNearestQmlObjectValue() const +{ + if (m_isComponent) + return findQmlPrototype(getObjectValue(), lookupContext()); + return getQmlObjectValue(); +} + +} //namespace Internal + +NodeMetaInfo::NodeMetaInfo() : m_privateData(new Internal::NodeMetaInfoPrivate()) +{ + +} + +NodeMetaInfo::NodeMetaInfo(Model *model, QString type, int maj, int min) : m_privateData(Internal::NodeMetaInfoPrivate::create(model, type, maj, min)) +{ + } NodeMetaInfo::~NodeMetaInfo() { } -/*! - \brief Creates a copy of the handle. - */ NodeMetaInfo::NodeMetaInfo(const NodeMetaInfo &other) - : m_data(other.m_data) + : m_privateData(other.m_privateData) { } -/*! - \brief Copies the handle. - */ NodeMetaInfo &NodeMetaInfo::operator=(const NodeMetaInfo &other) { if (this != &other) - this->m_data = other.m_data; + this->m_privateData = other.m_privateData; return *this; } -/*! - \brief Returns whether the meta information system knows about this type. - */ bool NodeMetaInfo::isValid() const { - return (m_data.data() != 0); -} - -MetaInfo NodeMetaInfo::metaInfo() const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return MetaInfo(); - } - - return m_data->metaInfo; -} - -/*! - \brief Returns all (direct and indirect) ancestor types. - - \throws InvalidMetaInfoException if the object is not valid - */ -QList NodeMetaInfo::superClasses() const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return QList(); - } - - QList types; - - NodeMetaInfo superType = directSuperClass(); - if (superType.isValid()) { - types += superType; - types += superType.superClasses(); - } - - return types; -} - -/*! - \brief Returns direct ancestor type. An invalid type if there is none. - */ -NodeMetaInfo NodeMetaInfo::directSuperClass() const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return NodeMetaInfo(); - } - - if (!m_data->superClassType.isEmpty()) { - int superClassMajorVersion = m_data->superClassMajorVersion; - int superClassMinorVersion = m_data->superClassMinorVersion; - if (superClassMajorVersion == -1) { - // If we don't know the version of the super type, assume that it's the same like our version. - superClassMajorVersion = majorVersion(); - superClassMinorVersion = minorVersion(); - } - return m_data->metaInfo.nodeMetaInfo(m_data->superClassType, - superClassMajorVersion, superClassMinorVersion); - } - return NodeMetaInfo(); -} - -/*! - \brief Returns meta information for all properties, including properties inherited from base types. - - Returns a Hash with the name of the property as key and property meta information as value. Node - In case there are multiple properties with the same name in the hierarchy the property defined - in the more concrete subclass is chosen. - - \throws InvalidMetaInfoException if the object is not valid - */ -QHash NodeMetaInfo::properties(bool resolveDotSyntax) const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return QHash(); - } - - QHash propertiesInfo; - propertiesInfo = m_data->propertyMetaInfoHash; - - foreach (const NodeMetaInfo &nodeInfo, superClasses()) { - QHash superClassProperties = nodeInfo.properties(); - QHashIterator iter(superClassProperties); - while (iter.hasNext()) { - iter.next(); - if (!propertiesInfo.contains(iter.key())) - propertiesInfo.insert(iter.key(), iter.value()); - } - } - if (resolveDotSyntax) { - QHashIterator iter(dotProperties()); - while (iter.hasNext()) { - iter.next(); - if (!propertiesInfo.contains(iter.key())) - propertiesInfo.insert(iter.key(), iter.value()); - } - } - return propertiesInfo; -} - -/*! - \brief Returns meta information for all dot properties, including properties inherited from base types. - - */ -QHash NodeMetaInfo::dotProperties() const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return QHash(); - } - - QHash propertiesInfo; - - foreach (const QString &propertyName, properties(false).keys()) { - if (property(propertyName).hasDotSubProperties()) { - QString propertyType = property(propertyName, false).isValid() ? property(propertyName, false).type() : QString(); - if (propertyType.right(1) == "*") - propertyType = propertyType.left(propertyType.size() - 1).trimmed(); - - NodeMetaInfo nodeInfo(m_data->metaInfo.nodeMetaInfo(m_data->metaInfo.fromQtTypes(propertyType), majorVersion(), minorVersion())); - if (nodeInfo.isValid()) { - QHashIterator iter(nodeInfo.properties()); - while (iter.hasNext()) { - iter.next(); - if (!propertiesInfo.contains(iter.key()) && iter.key() != "objectName") - propertiesInfo.insert(propertyName + '.' + iter.key(), iter.value()); - } - } - } - } - return propertiesInfo; -} - -/*! - \brief Returns meta information for a property. An invalid PropertyMetaInfo object if the given property name is unknown. - - \throws InvalidMetaInfoException if the object is not valid - */ -PropertyMetaInfo NodeMetaInfo::property(const QString &propertyName, bool resolveDotSyntax) const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return PropertyMetaInfo(); - } - - if (resolveDotSyntax && propertyName.contains('.')) { - const QStringList nameParts = propertyName.split('.'); - NodeMetaInfo nodeInfo = *this; - const int partCount = nameParts.size(); - for (int i = 0; i < partCount; ++i) { - const QString namePart(nameParts.at(i)); - const PropertyMetaInfo propInfo = nodeInfo.property(namePart, false); - - if (!propInfo.isValid()) - break; - - if (i + 1 == partCount) - return propInfo; - - QString propertyType = propInfo.type(); - if (propertyType.right(1) == "*") - propertyType = propertyType.left(propertyType.size() - 1).trimmed(); - nodeInfo = m_data->metaInfo.nodeMetaInfo(m_data->metaInfo.fromQtTypes(propertyType), majorVersion(), minorVersion()); - if (!nodeInfo.isValid()) { - qWarning() << "no type info available for" << propertyType; - break; - } - } - - return PropertyMetaInfo(); - } else { - PropertyMetaInfo propertyMetaInfo; - - if (hasLocalProperty(propertyName)) { - propertyMetaInfo = m_data->propertyMetaInfoHash.value(propertyName, PropertyMetaInfo()); - } else { - foreach (const NodeMetaInfo &superTypeMetaInfo, superClasses()) { - Q_ASSERT(superTypeMetaInfo.isValid()); - propertyMetaInfo = superTypeMetaInfo.property(propertyName); - if (propertyMetaInfo.isValid()) - break; - } - } - - return propertyMetaInfo; - } -} - -/*! - \brief Returns whether the type has a (not inherited) property. - - \throws InvalidMetaInfoException if the object is not valid - */ -bool NodeMetaInfo::hasLocalProperty(const QString &propertyName, bool resolveDotSyntax) const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return false; - } - - if (resolveDotSyntax && propertyName.contains('.')) { - const QStringList nameParts = propertyName.split('.'); - NodeMetaInfo nodeInfo = *this; - const int partCount = nameParts.size(); - for (int i = 0; i < partCount; ++i) { - QString namePart(nameParts.at(i)); - const PropertyMetaInfo propInfo = nodeInfo.property(namePart, false); - - if (!propInfo.isValid()) - break; - - if (i + 1 == partCount) - return true; - - QString propertyType = propInfo.type(); - if (propertyType.right(1) == "*") - propertyType = propertyType.left(propertyType.size() - 1).trimmed(); - nodeInfo = m_data->metaInfo.nodeMetaInfo(m_data->metaInfo.fromQtTypes(propertyType), majorVersion(), minorVersion()); - if (!nodeInfo.isValid()) { - qWarning() << "no type info available for" << propertyType; - break; - } - } - - return false; - } else { - return m_data->propertyMetaInfoHash.contains(propertyName); - } -} - -/*! - \brief Returns whether the type has a (inherited or not inherited) property. - - \throws InvalidMetaInfoException if the object is not valid - */ -bool NodeMetaInfo::hasProperty(const QString &propertyName) const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return false; - } - - if (hasLocalProperty(propertyName, true)) - return true; - - if (directSuperClass().isValid() && directSuperClass().hasProperty(propertyName)) - return true; - - return false; -} - -void NodeMetaInfo::addProperty(const PropertyMetaInfo &property) -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return; - } - - m_data->propertyMetaInfoHash.insert(property.name(), property); -} - -/*! - \brief Returns the name of the qml type. - - This is not necessarily the class name: E.g. the class defining "Item" is QDeclarativeItem. - - \throws InvalidMetaInfoException if the object is not valid - */ -QString NodeMetaInfo::typeName() const -{ - if (!isValid()) { - return QString(); - } - return m_data->typeName; -} - -/*! - \brief Returns the name of the major number of the qml type. - - \throws InvalidMetaInfoException if the object is not valid -*/ -int NodeMetaInfo::majorVersion() const -{ - if (!isValid()) { - return -1; - } - - return m_data->majorVersion; -} - - -/*! - \brief Returns the name of the minor number of the qml type to which the type is used. - - \throws InvalidMetaInfoException if the object is not valid -*/ -int NodeMetaInfo::minorVersion() const -{ - if (!isValid()) { - return -1; - } - - return m_data->minorVersion; -} - -bool NodeMetaInfo::availableInVersion(int majorVersion, int minorVersion) const -{ - return ((majorVersion > m_data->majorVersion) - || (majorVersion == m_data->majorVersion && minorVersion >= m_data->minorVersion)) - || (majorVersion == -1 && minorVersion == -1); -} - -bool NodeMetaInfo::hasDefaultProperty() const -{ - if (!isValid()) { - return false; - } - - return !m_data->defaultProperty.isNull(); -} - -QString NodeMetaInfo::defaultProperty() const -{ - if (!isValid()) { - return QString(); - } - - return m_data->defaultProperty; -} - -void NodeMetaInfo::setDefaultProperty(const QString &defaultProperty) -{ - if (!isValid()) { - return; - } - - m_data->defaultProperty = defaultProperty; -} - -void NodeMetaInfo::setSuperClass(const QString &typeName, int majorVersion, int minorVersion) -{ - if (!isValid()) { - return; - } - m_data->superClassType = typeName; - m_data->superClassMajorVersion = majorVersion; - m_data->superClassMinorVersion = minorVersion; -} - -void NodeMetaInfo::setInvalid() -{ - if (!isValid()) - return; - - m_data = 0; -} - -void NodeMetaInfo::setType(const QString &typeName, int majorVersion, int minorVersion) -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return; - } - m_data->typeName = typeName; - m_data->majorVersion = majorVersion; - m_data->minorVersion = minorVersion; -} - -uint qHash(const NodeMetaInfo &nodeMetaInfo) -{ - if (!nodeMetaInfo.isValid()) - return 0; - return qHash(nodeMetaInfo.m_data->typeName); -} - -bool operator==(const NodeMetaInfo &firstNodeInfo, - const NodeMetaInfo &secondNodeInfo) -{ - if (!firstNodeInfo.isValid() || !secondNodeInfo.isValid()) - return false; - return firstNodeInfo.m_data->typeName == secondNodeInfo.m_data->typeName; -} - -/*! - \brief Returns whether objects of these type can have children. - - \throws InvalidMetaInfoException if the object is not valid - */ -bool NodeMetaInfo::isContainer() const -{ - // TODO KAI: Is this too generic? - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return false; - } - return m_data->isContainer; -} - -void NodeMetaInfo::setIsContainer(bool isContainer) -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return; - } - m_data->isContainer = isContainer; -} - -QString NodeMetaInfo::componentString() const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return QString(); - } - return m_data->qmlFile; -} - -QIcon NodeMetaInfo::icon() const -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return QIcon(); - } - return m_data->icon; -} - -void NodeMetaInfo::setIcon(const QIcon &icon) -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return; - } - m_data->icon = icon; + return m_privateData->isValid(); } bool NodeMetaInfo::isComponent() const { - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return false; - } - - return !m_data->qmlFile.isEmpty(); + return m_privateData->isComponent(); } -/*! - \brief Returns whether the type inherits from a type. +bool NodeMetaInfo::hasProperty(const QString &propertyName) const +{ + return propertyNames().contains(propertyName); +} + +QStringList NodeMetaInfo::propertyNames() const +{ + return m_privateData->properties(); +} + +QStringList NodeMetaInfo::directPropertyNames() const +{ + return m_privateData->localProperties(); +} + +QString NodeMetaInfo::defaultPropertyName() const +{ + return m_privateData->defaultPropertyName(); +} + +bool NodeMetaInfo::hasDefaultProperty() const +{ + return !defaultPropertyName().isEmpty(); +} + +QString NodeMetaInfo::propertyTypeName(const QString &propertyName) const +{ + return m_privateData->propertyType(propertyName); +} + +bool NodeMetaInfo::propertyIsWritable(const QString &propertyName) const +{ + return m_privateData->isPropertyWritable(propertyName); +} + +bool NodeMetaInfo::propertyIsListProperty(const QString &propertyName) const +{ + return m_privateData->isPropertyList(propertyName); +} + +bool NodeMetaInfo::propertyIsEnumType(const QString &propertyName) const +{ + return m_privateData->isPropertyEnum(propertyName); +} + +QString NodeMetaInfo::propertyEnumScope(const QString &propertyName) const +{ + return m_privateData->propertyEnumScope(propertyName); +} + +QStringList NodeMetaInfo::propertyKeysForEnum(const QString &propertyName) const +{ + return m_privateData->keysForEnum(propertyTypeName(propertyName)); +} + +QVariant NodeMetaInfo::propertyCastedValue(const QString &propertyName, const QVariant &value) const +{ + + QVariant variant = value; + if (propertyIsEnumType(propertyName)) { + return variant; + } + + const QString typeName = propertyTypeName(propertyName); + + QVariant::Type typeId = m_privateData->variantTypeId(propertyName); + + if (variant.type() == QVariant::UserType && variant.userType() == ModelNode::variantUserType()) { + return variant; + } else if (typeId == QVariant::UserType && typeName == QLatin1String("QVariant")) { + return variant; + } else if (typeId == QVariant::UserType && typeName == QLatin1String("variant")) { + return variant; + } else if (typeId == QVariant::UserType && typeName == QLatin1String("var")) { + return variant; + } else if (variant.type() == QVariant::List && variant.type() == QVariant::List) { + // TODO: check the contents of the list + return variant; + } else if (typeName == "var" || typeName == "variant") { + return variant; + } else if (typeName == "alias") { + // TODO: The QML compiler resolves the alias type. We probably should do the same. + return variant; + } else if (variant.convert(typeId)) { + return variant; + } + + return QDeclarativeStringConverters::variantFromString(variant.toString()); + +} + +QList NodeMetaInfo::superClasses() const +{ + QList list; + + foreach (const Internal::TypeDescription &type, m_privateData->prototypes()) { + list.append(NodeMetaInfo(m_privateData->model(), type.className, type.majorVersion, type.minorVersion)); + } + return list; +} + +NodeMetaInfo NodeMetaInfo::directSuperClass() const +{ + QList superClassesList = superClasses(); + if (superClassesList.count() > 1) + return superClassesList.at(1); + return NodeMetaInfo(); +} + +QString NodeMetaInfo::typeName() const +{ + return m_privateData->qualfiedTypeName(); +} +int NodeMetaInfo::majorVersion() const +{ + return m_privateData->majorVersion(); +} +int NodeMetaInfo::minorVersion() const +{ + return m_privateData->minorVersion(); +} + +QString NodeMetaInfo::componentSource() const +{ + return m_privateData->componentSource(); +} + +QString NodeMetaInfo::componentFileName() const +{ + return NodeMetaInfo::m_privateData->componentFileName(); +} + +bool NodeMetaInfo::availableInVersion(int majorVersion, int minorVersion) const +{ + return ((majorVersion > m_privateData->majorVersion()) + || (majorVersion == m_privateData->majorVersion() && minorVersion >= m_privateData->minorVersion())) + || (majorVersion == -1 && minorVersion == -1); +} - \throws InvalidMetaInfoException if the object is not valid - */ bool NodeMetaInfo::isSubclassOf(const QString &type, int majorVersion, int minorVersion) const { if (!isValid()) { @@ -602,76 +962,11 @@ bool NodeMetaInfo::isSubclassOf(const QString &type, int majorVersion, int minor return true; foreach (const NodeMetaInfo &superClass, superClasses()) { - if (superClass.typeName() == type + if (superClass.m_privateData->cleverCheckType(type) && superClass.availableInVersion(majorVersion, minorVersion)) return true; } return false; } -QStringList NodeMetaInfo::propertyNames() const -{ - return properties(true).keys(); -} - -QStringList NodeMetaInfo::propertyNamesOnlyContainer() const -{ - QStringList nameList; - foreach(const PropertyMetaInfo &propertyMetaInfo, properties(true).values()) { - if (propertyMetaInfo.isReadable() && propertyMetaInfo.isWriteable()) - nameList.append(propertyMetaInfo.name()); - } - - return nameList; -} - -QString NodeMetaInfo::propertyType(const QString &propertyName) const -{ - if (!hasProperty(propertyName)) - return QString(); - - return property(propertyName).type(); -} - -QVariant NodeMetaInfo::nativePropertyValue(const QString &propertyName, const QVariant &value) const -{ - if (!hasProperty(propertyName)) - return value; - - return property(propertyName).castedValue(value); -} - -void NodeMetaInfo::setQmlFile(const QString &filePath) -{ - if (!isValid()) { - qWarning() << "NodeMetaInfo is invalid"; - return; - } - m_data->qmlFile = filePath; -} - -//QDataStream& operator<<(QDataStream& stream, const NodeMetaInfo& nodeMetaInfo) -//{ -// stream << nodeMetaInfo.typeName(); -// stream << nodeMetaInfo.majorVersion(); -// stream << nodeMetaInfo.minorVersionTo(); -// -// return stream; -//} -// -//QDataStream& operator>>(QDataStream& stream, NodeMetaInfo& nodeMetaInfo) -//{ -// QString typeName; -// int minorVersion; -// int majorVersion; -// -// stream >> minorVersion; -// stream >> majorVersion; -// stream >> typeName; -// -// nodeMetaInfo = MetaInfo::global().nodeMetaInfo(typeName/*, majorVersion ,minorVersion*/); -// -// return stream; -//} - } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/metainfo/propertymetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/propertymetainfo.cpp deleted file mode 100644 index 2275afb04ef..00000000000 --- a/src/plugins/qmldesigner/designercore/metainfo/propertymetainfo.cpp +++ /dev/null @@ -1,443 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** Commercial Usage -** -** Licensees holding valid Qt Commercial licenses may use this file in -** accordance with the Qt Commercial License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Nokia. -** -** GNU Lesser General Public License Usage -** -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 2.1 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 2.1 requirements -** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** If you are unsure which license is appropriate for your use, please -** contact the sales department at http://qt.nokia.com/contact. -** -**************************************************************************/ - -#include "propertymetainfo.h" - -#include - -#include "invalidmetainfoexception.h" -#include "metainfo.h" -#include "modelnode.h" - -#include -#include - -namespace QmlDesigner { - -namespace Internal -{ - -class PropertyMetaInfoData : public QSharedData -{ -public: - PropertyMetaInfoData() - : QSharedData(), - isValid(false), - readable(false), - writeable(false), - resettable(false), - enumType(false), - flagType(false), - isVisible(false) - {} - - EnumeratorMetaInfo enumerator; - - QString name; - QString type; - bool isValid; - - bool readable; - bool writeable; - bool resettable; - - bool enumType; - bool flagType; - bool isVisible; - - QHash defaultValueHash; -}; - -} - -/*! -\class QmlDesigner::PropertyMetaInfo -\ingroup CoreModel -\brief The PropertyMetaInfo class provides meta information about a qml type property. - -A PropertyMetaInfo object can be NodeMetaInfo, or AbstractProperty::metaInfo. - -The object can be invalid - you can check this by calling isValid(). -The object is invalid if you ask for meta information for -an non-existing qml type. Also the node meta info can become invalid -if the type is deregistered from the meta type system (e.g. -a sub component qml file is deleted). Trying to call any accessor methods on an invalid -PropertyMetaInfo object will result in an InvalidMetaInfoException being thrown. - - -\see QmlDesigner::MetaInfo, QmlDesigner::NodeMetaInfo, QmlDesigner::EnumeratorMetaInfo -*/ - -PropertyMetaInfo::PropertyMetaInfo() - : m_data(new Internal::PropertyMetaInfoData) -{ -} - -PropertyMetaInfo::~PropertyMetaInfo() -{ -} - -/*! - \brief Creates a copy of the handle. - */ -PropertyMetaInfo::PropertyMetaInfo(const PropertyMetaInfo &other) - : m_data(other.m_data) -{ -} - -/*! - \brief Copies the handle. - */ -PropertyMetaInfo &PropertyMetaInfo::operator=(const PropertyMetaInfo &other) -{ - if (this != &other) - m_data = other.m_data; - - return *this; -} - -/*! - \brief Returns whether the meta information system knows about this property. - */ -bool PropertyMetaInfo::isValid() const -{ - return m_data->isValid; -} - -/*! - \brief Returns the name of the property. - */ -QString PropertyMetaInfo::name() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->name; -} - -/*! - \brief Returns the type name of the property. - */ -QString PropertyMetaInfo::type() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->type; -} - -bool PropertyMetaInfo::isVisibleToPropertyEditor() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->isVisible; -} - -void PropertyMetaInfo::setIsVisibleToPropertyEditor(bool isVisible) -{ - m_data->isVisible = isVisible; -} - -/*! - \brief Returns the QVariant type of the property. - */ -QVariant::Type PropertyMetaInfo::variantTypeId() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - Q_ASSERT(!m_data->type.isEmpty()); - - if (m_data->type == "string") - return QVariant::String; - - if (m_data->type == "color") - return QVariant::Color; - - if (m_data->type == "int") - return QVariant::Int; - - if (m_data->type == "url") - return QVariant::Url; - - if (m_data->type == "real") - return QVariant::Double; - - if (m_data->type == "bool") - return QVariant::Bool; - - if (m_data->type == "date") - return QVariant::Date; - - if (m_data->type == "alias") - return QVariant::UserType; - - if (m_data->type == "var") - return QVariant::UserType; - - - return QVariant::nameToType(m_data->type.toLatin1().data()); -} - -/*! - \brief Returns whether the propery is readable. - */ -bool PropertyMetaInfo::isReadable() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->readable; -} - -/*! - \brief Returns whether the propery is writeable. - */ -bool PropertyMetaInfo::isWriteable() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->writeable; -} - -/*! - \brief Returns whether the propery is resettable. - */ -bool PropertyMetaInfo::isResettable() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->resettable; -} - -/*! - \brief Returns whether the propery is complex value type. - */ -bool PropertyMetaInfo::isValueType() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - - QScopedPointer valueType(QDeclarativeValueTypeFactory::valueType(variantTypeId())); - return valueType; -} - -/*! - \brief Returns whether the propery is a QDeclarativeList. - */ -bool PropertyMetaInfo::isListProperty() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - - return type().contains("QDeclarativeList") || - type().contains("alias"); //### this is a nasty hack - we have to get instances in to resolve this properly -} - -/*! - \brief Returns whether the propery has sub properties with "." syntax e.g. font - */ -bool PropertyMetaInfo::hasDotSubProperties() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - - return isValueType() || !isWriteable(); -} - -/*! - \brief Returns whether the propery stores an enum value. - */ -bool PropertyMetaInfo::isEnumType() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->enumType; -} - -/*! - \brief Returns whether the propery stores a flag value. - */ -bool PropertyMetaInfo::isFlagType() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->flagType; -} - -/*! - \brief Returns a default value if there is one specified, an invalid QVariant otherwise. - */ -QVariant PropertyMetaInfo::defaultValue(const NodeMetaInfo &nodeMetaInfoArg) const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - - QList nodeMetaInfoList(nodeMetaInfoArg.superClasses()); - nodeMetaInfoList.prepend(nodeMetaInfoArg); - foreach (const NodeMetaInfo &nodeMetaInfo, nodeMetaInfoList) { - if (m_data->defaultValueHash.contains(nodeMetaInfo.typeName())) - return m_data->defaultValueHash.value(nodeMetaInfo.typeName()); - } - - return QVariant(); -} - -void PropertyMetaInfo::setName(const QString &name) -{ - m_data->name = name; -} - -void PropertyMetaInfo::setType(const QString &type) -{ - m_data->type = type; -} - -void PropertyMetaInfo::setValid(bool isValid) -{ - m_data->isValid = isValid; -} - -void PropertyMetaInfo::setReadable(bool isReadable) -{ - m_data->readable = isReadable; -} - -void PropertyMetaInfo::setWritable(bool isWritable) -{ - m_data->writeable = isWritable; -} - -void PropertyMetaInfo::setResettable(bool isRessetable) -{ - m_data->resettable = isRessetable; -} - -void PropertyMetaInfo::setEnumType(bool isEnumType) -{ - m_data->enumType = isEnumType; -} - -void PropertyMetaInfo::setFlagType(bool isFlagType) -{ - m_data->flagType = isFlagType; -} - -void PropertyMetaInfo::setDefaultValue(const NodeMetaInfo &nodeMetaInfo, const QVariant &value) -{ - m_data->defaultValueHash.insert(nodeMetaInfo.typeName(), value); -} - -void PropertyMetaInfo::setEnumerator(const EnumeratorMetaInfo &info) -{ - m_data->enumerator = info; -} - -/*! - \brief Returns meta information about the enumerator type, an invalid EnumeratorMetaInfo object if the property does not store enumerator values. - */ -const EnumeratorMetaInfo PropertyMetaInfo::enumerator() const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - return m_data->enumerator; -} - -/*! - \brief cast value type of QVariant parameter - - If the type of the passed variant does not correspond to type(), the method tries to convert - the value according to QVariant::convert(). Returns a new QVariant with casted value type - if successful, an invalid QVariant otherwise. - - \param variant the QVariant to take the value from - \returns QVariant with aligned value type, or invalid QVariant - */ -QVariant PropertyMetaInfo::castedValue(const QVariant &originalVariant) const -{ - if (!isValid()) { - Q_ASSERT_X(isValid(), Q_FUNC_INFO, ""); - throw InvalidMetaInfoException(__LINE__, Q_FUNC_INFO, __FILE__); - } - - QVariant variant = originalVariant; - if (m_data->enumType) { - return variant; - } - - QVariant::Type typeId = variantTypeId(); - - if (variant.type() == QVariant::UserType && variant.userType() == ModelNode::variantUserType()) { - return variant; - } else if (typeId == QVariant::UserType && m_data->type == QLatin1String("QVariant")) { - return variant; - } else if (typeId == QVariant::UserType && m_data->type == QLatin1String("variant")) { - return variant; - } else if (typeId == QVariant::UserType && m_data->type == QLatin1String("var")) { - return variant; - } else if (variant.type() == QVariant::List && variant.type() == QVariant::List) { - // TODO: check the contents of the list - return variant; - } else if (type() == "var" || type() == "variant") { - return variant; - } else if (type() == "alias") { - // TODO: The QML compiler resolves the alias type. We probably should do the same. - return variant; - } else if (variant.convert(typeId)) { - return variant; - } - - return QDeclarativeStringConverters::variantFromString(variant.toString()); -} - -} diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index 81fb3552bf1..c4d35f686d9 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -319,11 +319,6 @@ void SubComponentManagerPrivate::unregisterQmlFile(const QFileInfo &fileInfo, co QString componentName = fileInfo.baseName(); if (!qualifier.isEmpty()) componentName = qualifier + '/' + componentName; - - if (m_metaInfo.hasNodeMetaInfo(componentName)) { - NodeMetaInfo nodeInfo = m_metaInfo.nodeMetaInfo(componentName); - m_metaInfo.removeNodeInfo(nodeInfo); - } } static inline bool isDepricatedQtType(const QString &typeName) @@ -336,7 +331,7 @@ static inline bool isDepricatedQtType(const QString &typeName) void SubComponentManagerPrivate::registerQmlFile(const QFileInfo &fileInfo, const QString &qualifier, - const QDeclarativeDomDocument &document, bool addToLibrary) + const QDeclarativeDomDocument &, bool addToLibrary) { QString componentName = fileInfo.baseName(); @@ -350,66 +345,14 @@ void SubComponentManagerPrivate::registerQmlFile(const QFileInfo &fileInfo, cons if (debug) qDebug() << "SubComponentManager" << __FUNCTION__ << componentName; - if (m_metaInfo.hasNodeMetaInfo(componentName) && addToLibrary) { - NodeMetaInfo nodeInfo = m_metaInfo.nodeMetaInfo(componentName); - m_metaInfo.removeNodeInfo(nodeInfo); - } - - const QDeclarativeDomObject rootObject = document.rootObject(); - - NodeMetaInfo nodeInfo(m_metaInfo); - nodeInfo.setType(componentName, -1, -1); - nodeInfo.setQmlFile(fileInfo.filePath()); - if (!isDepricatedQtType(rootObject.objectType())) { - nodeInfo.setSuperClass(rootObject.objectType(), - rootObject.objectTypeMajorVersion(), - rootObject.objectTypeMinorVersion()); - } else { - QString properClassName = rootObject.objectType(); - properClassName.replace("QtQuick/", "Qt/"); - nodeInfo.setSuperClass(properClassName, - 1, - 0); - } - if (addToLibrary) { // Add file components to the library ItemLibraryEntry itemLibraryEntry; - itemLibraryEntry.setType(nodeInfo.typeName(), nodeInfo.majorVersion(), nodeInfo.minorVersion()); + itemLibraryEntry.setType(componentName, -1, -1); itemLibraryEntry.setName(componentName); itemLibraryEntry.setCategory(tr("QML Components")); m_metaInfo.itemLibraryInfo()->addEntry(itemLibraryEntry); } - - m_metaInfo.addNodeInfo(nodeInfo); - - //document.rootObject().d - - foreach (const QDeclarativeDomDynamicProperty &dynamicProperty, document.rootObject().dynamicProperties()) { - Q_ASSERT(!dynamicProperty.propertyName().isEmpty()); - Q_ASSERT(!dynamicProperty.propertyTypeName().isEmpty()); - - if (dynamicProperty.isDefaultProperty()) - nodeInfo.setDefaultProperty(dynamicProperty.propertyName()); - - PropertyMetaInfo propertyMetaInfo; - propertyMetaInfo.setName(dynamicProperty.propertyName()); - propertyMetaInfo.setType(dynamicProperty.propertyTypeName()); - propertyMetaInfo.setValid(true); - propertyMetaInfo.setReadable(true); - propertyMetaInfo.setWritable(true); - - QDeclarativeDomProperty defaultValue = dynamicProperty.defaultValue(); - if (defaultValue.value().isLiteral()) { - QVariant defaultValueVariant(defaultValue.value().toLiteral().literal()); - defaultValueVariant.convert((QVariant::Type) dynamicProperty.propertyType()); - propertyMetaInfo.setDefaultValue(nodeInfo, defaultValueVariant); - } - - nodeInfo.addProperty(propertyMetaInfo); - } - if (!nodeInfo.hasDefaultProperty()) - nodeInfo.setDefaultProperty(nodeInfo.directSuperClass().defaultProperty()); } } // namespace Internal diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index 6fa866afc4e..d0304a50be8 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -224,21 +224,12 @@ QmlObjectNode AbstractProperty::parentQmlObjectNode() const { return QmlObjectNode(parentModelNode()); } -/*! - \brief returns the metainfo instance for this property - \return metainfo instance for this property -*/ -PropertyMetaInfo AbstractProperty::metaInfo() const -{ - return ModelNode(m_internalNode, m_model.data(), view()).metaInfo().property(m_propertyName, true); -} - /*! \brief returns whether the property is the default property for the model node. */ bool AbstractProperty::isDefaultProperty() const { - return ModelNode(m_internalNode, m_model.data(), view()).metaInfo().defaultProperty() == m_propertyName; + return ModelNode(m_internalNode, m_model.data(), view()).metaInfo().defaultPropertyName() == m_propertyName; } VariantProperty AbstractProperty::toVariantProperty() const diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp index 040f30fd791..bbe9756201c 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.cpp @@ -32,7 +32,6 @@ #include "internalvariantproperty.h" #include "internalnodelistproperty.h" #include "internalnodeproperty.h" -#include "propertyparser.h" #include "internalnode_p.h" #include #include diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index c9da585ead6..dd5370b7ab4 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -46,6 +46,7 @@ #include "abstractview.h" #include "nodeinstanceview.h" #include "metainfo.h" +#include "nodemetainfo.h" #include "model_p.h" #include "subcomponentmanager.h" #include "variantparser.h" @@ -1374,6 +1375,11 @@ void Model::removeImport(const Import &import) m_d->removeImport(import); } +RewriterView *Model::rewriterView() const +{ + return m_d->rewriterView(); +} + #if 0 /*! \brief Creates a new empty model @@ -1424,6 +1430,11 @@ const MetaInfo Model::metaInfo() const return m_d->metaInfo(); } +NodeMetaInfo Model::metaInfo(const QString &typeName, int majorVersion, int minorVersion) +{ + return NodeMetaInfo(this, typeName, majorVersion, minorVersion); +} + /*! \brief Sets a specific Metainfo on this Model */ diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 2ed4a46e796..021a0d04810 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -730,16 +730,14 @@ bool ModelNode::hasAnySubModelNodes() const return !nodeAbstractProperties().isEmpty(); } -/*! \brief returns the meta info of the node -\return meta info of the node -*/ const NodeMetaInfo ModelNode::metaInfo() const { if (!isValid()) { Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid"); throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - return model()->metaInfo().nodeMetaInfo(type(), majorVersion(), minorVersion()); + + return NodeMetaInfo(model(), type(), majorVersion(), minorVersion()); } /*! \brief has a node the selection of the model diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index d3186b778c1..0cc02b781c8 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -63,7 +63,7 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode) if (internalNode()->hasProperty(name()) && !internalNode()->property(name())->isNodeAbstractProperty()) reparentHere(modelNode, isNodeListProperty()); else - reparentHere(modelNode, metaInfo().isListProperty()); //we could use the metasystem instead? + reparentHere(modelNode, parentModelNode().metaInfo().propertyIsListProperty(name())); //we could use the metasystem instead? } void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNodeList) diff --git a/src/plugins/qmldesigner/designercore/model/propertyparser.cpp b/src/plugins/qmldesigner/designercore/model/propertyparser.cpp index 4043e81827a..633297d0bb2 100644 --- a/src/plugins/qmldesigner/designercore/model/propertyparser.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertyparser.cpp @@ -40,23 +40,16 @@ namespace QmlDesigner { namespace Internal { namespace PropertyParser { -static QVariant fromEnum(const QString &string, const QString &type, const MetaInfo &metaInfo) +static QVariant fromEnum(const QString &string, const QString &, const MetaInfo &) { if (string.isEmpty()) return QVariant(); - // TODO Use model metainfo - EnumeratorMetaInfo enumerator = metaInfo.enumerator(type); - int value = enumerator.elementValue(string); - return QVariant(value); + return QVariant(string); } -QVariant read(const QString &typeStr, const QString &str, const MetaInfo &metaInfo) +QVariant read(const QString &typeStr, const QString &str, const MetaInfo &) { - if (metaInfo.hasEnumerator(typeStr)) { - return fromEnum(str, typeStr, metaInfo); - } - return read(typeStr, str); } diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index dc86938dd33..f53b68a7d6e 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -459,7 +459,7 @@ bool QmlObjectNode::hasDefaultProperty() const QString QmlObjectNode::defaultProperty() const { - return modelNode().metaInfo().defaultProperty(); + return modelNode().metaInfo().defaultPropertyName(); } void QmlObjectNode::setParent(QmlObjectNode newParent) diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index 0ddece841d3..b9e8b490390 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -35,7 +35,7 @@ #include "nodelistproperty.h" #include "qmltextgenerator.h" #include "variantproperty.h" -#include +#include #include "model.h" using namespace QmlDesigner; @@ -95,8 +95,11 @@ QString QmlTextGenerator::toQml(const AbstractProperty &property, int indentDept if (property.name() == QLatin1String("id")) return stringValue; - if (variantProperty.metaInfo().isValid() && variantProperty.metaInfo().isEnumType()) { - return variantProperty.metaInfo().enumerator().scope() + '.' + stringValue; + if (false) { + } + if (variantProperty.parentModelNode().metaInfo().isValid() && + variantProperty.parentModelNode().metaInfo().propertyIsEnumType(variantProperty.name())) { + return variantProperty.parentModelNode().metaInfo().propertyEnumScope(variantProperty.name()) + '.' + stringValue; } else { switch (value.type()) { diff --git a/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp b/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp index 7f2d37a5af5..35484aaaa74 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp @@ -31,7 +31,6 @@ #include "nodeabstractproperty.h" #include "nodelistproperty.h" -#include "propertymetainfo.h" #include "nodemetainfo.h" #include "rewriteaction.h" @@ -327,7 +326,7 @@ bool MoveNodeRewriteAction::execute(QmlRefactoring &refactoring, const int newTrailingNodeLocation = m_newTrailingNode.isValid() ? positionStore.nodeOffset(m_newTrailingNode) : -1; bool result = false; - bool inDefaultProperty = (m_movingNode.parentProperty().parentModelNode().metaInfo().defaultProperty() == m_movingNode.parentProperty().name()); + bool inDefaultProperty = (m_movingNode.parentProperty().parentModelNode().metaInfo().defaultPropertyName() == m_movingNode.parentProperty().name()); result = refactoring.moveObjectBeforeObject(movingNodeLocation, newTrailingNodeLocation, inDefaultProperty); if (!result) {