diff options
Diffstat (limited to 'src/plugins/qmldesigner/designercore/model')
39 files changed, 603 insertions, 1435 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp index b51ed2c204..785655578c 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractproperty.cpp @@ -42,7 +42,6 @@ #include "nodelistproperty.h" #include <QTextStream> #include <qmlobjectnode.h> -#include <QDeclarativeView> namespace QmlDesigner { diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index d4309bb591..e306199243 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -132,6 +132,11 @@ Model* AbstractView::model() const return m_model.data(); } +bool AbstractView::isAttached() const +{ + return model(); +} + /*! \brief is called if a view is being attached to a model \param model which is being attached @@ -252,7 +257,7 @@ QList<ModelNode> AbstractView::toModelNodeList(const QList<Internal::InternalNod QList<ModelNode> toModelNodeList(const QList<Internal::InternalNode::Pointer> &nodeList, AbstractView *view) { QList<ModelNode> newNodeList; - foreach(const Internal::InternalNode::Pointer &node, nodeList) + foreach (const Internal::InternalNode::Pointer &node, nodeList) newNodeList.append(ModelNode(node, view->model(), view)); return newNodeList; @@ -261,7 +266,7 @@ QList<ModelNode> toModelNodeList(const QList<Internal::InternalNode::Pointer> &n QList<Internal::InternalNode::Pointer> toInternalNodeList(const QList<ModelNode> &nodeList) { QList<Internal::InternalNode::Pointer> newNodeList; - foreach(const ModelNode &node, nodeList) + foreach (const ModelNode &node, nodeList) newNodeList.append(node.internalNode()); return newNodeList; @@ -338,20 +343,18 @@ QmlModelView *AbstractView::toQmlModelView() NodeInstanceView *AbstractView::nodeInstanceView() const { - if (model()) { + if (model()) return model()->d->nodeInstanceView(); - } else { + else return 0; - } } RewriterView *AbstractView::rewriterView() const { - if (model()) { + if (model()) return model()->d->rewriterView(); - } else { + else return 0; - } } void AbstractView::resetView() @@ -364,7 +367,7 @@ void AbstractView::resetView() currentModel->attachView(this); } -QList<ModelNode> AbstractView::allModelNodes() +QList<ModelNode> AbstractView::allModelNodes() const { return toModelNodeList(model()->d->allNodes()); } diff --git a/src/plugins/qmldesigner/designercore/model/anchorline.cpp b/src/plugins/qmldesigner/designercore/model/anchorline.cpp index dddafb1222..2563647436 100644 --- a/src/plugins/qmldesigner/designercore/model/anchorline.cpp +++ b/src/plugins/qmldesigner/designercore/model/anchorline.cpp @@ -84,9 +84,8 @@ AnchorLine &AnchorLine::operator =(const AnchorLine &other) ModelNode AnchorLine::modelNode() const { - if (m_internalNode.isNull() || m_internalNodeState.isNull() || m_model.isNull()) { + if (m_internalNode.isNull() || m_internalNodeState.isNull() || m_model.isNull()) return ModelNode(); - } return ModelNode(m_internalNode, m_model.data()); } diff --git a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp index 053e911e6e..b38fc0bdd2 100644 --- a/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/basetexteditmodifier.cpp @@ -62,11 +62,10 @@ void BaseTextEditModifier::indent(int offset, int length) int BaseTextEditModifier::indentDepth() const { - if (TextEditor::BaseTextEditorWidget *bte = qobject_cast<TextEditor::BaseTextEditorWidget*>(plainTextEdit())) { + if (TextEditor::BaseTextEditorWidget *bte = qobject_cast<TextEditor::BaseTextEditorWidget*>(plainTextEdit())) return bte->tabSettings().m_indentSize; - } else { + else return 0; - } } bool BaseTextEditModifier::renameId(const QString &oldId, const QString &newId) diff --git a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp index 559e3c7b4e..9acb0bbc2e 100644 --- a/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/bindingproperty.cpp @@ -212,9 +212,8 @@ void BindingProperty::setDynamicTypeNameAndExpression(const QString &typeName, c if (expression.isEmpty()) throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, name()); - if (typeName.isEmpty()) { + if (typeName.isEmpty()) throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, name()); - } if (internalNode()->hasProperty(name())) { //check if oldValue != value Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); diff --git a/src/plugins/qmldesigner/designercore/model/internalnode.cpp b/src/plugins/qmldesigner/designercore/model/internalnode.cpp index 01aafbf003..a981757864 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnode.cpp @@ -36,7 +36,7 @@ #include "invalidpropertyexception.h" #include <QDebug> -#include <corelib_global.h> +#include <qmldesignercorelib_global.h> namespace QmlDesigner { namespace Internal { @@ -289,7 +289,7 @@ QList<InternalProperty::Pointer> InternalNode::propertyList() const QList<InternalNodeAbstractProperty::Pointer> InternalNode::nodeAbstractPropertyList() const { QList<InternalNodeAbstractProperty::Pointer> abstractPropertyList; - foreach(const InternalProperty::Pointer &property, propertyList()) { + foreach (const InternalProperty::Pointer &property, propertyList()) { if (property->isNodeAbstractProperty()) abstractPropertyList.append(property->toNodeAbstractProperty()); } @@ -301,7 +301,7 @@ QList<InternalNodeAbstractProperty::Pointer> InternalNode::nodeAbstractPropertyL QList<InternalNode::Pointer> InternalNode::allSubNodes() const { QList<InternalNode::Pointer> nodeList; - foreach(const InternalNodeAbstractProperty::Pointer &property, nodeAbstractPropertyList()) { + foreach (const InternalNodeAbstractProperty::Pointer &property, nodeAbstractPropertyList()) { nodeList.append(property->allSubNodes()); } @@ -311,7 +311,7 @@ QList<InternalNode::Pointer> InternalNode::allSubNodes() const QList<InternalNode::Pointer> InternalNode::allDirectSubNodes() const { QList<InternalNode::Pointer> nodeList; - foreach(const InternalNodeAbstractProperty::Pointer &property, nodeAbstractPropertyList()) { + foreach (const InternalNodeAbstractProperty::Pointer &property, nodeAbstractPropertyList()) { nodeList.append(property->allDirectSubNodes()); } diff --git a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp index d512a1cefe..10f08167dd 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodelistproperty.cpp @@ -109,7 +109,7 @@ void InternalNodeListProperty::slide(int from, int to) QList<InternalNode::Pointer> InternalNodeListProperty::allSubNodes() const { QList<InternalNode::Pointer> nodeList; - foreach(const InternalNode::Pointer &childNode, m_nodeList) { + foreach (const InternalNode::Pointer &childNode, m_nodeList) { nodeList.append(childNode->allSubNodes()); nodeList.append(childNode); } diff --git a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp index 866e45952a..63209ead49 100644 --- a/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/internalnodeproperty.cpp @@ -114,9 +114,8 @@ QList<InternalNodePointer> InternalNodeProperty::allDirectSubNodes() const { QList<InternalNode::Pointer> nodeList; - if (node()) { + if (node()) nodeList.append(node()); - } return nodeList; } diff --git a/src/plugins/qmldesigner/designercore/model/internalproperty.h b/src/plugins/qmldesigner/designercore/model/internalproperty.h index 048be6db0e..2fbb6e1c69 100644 --- a/src/plugins/qmldesigner/designercore/model/internalproperty.h +++ b/src/plugins/qmldesigner/designercore/model/internalproperty.h @@ -30,7 +30,7 @@ #ifndef INTERNALPROPERTY_H #define INTERNALPROPERTY_H -#include "corelib_global.h" +#include "qmldesignercorelib_global.h" #include <QVariant> #include <QString> @@ -55,7 +55,7 @@ class InternalNode; typedef QSharedPointer<InternalNode> InternalNodePointer; typedef QWeakPointer<InternalNode> InternalNodeWeakPointer; -class CORESHARED_EXPORT InternalProperty +class QMLDESIGNERCORE_EXPORT InternalProperty { public: typedef QSharedPointer<InternalProperty> Pointer; diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 043747313a..1b72e15d3c 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -91,7 +91,7 @@ ModelPrivate::ModelPrivate(Model *model) : m_writeLock(false), m_internalIdCounter(1) { - m_rootInternalNode = createNode("QtQuick/Item", 1, 0, PropertyListType(), PropertyListType(), QString(), ModelNode::NodeWithoutSource,true); + m_rootInternalNode = createNode("QtQuick.Item", 1, 0, PropertyListType(), PropertyListType(), QString(), ModelNode::NodeWithoutSource,true); m_acutalStateNode = m_rootInternalNode; } @@ -107,15 +107,15 @@ void ModelPrivate::detachAllViews() m_viewList.clear(); - if (m_rewriterView) { - m_rewriterView->modelAboutToBeDetached(m_q); - m_rewriterView.clear(); - } - if (m_nodeInstanceView) { m_nodeInstanceView->modelAboutToBeDetached(m_q); m_nodeInstanceView.clear(); } + + if (m_rewriterView) { + m_rewriterView->modelAboutToBeDetached(m_q); + m_rewriterView.clear(); + } } Model *ModelPrivate::create(QString type, int major, int minor, Model *metaInfoPropxyModel) @@ -158,9 +158,8 @@ void ModelPrivate::notifyImportsChanged(const QList<Import> &addedImports, const QString description; try { - if (rewriterView()) { + if (rewriterView()) rewriterView()->importsChanged(addedImports, removedImports); - } } catch (RewritingException &e) { description = e.description(); resetModel = true; @@ -174,9 +173,8 @@ void ModelPrivate::notifyImportsChanged(const QList<Import> &addedImports, const foreach (const QWeakPointer<AbstractView> &view, m_viewList) view->importsChanged(addedImports, removedImports); - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } QUrl ModelPrivate::fileUrl() const @@ -359,9 +357,8 @@ void ModelPrivate::notifyAuxiliaryDataChanged(const InternalNodePointer &interna nodeInstanceView()->auxiliaryDataChanged(node, name, data); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyNodeSourceChanged(const InternalNodePointer &internalNode, const QString &newNodeSource) @@ -391,9 +388,8 @@ void ModelPrivate::notifyNodeSourceChanged(const InternalNodePointer &internalNo nodeInstanceView()->nodeSourceChanged(node, newNodeSource); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersion, int minorVersion) @@ -418,9 +414,8 @@ void ModelPrivate::notifyRootNodeTypeChanged(const QString &type, int majorVersi } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyInstancePropertyChange(const QList<QPair<ModelNode, QString> > &propertyPairList) @@ -461,13 +456,11 @@ void ModelPrivate::notifyInstancesCompleted(const QVector<ModelNode> &nodeVector view->instancesCompleted(toModelNodeVector(internalVector, view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->instancesCompleted(toModelNodeVector(internalVector, nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } QMultiHash<ModelNode, InformationName> convertModelNodeInformationHash(const QMultiHash<ModelNode, InformationName> &informationChangeHash, AbstractView *view) @@ -501,13 +494,11 @@ void ModelPrivate::notifyInstancesInformationsChange(const QMultiHash<ModelNode, view->instanceInformationsChange(convertModelNodeInformationHash(informationChangeHash, view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->instanceInformationsChange(convertModelNodeInformationHash(informationChangeHash, nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyInstancesRenderImageChanged(const QVector<ModelNode> &nodeVector) @@ -530,13 +521,11 @@ void ModelPrivate::notifyInstancesRenderImageChanged(const QVector<ModelNode> &n view->instancesRenderImageChanged(toModelNodeVector(internalVector, view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->instancesRenderImageChanged(toModelNodeVector(internalVector, nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector<ModelNode> &nodeVector) @@ -559,13 +548,11 @@ void ModelPrivate::notifyInstancesPreviewImageChanged(const QVector<ModelNode> & view->instancesPreviewImageChanged(toModelNodeVector(internalVector, view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->instancesPreviewImageChanged(toModelNodeVector(internalVector, nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyInstancesChildrenChanged(const QVector<ModelNode> &nodeVector) @@ -588,13 +575,11 @@ void ModelPrivate::notifyInstancesChildrenChanged(const QVector<ModelNode> &node view->instancesChildrenChanged(toModelNodeVector(internalVector, view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->instancesChildrenChanged(toModelNodeVector(internalVector, nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyActualStateChanged(const ModelNode &node) @@ -617,13 +602,11 @@ void ModelPrivate::notifyActualStateChanged(const ModelNode &node) view->actualStateChanged(ModelNode(node.internalNode(), model(), view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->actualStateChanged(ModelNode(node.internalNode(), model(), nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyRewriterBeginTransaction() @@ -644,13 +627,11 @@ void ModelPrivate::notifyRewriterBeginTransaction() view->rewriterBeginTransaction(); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->rewriterBeginTransaction(); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyRewriterEndTransaction() @@ -671,13 +652,11 @@ void ModelPrivate::notifyRewriterEndTransaction() view->rewriterEndTransaction(); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->rewriterEndTransaction(); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyInstanceToken(const QString &token, int number, const QVector<ModelNode> &nodeVector) @@ -701,13 +680,11 @@ void ModelPrivate::notifyInstanceToken(const QString &token, int number, const Q view->instancesToken(token, number, toModelNodeVector(internalVector, view.data())); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->instancesToken(token, number, toModelNodeVector(internalVector, nodeInstanceView())); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) @@ -730,13 +707,11 @@ void ModelPrivate::notifyCustomNotification(const AbstractView *senderView, cons view->customNotification(senderView, identifier, toModelNodeList(internalList, view.data()), data); } - if (nodeInstanceView()) { + if (nodeInstanceView()) nodeInstanceView()->customNotification(senderView, identifier, toModelNodeList(internalList, nodeInstanceView()), data); - } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } @@ -781,9 +756,8 @@ void ModelPrivate::notifyPropertiesRemoved(const QList<PropertyPair> &propertyPa view->propertiesRemoved(propertyList); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList<InternalProperty::Pointer> &internalPropertyList) @@ -833,9 +807,8 @@ void ModelPrivate::notifyPropertiesAboutToBeRemoved(const QList<InternalProperty nodeInstanceView()->propertiesAboutToBeRemoved(propertyList); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::setAuxiliaryData(const InternalNode::Pointer& node, const QString &name, const QVariant &data) @@ -846,9 +819,8 @@ void ModelPrivate::setAuxiliaryData(const InternalNode::Pointer& node, const QSt void ModelPrivate::resetModelByRewriter(const QString &description) { - if (rewriterView()) { + if (rewriterView()) rewriterView()->resetToLastCorrectQml(); - } throw RewritingException(__LINE__, __FUNCTION__, __FILE__, description, rewriterView()->textModifierContent()); } @@ -899,9 +871,8 @@ void ModelPrivate::notifyNodeCreated(const InternalNode::Pointer &newInternalNod view->nodeCreated(createdNode); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyNodeAboutToBeRemoved(const InternalNode::Pointer &nodePointer) @@ -930,9 +901,8 @@ void ModelPrivate::notifyNodeAboutToBeRemoved(const InternalNode::Pointer &nodeP nodeInstanceView()->nodeAboutToBeRemoved(node); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyNodeRemoved(const InternalNodePointer &nodePointer, const InternalNodePointer &parentNodePointer, const QString &parentPropertyName, AbstractView::PropertyChangeFlags propertyChange) @@ -965,9 +935,8 @@ void ModelPrivate::notifyNodeRemoved(const InternalNodePointer &nodePointer, con } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyNodeIdChanged(const InternalNode::Pointer& nodePointer, const QString& newId, const QString& oldId) @@ -996,9 +965,8 @@ void ModelPrivate::notifyNodeIdChanged(const InternalNode::Pointer& nodePointer, nodeInstanceView()->nodeIdChanged(node, newId, oldId); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyBindingPropertiesChanged(const QList<InternalBindingPropertyPointer> &internalBropertyList, AbstractView::PropertyChangeFlags propertyChange) @@ -1037,9 +1005,8 @@ void ModelPrivate::notifyBindingPropertiesChanged(const QList<InternalBindingPro nodeInstanceView()->bindingPropertiesChanged(propertyList, propertyChange); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyScriptFunctionsChanged(const InternalNodePointer &internalNodePointer, const QStringList &scriptFunctionList) @@ -1070,9 +1037,8 @@ void ModelPrivate::notifyScriptFunctionsChanged(const InternalNodePointer &inter } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } @@ -1127,9 +1093,8 @@ void ModelPrivate::notifyVariantPropertiesChanged(const InternalNodePointer &int nodeInstanceView()->variantPropertiesChanged(propertyList, propertyChange); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &internalNodePointer, const InternalNodeAbstractPropertyPointer &newPropertyParent, const InternalNodePointer &oldParent, const QString &oldPropertyName, AbstractView::PropertyChangeFlags propertyChange) @@ -1184,9 +1149,8 @@ void ModelPrivate::notifyNodeAboutToBeReparent(const InternalNodePointer &intern nodeInstanceView()->nodeAboutToBeReparented(node, newProperty, oldProperty, propertyChange); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } @@ -1242,9 +1206,8 @@ void ModelPrivate::notifyNodeReparent(const InternalNode::Pointer &internalNodeP nodeInstanceView()->nodeReparented(node, newProperty, oldProperty, propertyChange); } - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::notifyNodeOrderChanged(const InternalNodeListPropertyPointer &internalListPropertyPointer, @@ -1276,9 +1239,8 @@ void ModelPrivate::notifyNodeOrderChanged(const InternalNodeListPropertyPointer ModelNode(internalNodePointer, model(), nodeInstanceView()), oldIndex); - if (resetModel) { + if (resetModel) resetModelByRewriter(description); - } } void ModelPrivate::setSelectedNodes(const QList<InternalNode::Pointer> &selectedNodeList) @@ -1563,12 +1525,13 @@ void ModelPrivate::setRewriterView(RewriterView *rewriterView) Q_ASSERT(!(rewriterView && m_rewriterView)); + if (m_rewriterView) + m_rewriterView->modelAboutToBeDetached(model()); + m_rewriterView = rewriterView; if (rewriterView) rewriterView->modelAttached(model()); - else if (m_rewriterView) - m_rewriterView->modelAboutToBeDetached(model()); } RewriterView *ModelPrivate::rewriterView() const @@ -1755,11 +1718,34 @@ bool Model::hasImport(const Import &import, bool ignoreAlias, bool allowHigherVe return false; } +QString Model::pathForImport(const Import &import) +{ + if (!rewriterView()) + return QString(); + + return rewriterView()->pathForImport(import); +} + RewriterView *Model::rewriterView() const { return d->rewriterView(); } +void Model::setRewriterView(RewriterView *rewriterView) +{ + d->setRewriterView(rewriterView); +} + +NodeInstanceView *Model::nodeInstanceView() const +{ + return d->nodeInstanceView(); +} + +void Model::setNodeInstanceView(NodeInstanceView *nodeInstanceView) +{ + d->setNodeInstanceView(nodeInstanceView); +} + /*! \brief Returns the model that is used for metainfo \return Return itself if not other metaInfoProxyModel does exist @@ -1785,16 +1771,6 @@ Model *Model::create(const QString &rootType) } #endif -Model *Model::masterModel() const -{ - return d->m_masterModel.data(); -} - -void Model::setMasterModel(Model *model) -{ - d->m_masterModel = model; -} - /*! \brief Returns the URL against which relative URLs within the model should be resolved. \return The base URL. @@ -1864,13 +1840,11 @@ void Model::attachView(AbstractView *view) // Internal::WriteLocker locker(d); RewriterView *rewriterView = qobject_cast<RewriterView*>(view); if (rewriterView) { - d->setRewriterView(rewriterView); return; } NodeInstanceView *nodeInstanceView = qobject_cast<NodeInstanceView*>(view); if (nodeInstanceView) { - d->setNodeInstanceView(nodeInstanceView); return; } @@ -1892,13 +1866,11 @@ void Model::detachView(AbstractView *view, ViewNotification emitDetachNotify) RewriterView *rewriterView = qobject_cast<RewriterView*>(view); if (rewriterView) { - d->setRewriterView(0); return; } NodeInstanceView *nodeInstanceView = qobject_cast<NodeInstanceView*>(view); if (nodeInstanceView) { - d->setNodeInstanceView(0); return; } diff --git a/src/plugins/qmldesigner/designercore/model/model_p.h b/src/plugins/qmldesigner/designercore/model/model_p.h index 8339ca9c05..27605e35c9 100644 --- a/src/plugins/qmldesigner/designercore/model/model_p.h +++ b/src/plugins/qmldesigner/designercore/model/model_p.h @@ -39,7 +39,7 @@ #include "abstractview.h" #include "metainfo.h" -#include "corelib_global.h" +#include "qmldesignercorelib_global.h" QT_BEGIN_NAMESPACE class QPlainTextEdit; @@ -212,6 +212,8 @@ public: void setRewriterView(RewriterView *rewriterView); RewriterView *rewriterView() const; + + void setNodeInstanceView(NodeInstanceView *nodeInstanceView); NodeInstanceView *nodeInstanceView() const; @@ -229,7 +231,6 @@ private: //functions private: Model *m_q; MetaInfo m_metaInfo; - QList<Import> m_imports; QList<QWeakPointer<AbstractView> > m_viewList; QList<InternalNodePointer> m_selectedNodeList; @@ -237,17 +238,11 @@ private: QHash<qint32, InternalNodePointer> m_internalIdNodeHash; QSet<InternalNodePointer> m_nodeSet; InternalNodePointer m_acutalStateNode; - - InternalNodePointer m_rootInternalNode; - QUrl m_fileUrl; - - QWeakPointer<Model> m_masterModel; QWeakPointer<RewriterView> m_rewriterView; QWeakPointer<NodeInstanceView> m_nodeInstanceView; QWeakPointer<Model> m_metaInfoProxyModel; - bool m_writeLock; qint32 m_internalIdCounter; }; diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index 10679027ba..122977fbe0 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -33,6 +33,7 @@ #include "modelnode.h" #include "abstractview.h" #include "model.h" +#include "nodemetainfo.h" #include "nodeproperty.h" #include "nodelistproperty.h" #include "bindingproperty.h" @@ -42,6 +43,7 @@ #include <QSet> #include <QStringList> +#include <QUrl> #include <QDebug> @@ -75,16 +77,15 @@ static void syncBindingProperties(ModelNode &outputNode, const ModelNode &inputN static void syncId(ModelNode &outputNode, const ModelNode &inputNode, const QHash<QString, QString> &idRenamingHash) { - if (!inputNode.id().isEmpty()) { + if (!inputNode.id().isEmpty()) outputNode.setId(idRenamingHash.value(inputNode.id())); - } } static void splitIdInBaseNameAndNumber(const QString &id, QString *baseId, int *number) { int counter = 0; - while(counter < id.count()) { + while (counter < id.count()) { bool canConvertToInteger = false; int newNumber = id.right(counter +1).toInt(&canConvertToInteger); if (canConvertToInteger) @@ -144,7 +145,8 @@ static ModelNode createNodeFromNode(const ModelNode &modelNode,const QHash<QStri foreach (const VariantProperty &variantProperty, modelNode.variantProperties()) { propertyList.append(QPair<QString, QVariant>(variantProperty.name(), variantProperty.value())); } - ModelNode newNode(view->createModelNode(modelNode.type(),modelNode.majorVersion(),modelNode.minorVersion(), + NodeMetaInfo nodeMetaInfo = view->model()->metaInfo(modelNode.type()); + ModelNode newNode(view->createModelNode(modelNode.type(), nodeMetaInfo.majorVersion(), nodeMetaInfo.minorVersion(), propertyList, variantPropertyList, modelNode.nodeSource(), modelNode.nodeSourceType())); syncBindingProperties(newNode, modelNode, idRenamingHash); syncId(newNode, modelNode, idRenamingHash); @@ -161,9 +163,8 @@ ModelNode ModelMerger::insertModel(const ModelNode &modelNode) QList<Import> newImports; foreach (const Import &import, modelNode.model()->imports()) { - if (!view()->model()->hasImport(import, true, true)) { + if (!view()->model()->hasImport(import, true, true)) newImports.append(import); - } } view()->model()->changeImports(newImports, QList<Import>()); @@ -198,7 +199,7 @@ void ModelMerger::replaceModel(const ModelNode &modelNode) syncNodeProperties(rootNode, modelNode, idRenamingHash, view()); syncNodeListProperties(rootNode, modelNode, idRenamingHash, view()); m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); - } catch (RewritingException &e) { + } catch (RewritingException &e) { qWarning() << e.description(); //silent error } } diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 79b354965d..dbce22d4f0 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -134,7 +134,7 @@ QString ModelNode::generateNewId() const int counter = 1; QString newId = QString("%1%2").arg(simplifiedTypeName().toLower()).arg(counter); - while(view()->hasId(newId)) { + while (view()->hasId(newId)) { counter += 1; newId = QString("%1%2").arg(simplifiedTypeName().toLower()).arg(counter); } @@ -147,9 +147,8 @@ QString ModelNode::generateNewId() const */ QString ModelNode::id() const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } return m_internalNode->id(); } @@ -248,10 +247,12 @@ int ModelNode::majorQtQuickVersion() const } if (metaInfo().isValid()) { + if (type() == "QtQuick.QtObject") + return majorVersion(); NodeMetaInfo superClass = metaInfo().directSuperClass(); while (superClass.isValid()) { - if (superClass.typeName() == "QtQuick.Item") + if (superClass.typeName() == "QtQuick.QtObject") return superClass.majorVersion(); superClass = superClass.directSuperClass(); } @@ -351,9 +352,8 @@ void ModelNode::setParentProperty(NodeAbstractProperty parent) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - if (!parent.parentModelNode().isValid()) { + if (!parent.parentModelNode().isValid()) throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, "newParentNode"); - } if (*this == parent.parentModelNode()) { Q_ASSERT_X(*this != parent.parentModelNode(), Q_FUNC_INFO, "cannot set parent to itself"); @@ -629,9 +629,8 @@ void ModelNode::destroy() throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - if (isRootNode()) { + if (isRootNode()) throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, "rootNode"); - } removeModelNodeFromSelection(*this); model()->d->removeNode(internalNode()); @@ -879,9 +878,8 @@ QTextStream& operator<<(QTextStream &stream, const ModelNode &modelNode) void ModelNode::selectNode() { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } QList<ModelNode> selectedNodeList; selectedNodeList.append(*this); @@ -891,9 +889,8 @@ void ModelNode::selectNode() void ModelNode::deselectNode() { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } QList<ModelNode> selectedNodeList(view()->selectedModelNodes()); selectedNodeList.removeAll(*this); @@ -913,9 +910,8 @@ QVariant ModelNode::toVariant() const QVariant ModelNode::auxiliaryData(const QString &name) const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } return internalNode()->auxiliaryData(name); } @@ -928,18 +924,16 @@ void ModelNode::setAuxiliaryData(const QString &name, const QVariant &data) cons bool ModelNode::hasAuxiliaryData(const QString &name) const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } return internalNode()->hasAuxiliaryData(name); } QHash<QString, QVariant> ModelNode::auxiliaryData() const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } return internalNode()->auxiliaryData(); } @@ -979,18 +973,16 @@ void ModelNode::setNodeSource(const QString &newNodeSource) QString ModelNode::nodeSource() const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } return internalNode()->nodeSource(); } QString ModelNode::convertTypeToImportAlias() const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } if (model()->rewriterView()) return model()->rewriterView()->convertTypeToImportAlias(type()); @@ -1000,9 +992,8 @@ QString ModelNode::convertTypeToImportAlias() const ModelNode::NodeSourceType ModelNode::nodeSourceType() const { - if (!isValid()) { + if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - } return static_cast<ModelNode::NodeSourceType>(internalNode()->nodeSourceType()); diff --git a/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp b/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp deleted file mode 100644 index 336dbaaa6b..0000000000 --- a/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.cpp +++ /dev/null @@ -1,951 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#include <cmath> -#include "modelnodecontextmenu.h" -#include <QApplication> -#include <QMessageBox> -#include <coreplugin/editormanager/editormanager.h> -#include <nodeabstractproperty.h> -#include <nodelistproperty.h> -#include <nodemetainfo.h> -#include <modelnode.h> -#include <qmlitemnode.h> -#include <variantproperty.h> -#include <bindingproperty.h> -#include <nodeproperty.h> -#include <rewritingexception.h> -#include <rewritertransaction.h> -#include <designmodewidget.h> -#include <qmlanchors.h> - -const QString auxDataString = QLatin1String("anchors_"); - -namespace QmlDesigner { - -static inline DesignDocumentController* designDocumentController() -{ - return Internal::DesignModeWidget::instance()->currentDesignDocumentController(); -} - -static inline QString captionForModelNode(const ModelNode &modelNode) -{ - if (modelNode.id().isEmpty()) - return modelNode.simplifiedTypeName(); - - return modelNode.id(); -} - -static inline bool contains(const QmlItemNode &node, const QPoint &p) -{ - return node.instanceSceneTransform().mapRect(node.instanceBoundingRect()).contains(p); -} - -static inline bool checkIfNodeIsAView(const ModelNode &node) -{ - return node.metaInfo().isValid() && - (node.metaInfo().isSubclassOf("QtQuick.ListView", -1, -1) || - node.metaInfo().isSubclassOf("QtQuick.GridView", -1, -1) || - node.metaInfo().isSubclassOf("QtQuick.PathView", -1, -1)); -} - -static inline bool isItem(const ModelNode &node) -{ - return node.isValid() && node.metaInfo().isValid() && node.metaInfo().isSubclassOf("QtQuick.Item", -1, -1); -} - -static inline bool itemsHaveSameParent(const QList<ModelNode> &siblingList) -{ - if (siblingList.isEmpty()) - return false; - - - QmlItemNode item(siblingList.first()); - if (!item.isValid()) - return false; - - if (item.isRootModelNode()) - return false; - - QmlItemNode parent = item.instanceParent().toQmlItemNode(); - if (!parent.isValid()) - return false; - - foreach (const ModelNode &node, siblingList) { - QmlItemNode currentItem(node); - if (!currentItem.isValid()) - return false; - QmlItemNode currentParent = currentItem.instanceParent().toQmlItemNode(); - if (!currentParent.isValid()) - return false; - if (currentItem.instanceIsInPositioner()) - return false; - if (currentParent != parent) - return false; - } - return true; -} - -static inline QList<QmlItemNode> siblingsForNode(const QmlItemNode &itemNode) -{ - QList<QmlItemNode> siblingList; - - if (itemNode.isValid() && itemNode.modelNode().parentProperty().isValid()) { - QList<ModelNode> modelNodes = itemNode.modelNode().parentProperty().parentModelNode().allDirectSubModelNodes(); - foreach (const ModelNode &node, modelNodes) { - QmlItemNode childItemNode = node; - if (childItemNode.isValid()) - siblingList.append(childItemNode); - } - } - - return siblingList; -} - -static signed int getMaxZValue(const QList<QmlItemNode> &siblingList) -{ - signed int maximum = INT_MIN; - foreach (const QmlItemNode &node, siblingList) { - signed int z = node.instanceValue("z").toInt(); - if (z > maximum) - maximum = z; - } - return maximum; -} - -static signed int getMinZValue(const QList<QmlItemNode> &siblingList) -{ - signed int minimum = INT_MAX; - foreach (const QmlItemNode &node, siblingList) { - signed int z = node.instanceValue("z").toInt(); - if (z < minimum) - minimum = z; - } - return minimum; -} - - -static inline bool modelNodeIsComponent(const ModelNode &node) -{ - if (!node.isValid() || !node.metaInfo().isValid()) - return false; - - if (node.metaInfo().isComponent()) - return true; - - if (node.nodeSourceType() == ModelNode::NodeWithComponentSource) - return true; - if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate")) { - if (node.nodeProperty("delegate").modelNode().metaInfo().isComponent()) - return true; - if (node.nodeProperty("delegate").modelNode().nodeSourceType() == ModelNode::NodeWithComponentSource) - return true; - } - - return false; -} - -static inline bool isFileComponent(const ModelNode &node) -{ - if (!node.isValid() || !node.metaInfo().isValid()) - return false; - - if (node.metaInfo().isComponent()) - return true; - - if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate")) { - if (node.nodeProperty("delegate").modelNode().metaInfo().isComponent()) - return true; - } - - return false; -} - -static inline void getWidthHeight(const ModelNode &node, int &width, int &height) -{ - QmlItemNode itemNode(node); - if (itemNode.isValid()) { - width = itemNode.instanceValue("width").toInt(); - height = itemNode.instanceValue("height").toInt(); - } -} - -static inline void getProperties(const ModelNode node, QHash<QString, QVariant> &propertyHash) -{ - if (QmlObjectNode(node).isValid()) { - foreach (const QString &propertyName, node.propertyNames()) { - if (node.property(propertyName).isVariantProperty() || - (node.property(propertyName).isBindingProperty() && - !propertyName.contains(QLatin1String("anchors.")))) { - propertyHash.insert(propertyName, QmlObjectNode(node).instanceValue(propertyName)); - } - } - } - QmlItemNode itemNode(node); - if (itemNode.isValid()) { - propertyHash.insert(QLatin1String("width"), itemNode.instanceValue(QLatin1String("width"))); - propertyHash.insert(QLatin1String("height"), itemNode.instanceValue(QLatin1String("height"))); - propertyHash.remove(QLatin1String("x")); - propertyHash.remove(QLatin1String("y")); - propertyHash.remove(QLatin1String("rotation")); - propertyHash.remove(QLatin1String("opacity")); - } -} - -static inline void applyProperties(ModelNode &node, const QHash<QString, QVariant> &propertyHash) -{ - QHash<QString, QVariant> auxiliaryData = node.auxiliaryData(); - foreach (const QString propertyName, auxiliaryData.keys()) { - node.setAuxiliaryData(propertyName, QVariant()); - } - - QHashIterator<QString, QVariant> i(propertyHash); - while (i.hasNext()) { - i.next(); - if (i.key() == QLatin1String("width") || i.key() == QLatin1String("height")) { - node.setAuxiliaryData(i.key(), i.value()); - } else if (node.property(i.key()).isDynamic() && - node.property(i.key()).dynamicTypeName() == QLatin1String("alias") && - node.property(i.key()).isBindingProperty()) { - AbstractProperty targetProperty = node.bindingProperty(i.key()).resolveToProperty(); - if (targetProperty.isValid()) { - targetProperty.parentModelNode().setAuxiliaryData(targetProperty.name() + QLatin1String("@NodeInstance"), i.value()); - } - } else { - node.setAuxiliaryData(i.key() + QLatin1String("@NodeInstance"), i.value()); - } - } -} - -static inline void openFileForComponent(const ModelNode &node) -{ - //int width = 0; - //int height = 0; - QHash<QString, QVariant> propertyHash; - if (node.metaInfo().isComponent()) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - designDocumentController()->changeToExternalSubComponent(node.metaInfo().componentFileName()); - } else if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate") && - node.nodeProperty("delegate").modelNode().metaInfo().isComponent()) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - designDocumentController()->changeToExternalSubComponent(node.nodeProperty("delegate").modelNode().metaInfo().componentFileName()); - } - ModelNode rootModelNode = designDocumentController()->model()->rewriterView()->rootModelNode(); - applyProperties(rootModelNode, propertyHash); - //rootModelNode.setAuxiliaryData("width", width); - //rootModelNode.setAuxiliaryData("height", height); -} - -static inline void openInlineComponent(const ModelNode &node) -{ - if (!node.isValid() || !node.metaInfo().isValid()) - return; - - if (!designDocumentController()) - return; - - //int width = 0; - //int height = 0; - QHash<QString, QVariant> propertyHash; - - if (node.nodeSourceType() == ModelNode::NodeWithComponentSource) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - designDocumentController()->changeToSubComponent(node); - } else if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate")) { - if (node.nodeProperty("delegate").modelNode().nodeSourceType() == ModelNode::NodeWithComponentSource) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - designDocumentController()->changeToSubComponent(node.nodeProperty("delegate").modelNode()); - } - } - - ModelNode rootModelNode = designDocumentController()->model()->rewriterView()->rootModelNode(); - applyProperties(rootModelNode, propertyHash); - //rootModelNode.setAuxiliaryData("width", width); - //rootModelNode.setAuxiliaryData("height", height); -} - -static inline bool modelNodesHaveProperty(const QList<ModelNode> &modelNodeList, const QString &propertyName) -{ - foreach (const ModelNode &modelNode, modelNodeList) - if (modelNode.hasProperty(propertyName)) - return true; - - return false; -} - -ModelNodeContextMenu::ModelNodeContextMenu(QmlModelView *view) : m_view(view) -{ -} - -void ModelNodeContextMenu::execute(const QPoint &pos, bool selectionMenuBool) -{ - QMenu* menu = new QMenu(); - - bool singleSelected = false; - bool selectionIsEmpty = m_view->selectedModelNodes().isEmpty(); - ModelNode currentSingleNode; - const bool isInBaseState = m_view->currentState().isBaseState(); - const QList<ModelNode> &selectedModelNodes = m_view->selectedModelNodes(); - if (selectedModelNodes.count()== 1) { - singleSelected = true; - currentSingleNode = selectedModelNodes.first(); - } - - if (selectionMenuBool) { - QMenu *selectionMenu = new QMenu(tr("Selection"), menu); - menu->addMenu(selectionMenu); - ModelNode parentNode; - if (singleSelected) { - //ModelNodeAction *selectionAction; - //selectionAction = createModelNodeAction(tr("DeSelect: ") + captionForModelNode(currentSingleNode), selectionMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::DeSelectModelNode); - //selectionMenu->addAction(selectionAction); - if (!currentSingleNode.isRootNode()) { - parentNode = currentSingleNode.parentProperty().parentModelNode(); - selectionMenu->addAction(createModelNodeAction(tr("Select parent: %1").arg(captionForModelNode(parentNode)), - selectionMenu, QList<ModelNode>() << parentNode, ModelNodeAction::SelectModelNode)); - } - - selectionMenu->addSeparator(); - } - foreach (const ModelNode &node, m_view->allModelNodes()) { - if (node != currentSingleNode && node != parentNode && contains(node, m_scenePos) && !node.isRootNode()) - selectionMenu->addAction(createModelNodeAction(tr("Select: %1").arg(captionForModelNode(node)), selectionMenu, QList<ModelNode>() << node, ModelNodeAction::SelectModelNode)); - } - } - - QMenu *stackMenu = new QMenu(tr("Stack (z)"), menu); - menu->addMenu(stackMenu); - - stackMenu->addAction(createModelNodeAction(tr("To Front"), stackMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::ToFront, singleSelected)); - stackMenu->addAction(createModelNodeAction(tr("To Back"), stackMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::ToBack, singleSelected)); - stackMenu->addAction(createModelNodeAction(tr("Raise"), stackMenu, QList<ModelNode>() << selectedModelNodes, ModelNodeAction::Raise)); - stackMenu->addAction(createModelNodeAction(tr("Lower"), stackMenu, QList<ModelNode>() << selectedModelNodes, ModelNodeAction::Lower)); - stackMenu->addSeparator(); - stackMenu->addAction(createModelNodeAction(tr("Reset z property"), stackMenu, QList<ModelNode>() << selectedModelNodes, ModelNodeAction::ResetZ)); - - QMenu *editMenu = new QMenu(tr("Edit"), menu); - menu->addMenu(editMenu); - if (!selectionIsEmpty) { - //editMenu->addAction(createModelNodeAction(tr("Change Id"), editMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::SetId, singleSelected)); - ModelNodeAction* action = createModelNodeAction(tr("Reset Position"), editMenu, selectedModelNodes, ModelNodeAction::ResetPosition); - if (!modelNodesHaveProperty(selectedModelNodes, QLatin1String("x")) && !modelNodesHaveProperty(selectedModelNodes, QLatin1String("y"))) - action->setEnabled(false); - editMenu->addAction(action); - action = createModelNodeAction(tr("Reset Size"), editMenu, selectedModelNodes, ModelNodeAction::ResetSize); - if (!modelNodesHaveProperty(selectedModelNodes, QLatin1String("width")) && !modelNodesHaveProperty(selectedModelNodes, QLatin1String("height"))) - action->setEnabled(false); - editMenu->addAction(action); - action = createModelNodeAction(tr("Visibility"), editMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::ModelNodeVisibility, singleSelected); - editMenu->addAction(action); - if (singleSelected && !isItem(currentSingleNode)) - action->setEnabled(false); - - } else { - editMenu->setEnabled(false); - } - - QMenu *anchorMenu = new QMenu(tr("Anchors"), menu); - menu->addMenu(anchorMenu); - - - if (singleSelected && isInBaseState) { - QmlItemNode itemNode(currentSingleNode); - - bool anchored = itemNode.instanceHasAnchors(); - bool isRootNode = itemNode.isRootNode(); - - ModelNodeAction *action = createModelNodeAction(tr("Fill"), anchorMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::AnchorFill, !anchored && !isRootNode); - anchorMenu->addAction(action); - action = createModelNodeAction(tr("Reset"), anchorMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::AnchorReset, anchored && !isRootNode); - anchorMenu->addAction(action); - } else { - anchorMenu->setEnabled(false); - } - - QMenu *layoutMenu = new QMenu(tr("Layout"), menu); - menu->addMenu(layoutMenu); - - bool layoutingIsPossible = itemsHaveSameParent(selectedModelNodes) && isInBaseState; - - if (!singleSelected && !selectionIsEmpty && layoutingIsPossible) { - - ModelNodeAction *action = createModelNodeAction(tr("Layout in Row"), layoutMenu, selectedModelNodes, ModelNodeAction::LayoutRow, true); - layoutMenu->addAction(action); - action = createModelNodeAction(tr("Layout in Column"), layoutMenu, selectedModelNodes, ModelNodeAction::LayoutColumn, true); - layoutMenu->addAction(action); - action = createModelNodeAction(tr("Layout in Grid"), layoutMenu, selectedModelNodes, ModelNodeAction::LayoutGrid, true); - layoutMenu->addAction(action); - action = createModelNodeAction(tr("Layout in Flow"), layoutMenu, selectedModelNodes, ModelNodeAction::LayoutFlow, true); - layoutMenu->addAction(action); - - } else { - layoutMenu->setEnabled(false); - } - - - menu->addSeparator(); - bool enterComponent = false; - if (singleSelected) { - enterComponent = modelNodeIsComponent(currentSingleNode); - } - menu->addAction(createModelNodeAction(tr("Go into Component"), editMenu, QList<ModelNode>() << currentSingleNode, ModelNodeAction::GoIntoComponent, enterComponent)); - - menu->exec(pos); - menu->deleteLater(); -} - -void ModelNodeContextMenu::setScenePos(const QPoint &pos) -{ - m_scenePos = pos; -} - - -ModelNodeAction* ModelNodeContextMenu::createModelNodeAction(const QString &description, QMenu *menu, const QList<ModelNode> &modelNodeList, ModelNodeAction::ModelNodeActionType type, bool enabled) -{ - ModelNodeAction* action = new ModelNodeAction(description, menu, m_view, modelNodeList, type); - action->setEnabled(enabled); - return action; -} - - -ModelNodeAction::ModelNodeAction( const QString & text, QObject *parent, QmlModelView *view, const QList<ModelNode> &modelNodeList, ModelNodeActionType type) : - QAction(text, parent), m_view(view), m_modelNodeList(modelNodeList), m_type(type) -{ - if (type == ModelNodeVisibility) { - setCheckable(true); - QmlItemNode itemNode = QmlItemNode(m_modelNodeList.first()); - if (itemNode.isValid()) - setChecked(itemNode.instanceValue("visible").toBool()); - else - setEnabled(false); - } - connect(this, SIGNAL(triggered(bool)), this, SLOT(actionTriggered(bool))); -} - -void ModelNodeAction::goIntoComponent(const ModelNode &modelNode) -{ - - if (modelNode.isValid() && modelNodeIsComponent(modelNode)) { - if (isFileComponent(modelNode)) - openFileForComponent(modelNode); - else - openInlineComponent(modelNode); - } -} - -void ModelNodeAction::actionTriggered(bool b) -{ - try { - switch (m_type) { - case ModelNodeAction::SelectModelNode: select(); break; - case ModelNodeAction::DeSelectModelNode: deSelect(); break; - case ModelNodeAction::CutSelection: cut(); break; - case ModelNodeAction::CopySelection: copy(); break; - case ModelNodeAction::DeleteSelection: deleteSelection(); break; - case ModelNodeAction::ToFront: toFront(); break; - case ModelNodeAction::ToBack: toBack(); break; - case ModelNodeAction::Raise: raise(); break; - case ModelNodeAction::Lower: lower(); break; - case ModelNodeAction::Paste: paste(); break; - case ModelNodeAction::Undo: undo(); break; - case ModelNodeAction::Redo: redo(); break; - case ModelNodeAction::ModelNodeVisibility: setVisible(b); break; - case ModelNodeAction::ResetSize: resetSize(); break; - case ModelNodeAction::ResetPosition: resetPosition(); break; - case ModelNodeAction::GoIntoComponent: goIntoComponent(); break; - case ModelNodeAction::SetId: setId(); break; - case ModelNodeAction::ResetZ: resetZ(); break; - case ModelNodeAction::AnchorFill: anchorsFill(); break; - case ModelNodeAction::AnchorReset: anchorsReset(); break; - case ModelNodeAction::LayoutColumn: layoutColumn(); break; - case ModelNodeAction::LayoutRow: layoutRow(); break; - case ModelNodeAction::LayoutGrid: layoutGrid(); break; - case ModelNodeAction::LayoutFlow: layoutFlow(); break; - } - } catch (RewritingException e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - -void ModelNodeAction::select() -{ - if (m_view) - m_view->setSelectedModelNodes(m_modelNodeList); -} - -void ModelNodeAction::deSelect() -{ - if (m_view) { - QList<ModelNode> selectedNodes = m_view->selectedModelNodes(); - foreach (const ModelNode &node, m_modelNodeList) { - if (selectedNodes.contains(node)) - selectedNodes.removeAll(node); - } - m_view->setSelectedModelNodes(selectedNodes); - } -} - -void ModelNodeAction::cut() -{ -} - - -void ModelNodeAction::copy() -{ -} - -void ModelNodeAction::deleteSelection() -{ -} - -void ModelNodeAction::toFront() -{ - if (!m_view) - return; - - try { - QmlItemNode node = m_modelNodeList.first(); - if (node.isValid()) { - signed int maximumZ = getMaxZValue(siblingsForNode(node)); - maximumZ++; - node.setVariantProperty("z", maximumZ); - } - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - - -void ModelNodeAction::toBack() -{ - if (!m_view) - return; - try { - QmlItemNode node = m_modelNodeList.first(); - if (node.isValid()) { - signed int minimumZ = getMinZValue(siblingsForNode(node)); - minimumZ--; - node.setVariantProperty("z", minimumZ); - } - - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - -void ModelNodeAction::raise() -{ - if (!m_view) - return; - - try { - RewriterTransaction transaction(m_view); - foreach (ModelNode modelNode, m_modelNodeList) { - QmlItemNode node = modelNode; - if (node.isValid()) { - signed int z = node.instanceValue("z").toInt(); - z++; - node.setVariantProperty("z", z); - } - } - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - -void ModelNodeAction::lower() -{ - if (!m_view) - return; - try { - RewriterTransaction transaction(m_view); - foreach (ModelNode modelNode, m_modelNodeList) { - QmlItemNode node = modelNode; - if (node.isValid()) { - signed int z = node.instanceValue("z").toInt(); - z--; - node.setVariantProperty("z", z); - } - } - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - -void ModelNodeAction::paste() -{ -} - -void ModelNodeAction::undo() -{ -} - -void ModelNodeAction::redo() -{ -} - -void ModelNodeAction::setVisible(bool b) -{ - if (!m_view) - return; - try { - m_modelNodeList.first().variantProperty("visible") = b; - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - - -void ModelNodeAction::resetSize() -{ - if (!m_view) - return; - try { - RewriterTransaction transaction(m_view); - foreach (ModelNode node, m_modelNodeList) { - node.removeProperty("width"); - node.removeProperty("height"); - } - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - -void ModelNodeAction::resetPosition() -{ - if (!m_view) - return; - try { - RewriterTransaction transaction(m_view); - foreach (ModelNode node, m_modelNodeList) { - node.removeProperty("x"); - node.removeProperty("y"); - } - } catch (RewritingException &e) { //better save then sorry - QMessageBox::warning(0, "Error", e.description()); - } -} - -void ModelNodeAction::goIntoComponent() -{ - goIntoComponent(m_modelNodeList.first()); -} - -void ModelNodeAction::setId() -{ -} - -void ModelNodeAction::resetZ() -{ - if (!m_view) - return; - - RewriterTransaction transaction(m_view); - foreach (ModelNode node, m_modelNodeList) { - node.removeProperty("z"); - } -} - -static inline void backupPropertyAndRemove(ModelNode node, const QString &propertyName) -{ - if (node.hasVariantProperty(propertyName)) { - node.setAuxiliaryData(auxDataString + propertyName, node.variantProperty(propertyName).value()); - node.removeProperty(propertyName); - - } - if (node.hasBindingProperty(propertyName)) { - node.setAuxiliaryData(auxDataString + propertyName, QmlItemNode(node).instanceValue(propertyName)); - node.removeProperty(propertyName); - } -} - - -static inline void restoreProperty(ModelNode node, const QString &propertyName) -{ - if (node.hasAuxiliaryData(auxDataString + propertyName)) - node.variantProperty(propertyName) = node.auxiliaryData(auxDataString + propertyName); -} - -void ModelNodeAction::anchorsFill() -{ - if (!m_view) - return; - - RewriterTransaction transaction(m_view); - - foreach (ModelNode modelNode, m_modelNodeList) { - QmlItemNode node = modelNode; - if (node.isValid()) { - node.anchors().fill(); - backupPropertyAndRemove(modelNode, QLatin1String("x")); - backupPropertyAndRemove(modelNode, QLatin1String("y")); - backupPropertyAndRemove(modelNode, QLatin1String("width")); - backupPropertyAndRemove(modelNode, QLatin1String("height")); - } - } -} - -void ModelNodeAction::anchorsReset() -{ - if (!m_view) - return; - RewriterTransaction transaction(m_view); - - foreach (ModelNode modelNode, m_modelNodeList) { - QmlItemNode node = modelNode; - if (node.isValid()) { - node.anchors().removeAnchors(); - node.anchors().removeMargins(); - restoreProperty(node, "x"); - restoreProperty(node, "y"); - restoreProperty(node, "width"); - restoreProperty(node, "height"); - } - } -} - -static inline void reparentTo(const ModelNode &node, const QmlItemNode &parent) -{ - - if (parent.isValid() && node.isValid()) { - NodeAbstractProperty parentProperty; - - if (parent.hasDefaultProperty()) { - parentProperty = parent.nodeAbstractProperty(parent.defaultProperty()); - } else { - parentProperty = parent.nodeAbstractProperty(QLatin1String("data")); - } - - parentProperty.reparentHere(node); - } -} - - -bool compareByX(const ModelNode &node1, const ModelNode &node2) -{ - QmlItemNode itemNode1 = QmlItemNode(node1); - QmlItemNode itemNode2 = QmlItemNode(node2); - if (itemNode1.isValid() && itemNode2.isValid()) - return itemNode1.instancePosition().x() < itemNode2.instancePosition().x(); - return false; -} - -bool compareByY(const ModelNode &node1, const ModelNode &node2) -{ - QmlItemNode itemNode1 = QmlItemNode(node1); - QmlItemNode itemNode2 = QmlItemNode(node2); - if (itemNode1.isValid() && itemNode2.isValid()) - return itemNode1.instancePosition().y() < itemNode2.instancePosition().y(); - return false; -} - -bool compareByGrid(const ModelNode &node1, const ModelNode &node2) -{ - QmlItemNode itemNode1 = QmlItemNode(node1); - QmlItemNode itemNode2 = QmlItemNode(node2); - if (itemNode1.isValid() && itemNode2.isValid()) { - if ((itemNode1.instancePosition().y() + itemNode1.instanceSize().height()) < itemNode2.instancePosition().y()) - return true; - if ((itemNode2.instancePosition().y() + itemNode2.instanceSize().height()) < itemNode1.instancePosition().y()) - return false; //first sort y (rows) - return itemNode1.instancePosition().x() < itemNode2.instancePosition().x(); - } - return false; -} - -static inline QPoint getUpperLeftPosition(const QList<ModelNode> &modelNodeList) -{ - QPoint p(INT_MAX, INT_MAX); - foreach (ModelNode modelNode, modelNodeList) { - QmlItemNode itemNode = QmlItemNode(modelNode); - if (itemNode.isValid()) { - if (itemNode.instancePosition().x() < p.x()) - p.setX(itemNode.instancePosition().x()); - if (itemNode.instancePosition().y() < p.y()) - p.setY(itemNode.instancePosition().y()); - } - - } - return p; -} - -void ModelNodeAction::layoutRow() -{ - if (!m_view) - return; - - ModelNode row; - { - RewriterTransaction transaction(m_view); - - QmlItemNode parent = QmlItemNode(m_modelNodeList.first()).instanceParent().toQmlItemNode(); - if (!parent.isValid()) - return; - - row = m_view->createModelNode(QLatin1String("QtQuick.Row"), parent.modelNode().majorQtQuickVersion(), 0); - - reparentTo(row, parent); - } - - { - RewriterTransaction transaction(m_view); - - QPoint pos = getUpperLeftPosition(m_modelNodeList); - row.variantProperty(QLatin1String("x")) = pos.x(); - row.variantProperty(QLatin1String("y")) = pos.y(); - - QList<ModelNode> sortedList = m_modelNodeList; - qSort(sortedList.begin(), sortedList.end(), compareByX); - - foreach (ModelNode modelNode, sortedList) { - reparentTo(modelNode, row); - modelNode.removeProperty(QLatin1String("x")); - modelNode.removeProperty(QLatin1String("y")); - } - } -} - -void ModelNodeAction::layoutColumn() -{ - if (!m_view) - return; - - ModelNode column; - { - RewriterTransaction transaction(m_view); - - QmlItemNode parent = QmlItemNode(m_modelNodeList.first()).instanceParent().toQmlItemNode(); - if (!parent.isValid()) - return; - - column = m_view->createModelNode(QLatin1String("QtQuick.Column"), parent.modelNode().majorQtQuickVersion(), 0); - - reparentTo(column, parent); - } - - { - RewriterTransaction transaction(m_view); - - QPoint pos = getUpperLeftPosition(m_modelNodeList); - column.variantProperty(QLatin1String("x")) = pos.x(); - column.variantProperty(QLatin1String("y")) = pos.y(); - - QList<ModelNode> sortedList = m_modelNodeList; - qSort(sortedList.begin(), sortedList.end(), compareByY); - - foreach (ModelNode modelNode, sortedList) { - reparentTo(modelNode, column); - modelNode.removeProperty(QLatin1String("x")); - modelNode.removeProperty(QLatin1String("y")); - } - } -} - -void ModelNodeAction::layoutGrid() -{ - if (!m_view) - return; - - ModelNode grid; - { - RewriterTransaction transaction(m_view); - - QmlItemNode parent = QmlItemNode(m_modelNodeList.first()).instanceParent().toQmlItemNode(); - if (!parent.isValid()) - return; - - grid = m_view->createModelNode(QLatin1String("QtQuick.Grid"), parent.modelNode().majorQtQuickVersion(), 0); - grid.variantProperty(QLatin1String("columns")) = int(sqrt(double(m_modelNodeList.count()))); - - reparentTo(grid, parent); - } - - { - RewriterTransaction transaction(m_view); - - QPoint pos = getUpperLeftPosition(m_modelNodeList); - grid.variantProperty(QLatin1String("x")) = pos.x(); - grid.variantProperty(QLatin1String("y")) = pos.y(); - - QList<ModelNode> sortedList = m_modelNodeList; - qSort(sortedList.begin(), sortedList.end(), compareByGrid); - - foreach (ModelNode modelNode, sortedList) { - reparentTo(modelNode, grid); - modelNode.removeProperty(QLatin1String("x")); - modelNode.removeProperty(QLatin1String("y")); - } - } -} - -void ModelNodeAction::layoutFlow() -{ - if (!m_view) - return; - - ModelNode flow; - { - RewriterTransaction transaction(m_view); - - QmlItemNode parent = QmlItemNode(m_modelNodeList.first()).instanceParent().toQmlItemNode(); - if (!parent.isValid()) - return; - - flow = m_view->createModelNode(QLatin1String("QtQuick.Flow"), parent.modelNode().majorQtQuickVersion(), 0); - - reparentTo(flow, parent); - } - - { - RewriterTransaction transaction(m_view); - - QPoint pos = getUpperLeftPosition(m_modelNodeList); - flow.variantProperty(QLatin1String("x")) = pos.x(); - flow.variantProperty(QLatin1String("y")) = pos.y(); - - QList<ModelNode> sortedList = m_modelNodeList; - qSort(sortedList.begin(), sortedList.end(), compareByGrid); - - foreach (ModelNode modelNode, sortedList) { - reparentTo(modelNode, flow); - modelNode.removeProperty(QLatin1String("x")); - modelNode.removeProperty(QLatin1String("y")); - } - } -} - -} diff --git a/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.h b/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.h deleted file mode 100644 index 903f64b257..0000000000 --- a/src/plugins/qmldesigner/designercore/model/modelnodecontextmenu.h +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/legal -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. For licensing terms and -** conditions see http://qt.digia.com/licensing. For further information -** use the contact form at http://qt.digia.com/contact-us. -** -** 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. -** -** In addition, as a special exception, Digia gives you certain additional -** rights. These rights are described in the Digia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -****************************************************************************/ - -#ifndef MODELNODECONTEXTMENU_H -#define MODELNODECONTEXTMENU_H - -#include <QObject> -#include <QPoint> -#include <QAction> -#include <QCoreApplication> -#include <QMenu> -#include <qmlmodelview.h> - -namespace QmlDesigner { - -class ModelNodeAction : public QAction -{ - Q_OBJECT -public: - enum ModelNodeActionType { - SelectModelNode, - DeSelectModelNode, - CutSelection, - CopySelection, - DeleteSelection, - ToFront, - ToBack, - Raise, - Lower, - Paste, - Undo, - Redo, - ModelNodeVisibility, - ResetSize, - ResetPosition, - GoIntoComponent, - SetId, - ResetZ, - AnchorReset, - AnchorFill, - LayoutRow, - LayoutColumn, - LayoutGrid, - LayoutFlow - }; - - - ModelNodeAction( const QString & text, QObject *parent, QmlModelView *view, const QList<ModelNode> &modelNodeList, ModelNodeActionType type); - - static void goIntoComponent(const ModelNode &modelNode); - -public slots: - void actionTriggered(bool); - -private: - void select(); - void deSelect(); - void cut(); - void copy(); - void deleteSelection(); - void toFront(); - void toBack(); - void raise(); - void lower(); - void paste(); - void undo(); - void redo(); - void setVisible(bool); - void resetSize(); - void resetPosition(); - void goIntoComponent(); - void setId(); - void resetZ(); - void anchorsFill(); - void anchorsReset(); - void layoutRow(); - void layoutColumn(); - void layoutGrid(); - void layoutFlow(); - - QmlModelView *m_view; - QList<ModelNode> m_modelNodeList; - ModelNodeActionType m_type; -}; - -class ModelNodeContextMenu -{ - Q_DECLARE_TR_FUNCTIONS(QmlDesigner::ModelNodeContextMenu) -public: - ModelNodeContextMenu(QmlModelView *view); - void execute(const QPoint &pos, bool selectionMenu); - void setScenePos(const QPoint &pos); - -private: - ModelNodeAction* createModelNodeAction(const QString &description, QMenu *menu, const QList<ModelNode> &modelNodeList, ModelNodeAction::ModelNodeActionType type, bool enabled = true); - - QmlModelView *m_view; - QPoint m_scenePos; - -}; - - -}; - -#endif // MODELNODECONTEXTMENU_H diff --git a/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp b/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp index f715916f9e..f51239ebcf 100644 --- a/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelrewriter.cpp @@ -387,21 +387,17 @@ ModificationGroupToken ModelRewriter::beginModificationGroup() void ModelRewriter::endModificationGroup(const ModificationGroupToken& token) { - if (m_activeModificationGroups.isEmpty()) { + if (m_activeModificationGroups.isEmpty()) throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - } - if (m_activeModificationGroups.last() != token) { + if (m_activeModificationGroups.last() != token) throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - } - if (!m_activeModificationGroups.removeAll(token)) { + if (!m_activeModificationGroups.removeAll(token)) throw ModificationGroupException(__LINE__, Q_FUNC_INFO, __FILE__); - } - if (!modificationGroupActive()) { + if (!modificationGroupActive()) m_modelToTextMerger.applyChanges(*m_textModifier); - } } bool ModelRewriter::lastRewriteFailed() const @@ -438,9 +434,8 @@ bool ModelRewriter::paste(QMimeData *transferData, const InternalNode::Pointer & Paster paster(transferData, intoNode); if (paster.doPaste(m_modelToTextMerger)) { - if (!modificationGroupActive()) { + if (!modificationGroupActive()) m_modelToTextMerger.applyChanges(*m_textModifier); - } return true; } else { m_modelToTextMerger.clear(); diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp index 219a33137f..9e171dd1a6 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.cpp @@ -66,13 +66,12 @@ void ModelToTextMerger::nodeRemoved(const ModelNode &removedNode, const NodeAbst if (!isInHierarchy(parentProperty)) return; - if (parentProperty.isDefaultProperty()) { + if (parentProperty.isDefaultProperty()) schedule(new RemoveNodeRewriteAction(removedNode)); - } else if (AbstractView::EmptyPropertiesRemoved == propertyChange) { + else if (AbstractView::EmptyPropertiesRemoved == propertyChange) schedule(new RemovePropertyRewriteAction(parentProperty)); - } else if (parentProperty.isNodeListProperty()) { + else if (parentProperty.isNodeListProperty()) schedule(new RemoveNodeRewriteAction(removedNode)); - } } void ModelToTextMerger::propertiesRemoved(const QList<AbstractProperty>& propertyList) @@ -157,11 +156,10 @@ void ModelToTextMerger::nodeReparented(const ModelNode &node, const NodeAbstract if (oldPropertyParent.isNodeProperty()) { // ignore, the subsequent remove property will take care of all } else if (oldPropertyParent.isNodeListProperty()) { - if (!oldPropertyParent.isDefaultProperty() && oldPropertyParent.toNodeListProperty().toModelNodeList().size() == 0) { + if (!oldPropertyParent.isDefaultProperty() && oldPropertyParent.toNodeListProperty().toModelNodeList().size() == 0) schedule(new RemovePropertyRewriteAction(oldPropertyParent)); - } else { + else schedule(new RemoveNodeRewriteAction(node)); - } } else { schedule(new RemoveNodeRewriteAction(node)); } @@ -253,9 +251,8 @@ void ModelToTextMerger::applyChanges() for (int i = 0; i < m_rewriteActions.size(); ++i) { RewriteAction* action = m_rewriteActions.at(i); - if (DebugRewriteActions) { + if (DebugRewriteActions) qDebug() << "Next rewrite action:" << qPrintable(action->info()); - } ModelNodePositionStorage *positionStore = m_rewriterView->positionStorage(); bool success = action->execute(refactoring, *positionStore); diff --git a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h index ca910dd674..d12481edb2 100644 --- a/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h +++ b/src/plugins/qmldesigner/designercore/model/modeltotextmerger.h @@ -30,7 +30,7 @@ #ifndef MODELTOTEXTMERGER_H #define MODELTOTEXTMERGER_H -#include "corelib_global.h" +#include "qmldesignercorelib_global.h" #include <modelnode.h> #include "abstractview.h" #include "nodeabstractproperty.h" @@ -46,7 +46,7 @@ namespace QmlDesigner { -class CORESHARED_EXPORT RewriterView; +class RewriterView; namespace Internal { diff --git a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp index 1f2bfafde3..9916a186ce 100644 --- a/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodelistproperty.cpp @@ -76,9 +76,8 @@ const QList<ModelNode> NodeListProperty::toModelNodeList() const if (internalNode()->hasProperty(name())) { Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); - if (internalProperty->isNodeListProperty()) { + if (internalProperty->isNodeListProperty()) return internalNodesToModelNodes(internalProperty->toNodeListProperty()->nodeList(), model(), view()); - } } return QList<ModelNode>(); diff --git a/src/plugins/qmldesigner/designercore/model/painteventfilter.cpp b/src/plugins/qmldesigner/designercore/model/painteventfilter.cpp index b7a48298c5..bf88ee9c8a 100644 --- a/src/plugins/qmldesigner/designercore/model/painteventfilter.cpp +++ b/src/plugins/qmldesigner/designercore/model/painteventfilter.cpp @@ -46,7 +46,7 @@ PaintEventFilter::PaintEventFilter(QObject *parent) bool PaintEventFilter::eventFilter(QObject *object, QEvent *event) { - switch(event->type()) + switch (event->type()) { case QEvent::Paint : { diff --git a/src/plugins/qmldesigner/designercore/model/paster.cpp b/src/plugins/qmldesigner/designercore/model/paster.cpp index 52f0662e8e..17c2fb4794 100644 --- a/src/plugins/qmldesigner/designercore/model/paster.cpp +++ b/src/plugins/qmldesigner/designercore/model/paster.cpp @@ -69,9 +69,8 @@ public: Node::accept(sourceAST->imports, this); - if (sourceAST->members && sourceAST->members->member) { + if (sourceAST->members && sourceAST->members->member) visitRootMember(sourceAST->members->member); - } return m_locations.isEmpty(); } @@ -136,18 +135,16 @@ protected: switchStateName(prevStateName); return false; } else if (ast->qualifiedTypeNameId && ast->qualifiedTypeNameId->name && ast->qualifiedTypeNameId->name->asString() == "PropertyChanges") { - if (m_locations.remove(toLocation(start, end))) { + if (m_locations.remove(toLocation(start, end))) m_paster->addNodeState(m_stateName, textAt(start, end)); - } return false; } else { return true; } } else { - if (m_locations.remove(toLocation(start, end))) { + if (m_locations.remove(toLocation(start, end))) m_paster->addNode(textAt(start, end)); - } return false; } @@ -171,9 +168,8 @@ protected: bool visit(UiScriptBinding *ast) { if (m_inStates && ast->qualifiedId && ast->qualifiedId->name && ast->qualifiedId->name->asString() == "name") { if (ExpressionStatement *stmt = AST::cast<ExpressionStatement *>(ast->statement)) { - if (StringLiteral * str = AST::cast<StringLiteral *>(stmt->expression)) { + if (StringLiteral * str = AST::cast<StringLiteral *>(stmt->expression)) m_stateName = str->value->asString(); - } } } diff --git a/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp index ff86eb6c4c..0a1112a0a5 100644 --- a/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp @@ -154,11 +154,10 @@ void PlainTextEditModifier::commitGroup() void PlainTextEditModifier::textEditChanged() { - if (!m_ongoingTextChange && m_changeSignalsEnabled) { + if (!m_ongoingTextChange && m_changeSignalsEnabled) emit textChanged(); - } else { + else m_pendingChangeSignal = true; - } } void PlainTextEditModifier::runRewriting(ChangeSet *changeSet) diff --git a/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp b/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp index c3b199cacc..54750f79e5 100644 --- a/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertycontainer.cpp @@ -115,6 +115,15 @@ QDataStream &operator>>(QDataStream &stream, PropertyContainer &propertyContaine return stream; } +QDebug operator<<(QDebug debug, const PropertyContainer &propertyContainer) +{ + debug << propertyContainer.m_name; + debug << propertyContainer.m_type; + debug << propertyContainer.m_value; + + return debug.space(); +} + QDataStream &operator<<(QDataStream &stream, const QList<PropertyContainer> &propertyContainerList) { stream << propertyContainerList.count(); @@ -129,7 +138,7 @@ QDataStream &operator>>(QDataStream &stream, QList<PropertyContainer> &propertyC int count; stream >> count; Q_ASSERT(count >= 0); - for( int i = 0; i < count; i++) { + for ( int i = 0; i < count; i++) { PropertyContainer propertyContainer; stream >> propertyContainer; propertyContainerList.append(propertyContainer); @@ -138,6 +147,14 @@ QDataStream &operator>>(QDataStream &stream, QList<PropertyContainer> &propertyC return stream; } +QDebug operator<<(QDebug debug, QList<PropertyContainer> &propertyContainerList) +{ + foreach (const PropertyContainer &propertyContainer, propertyContainerList) + debug << propertyContainer; + + return debug.space(); +} + } //namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/propertyparser.cpp b/src/plugins/qmldesigner/designercore/model/propertyparser.cpp index bd43fa68de..c03f244072 100644 --- a/src/plugins/qmldesigner/designercore/model/propertyparser.cpp +++ b/src/plugins/qmldesigner/designercore/model/propertyparser.cpp @@ -59,8 +59,8 @@ static uchar fromHex(const uchar c, const uchar c2) static uchar fromHex(const QString &s, int idx) { - uchar c = s.at(idx).toAscii(); - uchar c2 = s.at(idx + 1).toAscii(); + uchar c = s.at(idx).toLatin1(); + uchar c2 = s.at(idx + 1).toLatin1(); return fromHex(c, c2); } @@ -191,7 +191,7 @@ QVariant read(const QString &typeStr, const QString &str, const MetaInfo &) QVariant read(const QString &typeStr, const QString &str) { - int type = QMetaType::type(typeStr.toAscii().constData()); + int type = QMetaType::type(typeStr.toLatin1().constData()); if (type == 0) { qWarning() << "Type " << typeStr << " is unknown to QMetaType system. Cannot create properly typed QVariant for value " diff --git a/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp b/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp index a2565e7e30..6b2e3cc362 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp @@ -69,25 +69,24 @@ bool AnchorLine::isVerticalAnchorLine(Type anchorline) static AnchorLine::Type propertyNameToLineType(const QString & string) { - if (string == QLatin1String("left")) { + if (string == QLatin1String("left")) return AnchorLine::Left; - } else if (string == QLatin1String("top")) { + else if (string == QLatin1String("top")) return AnchorLine::Top; - } else if (string == QLatin1String("right")) { + else if (string == QLatin1String("right")) return AnchorLine::Right; - } else if (string == QLatin1String("bottom")) { + else if (string == QLatin1String("bottom")) return AnchorLine::Bottom; - } else if (string == QLatin1String("horizontalCenter")) { + else if (string == QLatin1String("horizontalCenter")) return AnchorLine::HorizontalCenter; - } else if (string == QLatin1String("verticalCenter")) { + else if (string == QLatin1String("verticalCenter")) return AnchorLine::VerticalCenter; - } else if (string == QLatin1String("baseline")) { + else if (string == QLatin1String("baseline")) return AnchorLine::VerticalCenter; - } else if (string == QLatin1String("centerIn")) { + else if (string == QLatin1String("centerIn")) return AnchorLine::Center; - } else if (string == QLatin1String("fill")) { + else if (string == QLatin1String("fill")) return AnchorLine::Fill; - } return AnchorLine::Invalid; } diff --git a/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp b/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp index 8603b9ae69..2e4773f163 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlchangeset.cpp @@ -37,11 +37,10 @@ namespace QmlDesigner { ModelNode QmlModelStateOperation::target() const { - if (modelNode().property("target").isBindingProperty()) { + if (modelNode().property("target").isBindingProperty()) return modelNode().bindingProperty("target").resolveToModelNode(); - } else { + else return ModelNode(); //exception? - } } void QmlModelStateOperation::setTarget(const ModelNode &target) @@ -56,7 +55,9 @@ bool QmlPropertyChanges::isValid() const bool QmlModelStateOperation::isValid() const { - return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isSubclassOf("<cpp>.QDeclarativeStateOperation", -1, -1); + return QmlModelNodeFacade::isValid() && ( + modelNode().metaInfo().isSubclassOf("<cpp>.QDeclarative1StateOperation", -1, -1) + || modelNode().metaInfo().isSubclassOf("<cpp>.QDeclarativeStateOperation", -1, -1)); } void QmlPropertyChanges::removeProperty(const QString &name) diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 5c47e5474b..3e41936cf9 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -29,7 +29,6 @@ #include "qmlitemnode.h" #include <metainfo.h> -#include <QDeclarativeView> #include "qmlchangeset.h" #include "variantproperty.h" #include "nodeproperty.h" @@ -328,7 +327,7 @@ QmlModelState QmlModelStateGroup::addState(const QString &name) PropertyListType propertyList; propertyList.append(qMakePair(QString("name"), QVariant(name))); - ModelNode newState = modelNode().view()->createModelNode("QtQuick.State", 1, 0, propertyList); + ModelNode newState = QmlObjectNode(modelNode()).qmlModelView()->createQmlState(propertyList); modelNode().nodeListProperty("states").reparentHere(newState); return newState; diff --git a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp index 03f3a30ae2..868327344a 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlmodelview.cpp @@ -45,8 +45,9 @@ #include "rewriterview.h" #include "plaintexteditmodifier.h" #include "modelmerger.h" -#include "modelnodecontextmenu.h" +#include "nodemetainfo.h" +#include <utils/qtcassert.h> namespace QmlDesigner { @@ -110,7 +111,7 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c RewriterTransaction transaction = beginRewriterTransaction(); { const QString newImportUrl = QLatin1String("QtQuick"); - const QString newImportVersion = QLatin1String("1.0"); + const QString newImportVersion = QLatin1String("1.1"); Import newImport = Import::createLibraryImport(newImportUrl, newImportVersion); foreach (const Import &import, model()->imports()) { @@ -123,9 +124,8 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c } } - if (!model()->imports().contains(newImport)) { + if (!model()->imports().contains(newImport)) model()->changeImports(QList<Import>() << newImport, QList<Import>()); - } QList<QPair<QString, QVariant> > propertyPairList; propertyPairList.append(qMakePair(QString("x"), QVariant( round(position.x(), 4)))); @@ -140,7 +140,7 @@ QmlItemNode QmlModelView::createQmlItemNodeFromImage(const QString &imageName, c } propertyPairList.append(qMakePair(QString("source"), QVariant(relativeImageName))); - newNode = createQmlItemNode("QtQuick.Image", 1, 0, propertyPairList); + newNode = createQmlItemNode("QtQuick.Image", -1, -1, propertyPairList); parentNode.nodeAbstractProperty("data").reparentHere(newNode); Q_ASSERT(newNode.isValid()); @@ -179,6 +179,12 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE try { RewriterTransaction transaction = beginRewriterTransaction(); + + NodeMetaInfo metaInfo = model()->metaInfo(itemLibraryEntry.typeName()); + + int minorVersion = metaInfo.minorVersion(); + int majorVersion = metaInfo.majorVersion(); + if (itemLibraryEntry.typeName().contains('.')) { const QString newImportUrl = itemLibraryEntry.requiredImport(); @@ -197,9 +203,8 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE } } - if (!model()->hasImport(newImport, true, true)) { + if (!model()->hasImport(newImport, true, true)) model()->changeImports(QList<Import>() << newImport, QList<Import>()); - } } } @@ -211,7 +216,7 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE foreach (const PropertyContainer &property, itemLibraryEntry.properties()) propertyPairList.append(qMakePair(property.name(), property.value())); - newNode = createQmlItemNode(itemLibraryEntry.typeName(), itemLibraryEntry.majorVersion(), itemLibraryEntry.minorVersion(), propertyPairList); + newNode = createQmlItemNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList); } else { QScopedPointer<Model> inputModel(Model::create("QtQuick.Rectangle", 1, 0, model())); inputModel->setFileUrl(model()->fileUrl()); @@ -224,7 +229,7 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, 0)); rewriterView->setCheckSemanticErrors(false); rewriterView->setTextModifier(&modifier); - inputModel->attachView(rewriterView.data()); + inputModel->setRewriterView(rewriterView.data()); if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { ModelNode rootModelNode = rewriterView->rootModelNode(); @@ -234,13 +239,12 @@ QmlItemNode QmlModelView::createQmlItemNode(const ItemLibraryEntry &itemLibraryE rootModelNode.variantProperty("y") = propertyPairList.at(1).second; ModelMerger merger(this); - newNode = merger.insertModel(rootModelNode); + newNode = merger.insertModel(rootModelNode); } } - if (parentNode.hasDefaultProperty()) { + if (parentNode.hasDefaultProperty()) parentNode.nodeAbstractProperty(parentNode.defaultProperty()).reparentHere(newNode); - } if (!newNode.isValid()) return newNode; @@ -424,13 +428,6 @@ void QmlModelView::nodeSourceChanged(const ModelNode &, const QString & /*newNod } -void QmlModelView::showContextMenu(const QPoint &globalPos, const QPoint &scenePos, bool showSelection) -{ - ModelNodeContextMenu contextMenu(this); - contextMenu.setScenePos(scenePos); - contextMenu.execute(globalPos, showSelection); -} - void QmlModelView::rewriterBeginTransaction() { @@ -473,5 +470,16 @@ void QmlModelView::otherPropertyChanged(const QmlObjectNode &/*qmlObjectNode*/, { } +ModelNode QmlModelView::createQmlState(const QmlDesigner::PropertyListType &propertyList) +{ + + QTC_CHECK(rootModelNode().majorQtQuickVersion() < 3); + + if (rootModelNode().majorQtQuickVersion() > 1) + return createModelNode("QtQuick.State", 2, 0, propertyList); + else + return createModelNode("QtQuick.State", 1, 0, propertyList); +} + } //QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 8f5b53b924..3d0af0bb6a 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -96,7 +96,7 @@ instanciated instance of this object. */ QVariant QmlObjectNode::instanceValue(const QString &name) const -{ +{ return nodeInstance().property(name); } @@ -356,7 +356,7 @@ QList<ModelNode> toModelNodeList(const QList<QmlObjectNode> &fxObjectNodeList) { QList<ModelNode> modelNodeList; - foreach(const QmlObjectNode &fxObjectNode, fxObjectNodeList) + foreach (const QmlObjectNode &fxObjectNode, fxObjectNodeList) modelNodeList.append(fxObjectNode.modelNode()); return modelNodeList; @@ -366,7 +366,7 @@ QList<QmlObjectNode> toQmlObjectNodeList(const QList<ModelNode> &modelNodeList) { QList<QmlObjectNode> qmlObjectNodeList; - foreach(const ModelNode &modelNode, modelNodeList) { + foreach (const ModelNode &modelNode, modelNodeList) { QmlObjectNode objectNode(modelNode); if (objectNode.isValid()) qmlObjectNodeList.append(objectNode); @@ -464,9 +464,8 @@ QString QmlObjectNode::defaultProperty() const void QmlObjectNode::setParent(QmlObjectNode newParent) { - if (newParent.hasDefaultProperty()) { + if (newParent.hasDefaultProperty()) newParent.modelNode().nodeAbstractProperty(newParent.defaultProperty()).reparentHere(modelNode()); - } } QmlItemNode QmlObjectNode::toQmlItemNode() const diff --git a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp index 9d183991b5..ba6ce14543 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlstate.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlstate.cpp @@ -118,7 +118,7 @@ bool QmlModelState::hasPropertyChanges(const ModelNode &node) const if (isBaseState()) return false; - foreach(const QmlPropertyChanges &changeSet, propertyChanges()) { + foreach (const QmlPropertyChanges &changeSet, propertyChanges()) { if (changeSet.target().isValid() && changeSet.target() == node) return true; } @@ -132,7 +132,7 @@ bool QmlModelState::hasStateOperation(const ModelNode &node) const if (isBaseState()) return false; - foreach(const QmlModelStateOperation &stateOperation, stateOperations()) { + foreach (const QmlModelStateOperation &stateOperation, stateOperations()) { if (stateOperation.target() == node) return true; } @@ -173,11 +173,15 @@ void QmlModelState::addChangeSetIfNotExists(const ModelNode &node) if (!isValid()) throw new InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - if (hasPropertyChanges(node)) { + if (hasPropertyChanges(node)) return; //changeSet already there - } - ModelNode newChangeSet = modelNode().view()->createModelNode("QtQuick.PropertyChanges", 1, 0); + ModelNode newChangeSet; + if (qmlModelView()->rootModelNode().majorQtQuickVersion() > 1) + newChangeSet = modelNode().view()->createModelNode("QtQuick.PropertyChanges", 2, 0); + else + newChangeSet = modelNode().view()->createModelNode("QtQuick.PropertyChanges", 1, 0); + modelNode().nodeListProperty("changes").reparentHere(newChangeSet); QmlPropertyChanges(newChangeSet).setTarget(node); @@ -244,7 +248,7 @@ bool QmlModelState::isValid() const { return QmlModelNodeFacade::isValid() && modelNode().metaInfo().isValid() && - (modelNode().metaInfo().isSubclassOf("QtQuick.State", 1, 0) || isBaseState()); + (modelNode().metaInfo().isSubclassOf("QtQuick.State", -1, -1) || isBaseState()); } /** @@ -278,7 +282,7 @@ QmlModelState QmlModelState::duplicate(const QString &name) const // QmlModelState newState(stateGroup().addState(name)); PropertyListType propertyList; propertyList.append(qMakePair(QString("name"), QVariant(name))); - QmlModelState newState ( qmlModelView()->createModelNode("QtQuick.State", 1, 0, propertyList) ); + QmlModelState newState ( qmlModelView()->createQmlState(propertyList) ); foreach (const ModelNode &childNode, modelNode().nodeListProperty("changes").toModelNodeList()) { ModelNode newModelNode(qmlModelView()->createModelNode(childNode.type(), childNode.majorVersion(), childNode.minorVersion())); diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index 39db7c9710..08cc254a4d 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -54,8 +54,12 @@ inline static QString properColorName(const QColor &color) inline static QString doubleToString(double d) { QString string = QString::number(d, 'f', 3); - if (string.endsWith(".000")) - string.chop(4); + if (string.contains(QLatin1Char('.'))) { + while (string.at(string.length()- 1) == QLatin1Char('0')) + string.chop(1); + if (string.at(string.length()- 1) == QLatin1Char('.')) + string.chop(1); + } return string; } diff --git a/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp b/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp index 183eadb167..608c6b9327 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriteactioncompressor.cpp @@ -306,13 +306,11 @@ void RewriteActionCompressor::compressAddEditActions(QList<RewriteAction *> &act dirtyActions.insert(action); } } else if (ChangeIdRewriteAction *changeIdAction = action->asChangeIdRewriteAction()) { - if (nodeOrParentInSet(changeIdAction->node(), addedNodes)) { + if (nodeOrParentInSet(changeIdAction->node(), addedNodes)) actionsToRemove.append(action); - } } else if (ChangeTypeRewriteAction *changeTypeAction = action->asChangeTypeRewriteAction()) { - if (nodeOrParentInSet(changeTypeAction->node(), addedNodes)) { + if (nodeOrParentInSet(changeTypeAction->node(), addedNodes)) actionsToRemove.append(action); - } } } @@ -337,9 +335,8 @@ void RewriteActionCompressor::compressAddEditActions(QList<RewriteAction *> &act } const int idx = actions.indexOf(action); - if (newAction && idx >= 0) { + if (newAction && idx >= 0) actions[idx] = newAction; - } } } @@ -355,11 +352,10 @@ void RewriteActionCompressor::compressAddReparentActions(QList<RewriteAction *> if (action->asAddPropertyRewriteAction() || action->asChangePropertyRewriteAction()) { ModelNode containedNode; - if (AddPropertyRewriteAction *addAction = action->asAddPropertyRewriteAction()) { + if (AddPropertyRewriteAction *addAction = action->asAddPropertyRewriteAction()) containedNode = addAction->containedModelNode(); - } else if (ChangePropertyRewriteAction *changeAction = action->asChangePropertyRewriteAction()) { + else if (ChangePropertyRewriteAction *changeAction = action->asChangePropertyRewriteAction()) containedNode = changeAction->containedModelNode(); - } if (!containedNode.isValid()) continue; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index a069ef5b9a..4014ffe549 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -107,7 +107,7 @@ QString RewriterView::Error::toString() const str += tr("line %1").arg(line()); } - if(column() != -1) { + if (column() != -1) { if (!str.isEmpty()) str += QLatin1Char(' '); @@ -155,9 +155,8 @@ void RewriterView::modelAttached(Model *model) ModelAmender differenceHandler(m_textToModelMerger.data()); const QString qmlSource = m_textModifier->text(); - if (m_textToModelMerger->load(qmlSource, differenceHandler)) { + if (m_textToModelMerger->load(qmlSource, differenceHandler)) lastCorrectQmlSource = qmlSource; - } } void RewriterView::modelAboutToBeDetached(Model * /*model*/) @@ -473,6 +472,16 @@ QString RewriterView::textModifierContent() const return QString(); } +void RewriterView::reactivateTextMofifierChangeSignals() +{ + textModifier()->reactivateChangeSignals(); +} + +void RewriterView::deactivateTextMofifierChangeSignals() +{ + textModifier()->deactivateChangeSignals(); +} + void RewriterView::applyModificationGroupChanges() { Q_ASSERT(transactionLevel == 0); @@ -493,11 +502,12 @@ void RewriterView::applyChanges() throw RewritingException(__LINE__, __FUNCTION__, __FILE__, "RewriterView::applyChanges() already in error state", content); } + m_differenceHandling = Validate; + try { modelToTextMerger()->applyChanges(); - if (!errors().isEmpty()) { + if (!errors().isEmpty()) enterErrorState(errors().first().description()); - } } catch (Exception &e) { const QString content = textModifierContent(); qDebug() << "RewriterException:" << m_rewritingErrorMessage; @@ -505,6 +515,8 @@ void RewriterView::applyChanges() enterErrorState(e.description()); } + m_differenceHandling = Amend; + if (inErrorState()) { const QString content = textModifierContent(); qDebug() << "RewriterException:" << m_rewritingErrorMessage; @@ -613,6 +625,31 @@ bool RewriterView::modificationGroupActive() return m_modificationGroupActive; } +static bool isInNodeDefinition(int nodeTextOffset, int nodeTextLength, int cursorPosition) +{ + return (nodeTextOffset <= cursorPosition) && (nodeTextOffset + nodeTextLength > cursorPosition); +} + +ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const +{ + const QList<ModelNode> allNodes = allModelNodes(); + + ModelNode nearestNode; + int nearestNodeTextOffset = -1; + + foreach (const ModelNode ¤tNode, allNodes) { + const int nodeTextOffset = nodeOffset(currentNode); + const int nodeTextLength = nodeLength(currentNode); + if (isInNodeDefinition(nodeTextOffset, nodeTextLength, cursorPosition) + && (nodeTextOffset > nearestNodeTextOffset)) { + nearestNode = currentNode; + nearestNodeTextOffset = nodeTextOffset; + } + } + + return nearestNode; +} + bool RewriterView::renameId(const QString& oldId, const QString& newId) { if (textModifier()) @@ -677,6 +714,29 @@ QString RewriterView::convertTypeToImportAlias(const QString &type) const return result; } +QString RewriterView::pathForImport(const Import &import) +{ + if (scopeChain() && scopeChain()->context() && document()) { + const QString importStr = import.isFileImport() ? import.file() : import.url(); + const QmlJS::Imports *imports = scopeChain()->context()->imports(document()); + + QmlJS::ImportInfo importInfo; + + foreach (QmlJS::Import qmljsImport, imports->all()) { + if (qmljsImport.info.name() == importStr) + importInfo = qmljsImport.info; + } + const QString importPath = importInfo.path(); + return importPath; + } + + return QString(); +} + +QWidget *RewriterView::widget() +{ + return 0; +} void RewriterView::qmlTextChanged() { @@ -695,9 +755,8 @@ void RewriterView::qmlTextChanged() switch (m_differenceHandling) { case Validate: { ModelValidator differenceHandler(m_textToModelMerger.data()); - if (m_textToModelMerger->load(newQmlText.toUtf8(), differenceHandler)) { + if (m_textToModelMerger->load(newQmlText.toUtf8(), differenceHandler)) lastCorrectQmlSource = newQmlText; - } break; } @@ -705,9 +764,8 @@ void RewriterView::qmlTextChanged() default: { emitCustomNotification(StartRewriterAmend); ModelAmender differenceHandler(m_textToModelMerger.data()); - if (m_textToModelMerger->load(newQmlText, differenceHandler)) { + if (m_textToModelMerger->load(newQmlText, differenceHandler)) lastCorrectQmlSource = newQmlText; - } emitCustomNotification(EndRewriterAmend); break; } diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 4c425d9a4a..b439d850e5 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -32,6 +32,7 @@ #include "filemanager/firstdefinitionfinder.h" #include "filemanager/objectlengthcalculator.h" #include "filemanager/qmlrefactoring.h" +#include "filemanager/qmlwarningdialog.h" #include "rewriteaction.h" #include "nodeproperty.h" #include "propertyparser.h" @@ -66,7 +67,7 @@ namespace { static inline QStringList supportedVersionsList() { QStringList list; - list << QLatin1String("1.0") << QLatin1String("1.1"); + list << QLatin1String("1.0") << QLatin1String("1.1") << QLatin1String("2.0"); return list; } @@ -138,27 +139,6 @@ static inline QString fixEscapedUnicodeChar(const QString &value) //convert "\u2 } return value; } - -static inline int fixUpMajorVersionForQt(const QString &value, int i) -{ - if (i == 4 && value == "Qt") - return 1; - else return i; -} - -static inline int fixUpMinorVersionForQt(const QString &value, int i) -{ - if (i == 7 && value == "Qt") - return 0; - else return i; -} - -static inline QString fixUpPackeNameForQt(const QString &value) -{ - if (value == "Qt") - return "QtQuick"; - return value; -} static inline bool isSignalPropertyName(const QString &signalName) { @@ -278,15 +258,14 @@ static bool isCustomParserType(const QString &type) static bool isPropertyChangesType(const QString &type) -{ +{ return type == QLatin1String("PropertyChanges") || type == QLatin1String("QtQuick.PropertyChanges") || type == QLatin1String("Qt.PropertyChanges"); } static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &property, const QString &type, QmlDesigner::Model *model) { - if (model->metaInfo(type, -1, -1).isSubclassOf(QLatin1String("QtQuick.Component"), -1, -1) && !isComponentType(type)) { + if (model->metaInfo(type, -1, -1).isSubclassOf(QLatin1String("QtQuick.Component"), -1, -1) && !isComponentType(type)) return false; //If the type is already a subclass of Component keep it - } return property.parentModelNode().isValid() && isComponentType(property.parentModelNode().metaInfo().propertyTypeName(property.name())); @@ -301,16 +280,14 @@ static inline QString extractComponentFromQml(const QString &source) if (source.contains("Component")) { //explicit component QmlDesigner::FirstDefinitionFinder firstDefinitionFinder(source); int offset = firstDefinitionFinder(0); - if (offset < 0) { + if (offset < 0) return QString(); //No object definition found - } QmlDesigner::ObjectLengthCalculator objectLengthCalculator; unsigned length; - if (objectLengthCalculator(source, offset, length)) { + if (objectLengthCalculator(source, offset, length)) result = source.mid(offset, length); - } else { + else result = source; - } } else { result = source; //implicit component } @@ -357,11 +334,10 @@ public: const CppComponentValue * qmlValue = value_cast<CppComponentValue>(value); if (qmlValue) { - typeName = fixUpPackeNameForQt(qmlValue->moduleName()) + QLatin1String(".") + qmlValue->className(); + typeName = qmlValue->moduleName() + QLatin1String(".") + qmlValue->className(); - //### todo this is just a hack to support QtQuick 1.0 - majorVersion = fixUpMajorVersionForQt(qmlValue->moduleName(), qmlValue->componentVersion().majorVersion()); - minorVersion = fixUpMinorVersionForQt(qmlValue->moduleName(), qmlValue->componentVersion().minorVersion()); + majorVersion = qmlValue->componentVersion().majorVersion(); + minorVersion = qmlValue->componentVersion().minorVersion(); } else { for (UiQualifiedId *iter = astTypeNode; iter; iter = iter->next) if (!iter->next && !iter->name.isEmpty()) @@ -550,20 +526,25 @@ public: } } - QVariant v(cleanedValue); + if (property->asColorValue()) + return PropertyParser::read(QVariant::Color, cleanedValue); + else if (property->asUrlValue()) + return PropertyParser::read(QVariant::Url, cleanedValue); + + QVariant value(cleanedValue); if (property->asBooleanValue()) { - v.convert(QVariant::Bool); - } else if (property->asColorValue()) { - v.convert(QVariant::Color); + value.convert(QVariant::Bool); + return value; } else if (property->asNumberValue()) { - v.convert(QVariant::Double); + value.convert(QVariant::Double); + return value; } else if (property->asStringValue()) { // nothing to do } else { //property alias et al if (!hasQuotes) return cleverConvert(cleanedValue); } - return v; + return value; } QVariant convertToEnum(Statement *rhs, const QString &propertyPrefix, UiQualifiedId *propertyId) @@ -574,9 +555,8 @@ public: const ObjectValue *containingObject = 0; QString name; - if (!lookupProperty(propertyPrefix, propertyId, 0, &containingObject, &name)) { + if (!lookupProperty(propertyPrefix, propertyId, 0, &containingObject, &name)) return QVariant(); - } if (containingObject) containingObject->lookupMember(name, m_context, &containingObject); @@ -648,16 +628,14 @@ static inline bool smartVeryFuzzyCompare(QVariant value1, QVariant value2) if (!ok1 || !ok2) return false; - if (qFuzzyCompare(a, b)) { + if (qFuzzyCompare(a, b)) return true; - } int ai = qRound(a * 1000); int bi = qRound(b * 1000); - if (qFuzzyCompare((qreal(ai) / 1000), (qreal(bi) / 1000))) { + if (qFuzzyCompare((qreal(ai) / 1000), (qreal(bi) / 1000))) return true; - } } return false; } @@ -762,6 +740,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH m_document = doc; QList<RewriterView::Error> errors; + QList<RewriterView::Error> warnings; foreach (const QmlJS::DiagnosticMessage &diagnosticMessage, ctxt.diagnosticLinkMessages()) { errors.append(RewriterView::Error(diagnosticMessage, QUrl::fromLocalFile(doc->fileName()))); @@ -788,9 +767,26 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH check.disableMessage(StaticAnalysis::ErrPrototypeCycle); check.disableMessage(StaticAnalysis::ErrCouldNotResolvePrototype); check.disableMessage(StaticAnalysis::ErrCouldNotResolvePrototypeOf); + + foreach (StaticAnalysis::Type type, StaticAnalysis::Message::allMessageTypes()) { + StaticAnalysis::Message message(type, AST::SourceLocation()); + if (message.severity == StaticAnalysis::MaybeWarning + || message.severity == StaticAnalysis::Warning) { + check.disableMessage(type); + } + } + + check.enableMessage(StaticAnalysis::WarnImperativeCodeNotEditableInVisualDesigner); + check.enableMessage(StaticAnalysis::WarnUnsupportedTypeInVisualDesigner); + check.enableMessage(StaticAnalysis::WarnReferenceToParentItemNotSupportedByVisualDesigner); + check.enableMessage(StaticAnalysis::WarnUndefinedValueForVisualDesigner); + check.enableMessage(StaticAnalysis::WarnStatesOnlyInRootItemForVisualDesigner); + foreach (const StaticAnalysis::Message &message, check()) { if (message.severity == StaticAnalysis::Error) errors.append(RewriterView::Error(message.toDiagnosticMessage(), QUrl::fromLocalFile(doc->fileName()))); + if (message.severity == StaticAnalysis::Warning) + warnings.append(RewriterView::Error(message.toDiagnosticMessage(), QUrl::fromLocalFile(doc->fileName()))); } if (!errors.isEmpty()) { @@ -798,6 +794,27 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH setActive(false); return false; } + + if (!warnings.isEmpty() && differenceHandler.isValidator()) { + + QString title = QCoreApplication::translate("QmlDesigner::TextToModelMerger warning message", "This .qml file contains features" + "which are not supported by Qt Quick Designer"); + + QStringList message; + + foreach (const RewriterView::Error &warning, warnings) { + QString string = QLatin1String("Line: ") + QString::number(warning.line()) + QLatin1String(": ") + warning.description(); + //string += QLatin1String(" <a href=\"") + QString::number(warning.line()) + QLatin1String("\">Go to error</a>") + QLatin1String("<p>"); + message << string; + } + + QmlWarningDialog warningDialog(0, message); + if (warningDialog.warningsEnabled() && warningDialog.exec()) { + m_rewriterView->setErrors(warnings); + setActive(false); + return false; + } + } } UiObjectMember *astRootNode = 0; @@ -929,11 +946,10 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, QString name; if (context->lookupProperty(QString(), binding->qualifiedId, &propertyType, &containingObject, &name) || isPropertyChangesType(typeName)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); - if (context->isArrayProperty(propertyType, containingObject, name)) { + if (context->isArrayProperty(propertyType, containingObject, name)) syncArrayProperty(modelProperty, QList<QmlJS::AST::UiObjectMember*>() << member, context, differenceHandler); - } else { + else syncNodeProperty(modelProperty, binding, context, differenceHandler); - } modelPropertyNames.remove(astPropertyName); } else { qWarning() << "Skipping invalid node property" << astPropertyName @@ -1406,11 +1422,10 @@ void ModelAmender::bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &javascript, const QString &astType) { - if (astType.isEmpty()) { + if (astType.isEmpty()) modelProperty.setExpression(javascript); - } else { + else modelProperty.setDynamicTypeNameAndExpression(astType, javascript); - } } void ModelAmender::shouldBeBindingProperty(AbstractProperty &modelProperty, @@ -1419,11 +1434,10 @@ void ModelAmender::shouldBeBindingProperty(AbstractProperty &modelProperty, { ModelNode theNode = modelProperty.parentModelNode(); BindingProperty newModelProperty = theNode.bindingProperty(modelProperty.name()); - if (astType.isEmpty()) { + if (astType.isEmpty()) newModelProperty.setExpression(javascript); - } else { + else newModelProperty.setDynamicTypeNameAndExpression(astType, javascript); - } } void ModelAmender::shouldBeNodeListProperty(AbstractProperty &modelProperty, @@ -1543,7 +1557,7 @@ ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProp modelProperty.reparentHere(newNode); } else { //The default property could a NodeProperty implicitly (delegate:) modelProperty.parentModelNode().removeProperty(modelProperty.name()); - modelProperty.reparentHere(newNode); + modelProperty.reparentHere(newNode); } } else { modelProperty.reparentHere(newNode); @@ -1611,9 +1625,8 @@ void TextToModelMerger::setupComponent(const ModelNode &node) QString result = extractComponentFromQml(componentText); - if (result.isEmpty()) { + if (result.isEmpty()) return; //No object definition found - } if (node.nodeSource() != result) ModelNode(node).setNodeSource(result); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 6e304247d6..2299f8e9c6 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -30,7 +30,7 @@ #ifndef TEXTTOMODELMERGER_H #define TEXTTOMODELMERGER_H -#include "corelib_global.h" +#include "qmldesignercorelib_global.h" #include "import.h" #include "nodelistproperty.h" #include "modelnode.h" @@ -43,7 +43,7 @@ namespace QmlDesigner { -class CORESHARED_EXPORT RewriterView; +class RewriterView; namespace Internal { diff --git a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp index 801081a334..a8418b5e8f 100644 --- a/src/plugins/qmldesigner/designercore/model/variantproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/variantproperty.cpp @@ -102,9 +102,8 @@ void VariantProperty::setDynamicTypeNameAndValue(const QString &type, const QVar throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); - if (type.isEmpty()) { + if (type.isEmpty()) throw InvalidArgumentException(__LINE__, __FUNCTION__, __FILE__, name()); - } if (internalNode()->hasProperty(name())) { //check if oldValue != value Internal::InternalProperty::Pointer internalProperty = internalNode()->property(name()); diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp index 7db3c3a025..584ff80b2e 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.cpp @@ -31,6 +31,7 @@ #include <QDebug> #include <QTemporaryFile> #include <QDir> +#include <QUrl> #include <variantproperty.h> #include <bindingproperty.h> #include <nodeabstractproperty.h> @@ -64,23 +65,24 @@ QString ViewLogger::time() const ViewLogger::ViewLogger(QObject *parent) : AbstractView(parent) { - const QString path = QDir::tempPath() + QString("/qmldesigner-logger-%1-XXXXXX.txt"). + m_timer.start(); +} + +void ViewLogger::modelAttached(Model *model) +{ + static const QString path = QDir::tempPath() + QString("/qmldesigner-logger-%1-XXXXXX.txt"). arg(QDateTime::currentDateTime().toString(Qt::ISODate). replace(':', '-')); - QTemporaryFile *temporaryFile = new QTemporaryFile(path, this); + static QTemporaryFile *temporaryFile = new QTemporaryFile(path, this); temporaryFile->setAutoRemove(false); - if (temporaryFile->open()) { + static bool fileOpen = temporaryFile->open(); + if (fileOpen) { qDebug() << "QmlDesigner: Log file is:" << temporaryFile->fileName(); m_output.setDevice(temporaryFile); } else { qDebug() << "QmlDesigner: failed to open:" << temporaryFile->fileName(); } - m_timer.start(); -} - -void ViewLogger::modelAttached(Model *model) -{ m_output << time() << indent("modelAttached:") << model << endl; AbstractView::modelAttached(model); } @@ -139,14 +141,14 @@ void ViewLogger::propertiesRemoved(const QList<AbstractProperty> &propertyList) void ViewLogger::variantPropertiesChanged(const QList<VariantProperty>& propertyList, PropertyChangeFlags propertyChange) { m_output << time() << indent("variantPropertiesChanged:") << serialize(propertyChange) << endl; - foreach(const VariantProperty &property, propertyList) + foreach (const VariantProperty &property, propertyList) m_output << time() << indent() << property << endl; } void ViewLogger::bindingPropertiesChanged(const QList<BindingProperty>& propertyList, PropertyChangeFlags propertyChange) { m_output << time() << indent("bindingPropertiesChanged:") << serialize(propertyChange) << endl; - foreach(const BindingProperty &property, propertyList) + foreach (const BindingProperty &property, propertyList) m_output << time() << indent() << property << endl; } @@ -159,9 +161,9 @@ void ViewLogger::selectedNodesChanged(const QList<ModelNode> &selectedNodeList, const QList<ModelNode> &lastSelectedNodeList) { m_output << time() << indent("selectedNodesChanged:") << endl; - foreach(const ModelNode &node, selectedNodeList) + foreach (const ModelNode &node, selectedNodeList) m_output << time() << indent("new: ") << node << endl; - foreach(const ModelNode &node, lastSelectedNodeList) + foreach (const ModelNode &node, lastSelectedNodeList) m_output << time() << indent("old: ") << node << endl; } @@ -183,18 +185,18 @@ void ViewLogger::auxiliaryDataChanged(const ModelNode &node, const QString &name void ViewLogger::importsChanged(const QList<Import> &addedImports, const QList<Import> &removedImports) { m_output << time() << indent("importsChanged:") << endl; - foreach(const Import &import, addedImports) + foreach (const Import &import, addedImports) m_output << time() << indent("import added: ") << import.toString() << endl; - foreach(const Import &import, removedImports) + foreach (const Import &import, removedImports) m_output << time() << indent("import removed: ") << import.toString() << endl; } void ViewLogger::customNotification(const AbstractView *view, const QString &identifier, const QList<ModelNode> &nodeList, const QList<QVariant> &data) { m_output << time() << indent("customNotification:") << view << identifier << endl; - foreach(const ModelNode &node, nodeList) + foreach (const ModelNode &node, nodeList) m_output << time() << indent("node: ") << node << endl; - foreach(const QVariant &variant, data) + foreach (const QVariant &variant, data) m_output << time() << indent("data: ") << variant.toString() << endl; } @@ -208,7 +210,7 @@ void ViewLogger::instancePropertyChange(const QList<QPair<ModelNode, QString> > typedef QPair<ModelNode, QString> PropertyPair; m_output << time() << indent("instancePropertyChange:") << endl; - foreach(const PropertyPair &propertyPair, propertyList) + foreach (const PropertyPair &propertyPair, propertyList) m_output << time() << indent("property: ") << propertyPair.first << propertyPair.second << endl; } @@ -216,7 +218,7 @@ void ViewLogger::instancesCompleted(const QVector<ModelNode> &completedNodeList) { m_output << time() << indent("instancesCompleted:") << endl; - foreach(const ModelNode &node, completedNodeList) + foreach (const ModelNode &node, completedNodeList) m_output << time() << indent("node: ") << node << endl; } @@ -237,7 +239,7 @@ void ViewLogger::instancesRenderImageChanged(const QVector<ModelNode> &nodeList) { m_output << time() << indent("instancesRenderImageChanged:") << endl; - foreach(const ModelNode &node, nodeList) + foreach (const ModelNode &node, nodeList) m_output << time() << indent("node: ") << node << endl; } @@ -245,7 +247,7 @@ void ViewLogger::instancesPreviewImageChanged(const QVector<ModelNode> &nodeList { m_output << time() << indent("instancesPreviewImageChanged:") << endl; - foreach(const ModelNode &node, nodeList) + foreach (const ModelNode &node, nodeList) m_output << time() << indent("node: ") << node << endl; } @@ -253,7 +255,7 @@ void ViewLogger::instancesChildrenChanged(const QVector<ModelNode> &nodeList) { m_output << time() << indent("instancesChildrenChanged:") << endl; - foreach(const ModelNode &node, nodeList) + foreach (const ModelNode &node, nodeList) m_output << time() << indent("node: ") << node << endl; } @@ -284,5 +286,10 @@ void ViewLogger::actualStateChanged(const ModelNode &node) { m_output << time() << indent("actualStateChanged:") << node << endl; } + +QWidget *ViewLogger::widget() +{ + return 0; +} } // namespace Internal } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/viewlogger.h b/src/plugins/qmldesigner/designercore/model/viewlogger.h index 0ca17dad41..58ca0c167c 100644 --- a/src/plugins/qmldesigner/designercore/model/viewlogger.h +++ b/src/plugins/qmldesigner/designercore/model/viewlogger.h @@ -42,7 +42,7 @@ class ViewLogger : public QmlDesigner::AbstractView { Q_OBJECT public: - ViewLogger(QObject *parent); + ViewLogger(QObject *parent = 0); void modelAttached(Model *model); void modelAboutToBeDetached(Model *model); @@ -87,6 +87,8 @@ public: void actualStateChanged(const ModelNode &node); + QWidget *widget(); + protected: QString time() const; diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp new file mode 100644 index 0000000000..24eda7730d --- /dev/null +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -0,0 +1,201 @@ +#include "viewmanager.h" + +#include "designdocument.h" +#include "componentaction.h" +#include "itemlibrarywidget.h" +#include "designmodewidget.h" +#include "formeditorwidget.h" +#include "toolbox.h" +#include "designeractionmanager.h" + +#include <qmldesigner/qmldesignerplugin.h> + +#include <utils/crumblepath.h> +#include <qtsupport/baseqtversion.h> +#include <qtsupport/qtversionmanager.h> +#include <qtsupport/qtsupportconstants.h> + +namespace QmlDesigner { + +ViewManager::ViewManager() +{ + //QObject::connect(&m_nodeInstanceView, SIGNAL(qmlPuppetCrashed()), designModeWidget, SLOT(qmlPuppetCrashed())); + //QObject::connect(m_formEditorView.crumblePath(), SIGNAL(elementClicked(QVariant)), designModeWidget, SLOT(onCrumblePathElementClicked(QVariant))); + m_formEditorView.formEditorWidget()->toolBox()->addLeftSideAction(m_componentView.action()); // ugly hack +} + +DesignDocument *ViewManager::currentDesignDocument() const +{ + return QmlDesignerPlugin::instance()->documentManager().currentDesignDocument(); +} + +QString ViewManager::pathToQt() const +{ + QtSupport::BaseQtVersion *activeQtVersion = QtSupport::QtVersionManager::instance()->version(currentDesignDocument()->qtVersionId()); + if (activeQtVersion && (activeQtVersion->qtVersion() >= QtSupport::QtVersionNumber(4, 7, 1)) + && (activeQtVersion->type() == QLatin1String(QtSupport::Constants::DESKTOPQT) + || activeQtVersion->type() == QLatin1String(QtSupport::Constants::SIMULATORQT))) + return activeQtVersion->qmakeProperty("QT_INSTALL_DATA"); + + return QString(); +} + +void ViewManager::attachNodeInstanceView() +{ + setNodeInstanceViewQtPath(pathToQt()); + currentModel()->setNodeInstanceView(&m_nodeInstanceView); +} + +void ViewManager::attachRewriterView(TextModifier *textModifier) +{ + if (currentDesignDocument()->rewriterView()) { + currentDesignDocument()->rewriterView()->setTextModifier(textModifier); + currentDesignDocument()->rewriterView()->reactivateTextMofifierChangeSignals(); + currentModel()->setRewriterView(currentDesignDocument()->rewriterView()); + } +} + +void ViewManager::detachRewriterView() +{ + if (currentDesignDocument()->rewriterView()) { + currentDesignDocument()->rewriterView()->deactivateTextMofifierChangeSignals(); + currentModel()->setRewriterView(0); + } +} + +void ViewManager::switchStateEditorViewToBaseState() +{ + if (m_statesEditorView.isAttached()) { + m_savedState = m_statesEditorView.currentState(); + m_statesEditorView.setCurrentState(m_statesEditorView.baseState()); + } +} + +void ViewManager::switchStateEditorViewToSavedState() +{ + if (m_savedState.isValid() && m_statesEditorView.isAttached()) + m_statesEditorView.setCurrentState(m_savedState); +} + +void ViewManager::resetPropertyEditorView() +{ + m_propertyEditorView.resetView(); +} + +void ViewManager::detachViewsExceptRewriterAndComponetView() +{ + switchStateEditorViewToBaseState(); + currentModel()->detachView(DesignerActionManager::view()); + currentModel()->detachView(&m_formEditorView); + currentModel()->detachView(&m_navigatorView); + currentModel()->detachView(&m_itemLibraryView); + currentModel()->detachView(&m_statesEditorView); + currentModel()->detachView(&m_propertyEditorView); + currentModel()->setNodeInstanceView(0); + + static bool enableViewLogger = !qgetenv("QTC_ENABLE_QMLDESIGNER_LOGGER").isEmpty(); + if (enableViewLogger) + currentModel()->detachView(&m_viewLogger); +} + +void ViewManager::attachItemLibraryView() +{ + setItemLibraryViewResourcePath(QFileInfo(currentDesignDocument()->fileName()).absolutePath()); + currentModel()->attachView(&m_itemLibraryView); +} + +void ViewManager::attachComponentView() +{ + documentModel()->attachView(&m_componentView); + QObject::connect(m_componentView.action(), SIGNAL(currentComponentChanged(ModelNode)), currentDesignDocument(), SLOT(changeCurrentModelTo(ModelNode))); +} + +void ViewManager::detachComponentView() +{ + QObject::disconnect(m_componentView.action(), SIGNAL(currentComponentChanged(ModelNode)), currentDesignDocument(), SLOT(changeCurrentModelTo(ModelNode))); + documentModel()->detachView(&m_componentView); +} + +void ViewManager::attachViewsExceptRewriterAndComponetView() +{ + static bool enableViewLogger = !qgetenv("QTC_ENABLE_QMLDESIGNER_LOGGER").isEmpty(); + if (enableViewLogger) + currentModel()->attachView(&m_viewLogger); + + attachNodeInstanceView(); + currentModel()->attachView(&m_formEditorView); + currentModel()->attachView(&m_navigatorView); + attachItemLibraryView(); + currentModel()->attachView(&m_statesEditorView); + currentModel()->attachView(&m_propertyEditorView); + currentModel()->attachView(DesignerActionManager::view()); + switchStateEditorViewToSavedState(); +} + +void ViewManager::setItemLibraryViewResourcePath(const QString &resourcePath) +{ + m_itemLibraryView.setResourcePath(resourcePath); +} + +void ViewManager::setComponentNode(const ModelNode &componentNode) +{ + m_componentView.setComponentNode(componentNode); +} + +void ViewManager::setNodeInstanceViewQtPath(const QString &qtPath) +{ + m_nodeInstanceView.setPathToQt(qtPath); +} + +QWidget *ViewManager::formEditorWidget() +{ + return m_formEditorView.widget(); +} + +QWidget *ViewManager::propertyEditorWidget() +{ + return m_propertyEditorView.widget(); +} + +QWidget *ViewManager::itemLibraryWidget() +{ + return m_itemLibraryView.widget(); +} + +QWidget *ViewManager::navigatorWidget() +{ + return m_navigatorView.widget(); +} + +QWidget *ViewManager::statesEditorWidget() +{ + return m_statesEditorView.widget(); +} + +void ViewManager::pushFileOnCrambleBar(const QString &fileName) +{ + m_formEditorView.formEditorWidget()->formEditorCrumbleBar()->pushFile(fileName); +} + +void ViewManager::pushInFileComponentOnCrambleBar(const QString &componentId) + +{ + m_formEditorView.formEditorWidget()->formEditorCrumbleBar()->pushInFileComponent(componentId); +} + +void ViewManager::nextFileIsCalledInternally() +{ + m_formEditorView.formEditorWidget()->formEditorCrumbleBar()->nextFileIsCalledInternally(); +} + +Model *ViewManager::currentModel() const +{ + return currentDesignDocument()->currentModel(); +} + +Model *ViewManager::documentModel() const +{ + return currentDesignDocument()->documentModel(); +} + +} // namespace QmlDesigner |