diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp index 5f2448ab2ed29b84e6cbd2b6220ad66b28455ee0..5e316a810f15d195ce76c5a547be2d9755eea0ab 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.cpp @@ -38,89 +38,6 @@ namespace QmlDesigner { -static inline DesignDocument* currentDesignDocument() -{ - return QmlDesignerPlugin::instance()->documentManager().currentDesignDocument(); -} - -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 void getProperties(const ModelNode node, QHash<PropertyName, QVariant> &propertyHash) -{ - if (QmlObjectNode::isValidQmlObjectNode(node)) { - foreach (const PropertyName &propertyName, node.propertyNames()) { - if (node.property(propertyName).isVariantProperty() || - (node.property(propertyName).isBindingProperty() && - !propertyName.contains("anchors."))) { - propertyHash.insert(propertyName, QmlObjectNode(node).instanceValue(propertyName)); - } - } - - if (QmlItemNode::isValidQmlItemNode(node)) { - QmlItemNode itemNode(node); - - propertyHash.insert("width", itemNode.instanceValue("width")); - propertyHash.insert("height", itemNode.instanceValue("height")); - propertyHash.remove("x"); - propertyHash.remove("y"); - propertyHash.remove("rotation"); - propertyHash.remove("opacity"); - } - } -} - -static inline void applyProperties(ModelNode &node, const QHash<PropertyName, QVariant> &propertyHash) -{ - QHash<PropertyName, QVariant> auxiliaryData = node.auxiliaryData(); - foreach (const PropertyName &propertyName, auxiliaryData.keys()) { - node.setAuxiliaryData(propertyName, QVariant()); - } - - QHashIterator<PropertyName, QVariant> propertyIterator(propertyHash); - while (propertyIterator.hasNext()) { - propertyIterator.next(); - const PropertyName propertyName = propertyIterator.key(); - if (propertyName == "width" || propertyName == "height") { - node.setAuxiliaryData(propertyIterator.key(), propertyIterator.value()); - } else if (node.property(propertyIterator.key()).isDynamic() && - node.property(propertyIterator.key()).dynamicTypeName() == "alias" && - node.property(propertyIterator.key()).isBindingProperty()) { - AbstractProperty targetProperty = node.bindingProperty(propertyIterator.key()).resolveToProperty(); - if (targetProperty.isValid()) - targetProperty.parentModelNode().setAuxiliaryData(targetProperty.name() + "@NodeInstance", propertyIterator.value()); - } else { - node.setAuxiliaryData(propertyIterator.key() + "@NodeInstance", propertyIterator.value()); - } - } -} - -static inline bool modelNodeIsComponent(const ModelNode &node) -{ - if (!node.isValid() || !node.metaInfo().isValid()) - return false; - - if (node.metaInfo().isFileComponent()) - return true; - - if (node.nodeSourceType() == ModelNode::NodeWithComponentSource) - return true; - if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate")) { - if (node.nodeProperty("delegate").modelNode().metaInfo().isFileComponent()) - return true; - if (node.nodeProperty("delegate").modelNode().nodeSourceType() == ModelNode::NodeWithComponentSource) - return true; - } - - return false; -} - static inline bool itemsHaveSameParent(const QList<ModelNode> &siblingList) { if (siblingList.isEmpty()) @@ -153,91 +70,6 @@ static inline bool itemsHaveSameParent(const QList<ModelNode> &siblingList) return true; } -static inline bool isFileComponent(const ModelNode &node) -{ - if (!node.isValid() || !node.metaInfo().isValid()) - return false; - - if (node.metaInfo().isFileComponent()) - return true; - - if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate")) { - if (node.nodeProperty("delegate").modelNode().metaInfo().isFileComponent()) - return true; - } - - return false; -} - -static inline void openFileForComponent(const ModelNode &node) -{ - QmlDesignerPlugin::instance()->viewManager().nextFileIsCalledInternally(); - - //int width = 0; - //int height = 0; - QHash<PropertyName, QVariant> propertyHash; - if (node.metaInfo().isFileComponent()) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - currentDesignDocument()->changeToExternalSubComponent(node.metaInfo().componentFileName()); - } else if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate") && - node.nodeProperty("delegate").modelNode().metaInfo().isFileComponent()) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - currentDesignDocument()->changeToExternalSubComponent(node.nodeProperty("delegate").modelNode().metaInfo().componentFileName()); - } - ModelNode rootModelNode = currentDesignDocument()->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 (!currentDesignDocument()) - return; - - QHash<PropertyName, QVariant> propertyHash; - - if (node.nodeSourceType() == ModelNode::NodeWithComponentSource) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - currentDesignDocument()->changeToSubComponent(node); - } else if (checkIfNodeIsAView(node) && - node.hasNodeProperty("delegate")) { - if (node.nodeProperty("delegate").modelNode().nodeSourceType() == ModelNode::NodeWithComponentSource) { - //getWidthHeight(node, width, height); - getProperties(node, propertyHash); - currentDesignDocument()->changeToSubComponent(node.nodeProperty("delegate").modelNode()); - } - } - - ModelNode rootModelNode = currentDesignDocument()->rewriterView()->rootModelNode(); - applyProperties(rootModelNode, propertyHash); - //rootModelNode.setAuxiliaryData("width", width); - //rootModelNode.setAuxiliaryData("height", height); -} - -namespace ComponentUtils { -void goIntoComponent(const ModelNode &modelNode) -{ - if (modelNode.isValid() && modelNodeIsComponent(modelNode)) { - QmlDesignerPlugin::instance()->viewManager().setComponentNode(modelNode); - if (isFileComponent(modelNode)) - openFileForComponent(modelNode); - else - openInlineComponent(modelNode); - } -} - -} // namespace ComponentUtils - namespace SelectionContextFunctors { bool singleSelectionItemIsAnchored(const SelectionContext &selectionState) @@ -267,7 +99,7 @@ bool selectionHasSameParent(const SelectionContext &selectionState) bool selectionIsComponent(const SelectionContext &selectionState) { - return modelNodeIsComponent(selectionState.currentSingleSelectedNode()); + return selectionState.currentSingleSelectedNode().isComponent(); } } //SelectionStateFunctors diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h index d5e60975e33a37ee883b05b7a1e12b9118fce308..4fb8afde25c9311735098643f16ca04cf8005c61 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h +++ b/src/plugins/qmldesigner/components/componentcore/modelnodecontextmenu_helper.h @@ -96,11 +96,6 @@ bool singleSelectionItemIsNotAnchored(const SelectionContext &selectionState); } // namespace SelectionStateFunctors - -namespace ComponentUtils { - void goIntoComponent(const ModelNode &modelNode); -} - class ActionTemplate : public DefaultAction { diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index d006c196d27d32f23061eff053163a0fd5dcff56..ec64d6c9f0422973841d41cf09be8740c3f4f8b3 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -39,6 +39,7 @@ #include <variantproperty.h> #include <rewritingexception.h> #include <rewritertransaction.h> +#include <documentmanager.h> #include <qmlanchors.h> #include <limits> @@ -158,7 +159,7 @@ namespace ModelNodeOperations { void goIntoComponent(const ModelNode &modelNode) { - ComponentUtils::goIntoComponent(modelNode); + DocumentManager::goIntoComponent(modelNode); } void select(const SelectionContext &selectionState) diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp index b69d9adafa68448bf6c867a14041020263311c86..a8f726c317b67ef7aea79ed10afa8907a751b1d3 100644 --- a/src/plugins/qmldesigner/documentmanager.cpp +++ b/src/plugins/qmldesigner/documentmanager.cpp @@ -28,9 +28,140 @@ ****************************************************************************/ #include "documentmanager.h" +#include "qmldesignerplugin.h" + +#include <modelnode.h> +#include <nodemetainfo.h> +#include <nodeproperty.h> +#include <bindingproperty.h> namespace QmlDesigner { +static inline DesignDocument* currentDesignDocument() +{ + return QmlDesignerPlugin::instance()->documentManager().currentDesignDocument(); +} + +static inline void getProperties(const ModelNode node, QHash<PropertyName, QVariant> &propertyHash) +{ + if (QmlObjectNode::isValidQmlObjectNode(node)) { + foreach (const AbstractProperty &abstractProperty, node.properties()) { + if (abstractProperty.isVariantProperty() + || (abstractProperty.isBindingProperty() + && !abstractProperty.name().contains("anchors."))) + propertyHash.insert(abstractProperty.name(), QmlObjectNode(node).instanceValue(abstractProperty.name())); + } + + if (QmlItemNode::isValidQmlItemNode(node)) { + QmlItemNode itemNode(node); + + propertyHash.insert("width", itemNode.instanceValue("width")); + propertyHash.insert("height", itemNode.instanceValue("height")); + propertyHash.remove("x"); + propertyHash.remove("y"); + propertyHash.remove("rotation"); + propertyHash.remove("opacity"); + } + } +} + +static inline void applyProperties(ModelNode &node, const QHash<PropertyName, QVariant> &propertyHash) +{ + QHash<PropertyName, QVariant> auxiliaryData = node.auxiliaryData(); + + foreach (const PropertyName &propertyName, auxiliaryData.keys()) { + if (node.hasAuxiliaryData(propertyName)) + node.setAuxiliaryData(propertyName, QVariant()); + } + + QHashIterator<PropertyName, QVariant> propertyIterator(propertyHash); + while (propertyIterator.hasNext()) { + propertyIterator.next(); + const PropertyName propertyName = propertyIterator.key(); + if (propertyName == "width" || propertyName == "height") { + node.setAuxiliaryData(propertyIterator.key(), propertyIterator.value()); + } else if (node.property(propertyIterator.key()).isDynamic() && + node.property(propertyIterator.key()).dynamicTypeName() == "alias" && + node.property(propertyIterator.key()).isBindingProperty()) { + AbstractProperty targetProperty = node.bindingProperty(propertyIterator.key()).resolveToProperty(); + if (targetProperty.isValid()) + targetProperty.parentModelNode().setAuxiliaryData(targetProperty.name() + "@NodeInstance", propertyIterator.value()); + } else { + node.setAuxiliaryData(propertyIterator.key() + "@NodeInstance", propertyIterator.value()); + } + } +} + +static inline void openFileForComponent(const ModelNode &node) +{ + QmlDesignerPlugin::instance()->viewManager().nextFileIsCalledInternally(); + + //int width = 0; + //int height = 0; + QHash<PropertyName, QVariant> propertyHash; + if (node.metaInfo().isFileComponent()) { + //getWidthHeight(node, width, height); + getProperties(node, propertyHash); + currentDesignDocument()->changeToExternalSubComponent(node.metaInfo().componentFileName()); + } else if (node.metaInfo().isView() && + node.hasNodeProperty("delegate") && + node.nodeProperty("delegate").modelNode().metaInfo().isFileComponent()) { + //getWidthHeight(node, width, height); + getProperties(node, propertyHash); + currentDesignDocument()->changeToExternalSubComponent(node.nodeProperty("delegate").modelNode().metaInfo().componentFileName()); + } + ModelNode rootModelNode = currentDesignDocument()->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 (!currentDesignDocument()) + return; + + QHash<PropertyName, QVariant> propertyHash; + + if (node.nodeSourceType() == ModelNode::NodeWithComponentSource) { + //getWidthHeight(node, width, height); + getProperties(node, propertyHash); + currentDesignDocument()->changeToSubComponent(node); + } else if (node.metaInfo().isView() + && node.hasNodeProperty("delegate") + && node.nodeProperty("delegate").modelNode().nodeSourceType() == ModelNode::NodeWithComponentSource) { + //getWidthHeight(node, width, height); + getProperties(node, propertyHash); + currentDesignDocument()->changeToSubComponent(node.nodeProperty("delegate").modelNode()); + } + + ModelNode rootModelNode = currentDesignDocument()->rewriterView()->rootModelNode(); + applyProperties(rootModelNode, propertyHash); + //rootModelNode.setAuxiliaryData("width", width); + //rootModelNode.setAuxiliaryData("height", height); +} + +static inline bool isFileComponent(const ModelNode &node) +{ + if (!node.isValid() || !node.metaInfo().isValid()) + return false; + + if (node.metaInfo().isFileComponent()) + return true; + + if (node.metaInfo().isView() && + node.hasNodeProperty("delegate")) { + if (node.nodeProperty("delegate").modelNode().metaInfo().isFileComponent()) + return true; + } + + return false; +} + DocumentManager::DocumentManager() : QObject() { @@ -73,4 +204,16 @@ void DocumentManager::removeEditors(QList<Core::IEditor *> editors) delete m_designDocumentHash.take(editor).data(); } +void DocumentManager::goIntoComponent(const ModelNode &modelNode) +{ + if (modelNode.isValid() && modelNode.isComponent()) { + QmlDesignerPlugin::instance()->viewManager().setComponentNode(modelNode); + if (isFileComponent(modelNode)) + openFileForComponent(modelNode); + else + openInlineComponent(modelNode); + } +} + + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/documentmanager.h b/src/plugins/qmldesigner/documentmanager.h index 81d081c2f9bf28b8d1f2dea19185289e77f2fd25..5c45d055230486219481760a62713f1a2640439f 100644 --- a/src/plugins/qmldesigner/documentmanager.h +++ b/src/plugins/qmldesigner/documentmanager.h @@ -55,6 +55,8 @@ public: void removeEditors(QList<Core::IEditor*> editors); + static void goIntoComponent(const ModelNode &modelNode); + private: QHash<Core::IEditor *,QWeakPointer<DesignDocument> > m_designDocumentHash; QWeakPointer<DesignDocument> m_currentDesignDocument;