From c64657da22f02d7799824c69d0a925ebd514a38f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 9 Jul 2015 12:57:49 +0200 Subject: [PATCH] QmlDesigenr: Collect qrc urls and create mapping for the qmlpuppet We collect all possible qrc path and the mappings provided by the code model in the TextToModelMerger. Then we set this mapping as environment variable for the puppet in the PuppetCreator(QMLDESIGNER_RC_PATHS). Change-Id: I4b4c7253af23d1f32a75394d04199e76f2e9efdd Reviewed-by: Tim Jenssen --- .../designercore/include/rewriterview.h | 2 + .../instances/nodeinstanceserverproxy.cpp | 26 +++++++++- .../instances/nodeinstanceserverproxy.h | 1 + .../designercore/instances/puppetcreator.cpp | 9 ++++ .../designercore/instances/puppetcreator.h | 3 ++ .../designercore/model/rewriterview.cpp | 5 ++ .../designercore/model/texttomodelmerger.cpp | 47 +++++++++++++++++++ .../designercore/model/texttomodelmerger.h | 6 +++ 8 files changed, 98 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index f9c0af684ea..9c65dcc3b08 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -206,6 +206,8 @@ public: QStringList importDirectories() const; + QSet > qrcMapping() const; + signals: void errorsChanged(const QList &errors); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 9ac9a585daf..8b01b260f35 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -130,7 +130,7 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV PuppetCreator::QmlPuppetVersion puppetVersion = hasQtQuick1(nodeInstanceView) ? PuppetCreator::Qml1Puppet : PuppetCreator::Qml2Puppet; PuppetCreator puppetCreator(kit, QString(), nodeInstanceView->model(), puppetVersion); - + puppetCreator.setQrcMappingString(qrcMappingString()); puppetCreator.createPuppetExecutableIfMissing(); @@ -326,6 +326,30 @@ void NodeInstanceServerProxy::puppetAlive(NodeInstanceServerProxy::PuppetStreamT } } +QString NodeInstanceServerProxy::qrcMappingString() const +{ + if (m_nodeInstanceView && m_nodeInstanceView.data()->model()) { + RewriterView *rewriterView = m_nodeInstanceView.data()->model()->rewriterView(); + if (rewriterView) { + QString mappingString; + + typedef QPair StringPair; + + foreach (const StringPair &pair, rewriterView->qrcMapping()) { + if (!mappingString.isEmpty()) + mappingString.append(QLatin1String(",")); + mappingString.append(pair.first); + mappingString.append(QLatin1String("=")); + mappingString.append(pair.second); + } + + return mappingString; + } + } + + return QString(); +} + void NodeInstanceServerProxy::processFinished() { processFinished(-1, QProcess::CrashExit); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h index 6790110279b..581be7ad476 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h @@ -89,6 +89,7 @@ protected: void dispatchCommand(const QVariant &command, PuppetStreamType puppetStreamType); NodeInstanceClientInterface *nodeInstanceClient() const; void puppetAlive(PuppetStreamType puppetStreamType); + QString qrcMappingString() const; signals: void processCrashed(); diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index e47293a3841..beab9c2af0f 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -349,6 +349,10 @@ QProcessEnvironment PuppetCreator::processEnvironment() const environment.set("QML_USE_MOCKUPS", "true"); environment.set("QML_PUPPET_MODE", "true"); + if (!m_qrcMapping.isEmpty()) { + environment.set(QLatin1String("QMLDESIGNER_RC_PATHS"), m_qrcMapping); + } + if (m_availablePuppetType != FallbackPuppet) { if (m_puppetVersion == Qml1Puppet) environment.appendOrSet("QML_IMPORT_PATH", m_model->importPaths().join(pathSep), pathSep); @@ -385,6 +389,11 @@ QString PuppetCreator::compileLog() const return m_compileLog; } +void PuppetCreator::setQrcMappingString(const QString qrcMapping) +{ + m_qrcMapping = qrcMapping; +} + bool PuppetCreator::startBuildProcess(const QString &buildDirectoryPath, const QString &command, const QStringList &processArguments, diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.h b/src/plugins/qmldesigner/designercore/instances/puppetcreator.h index ab27deb6d90..e914f787bad 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.h +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.h @@ -70,6 +70,8 @@ public: QString compileLog() const; + void setQrcMappingString(const QString qrcMapping); + protected: bool build(const QString &qmlPuppetProjectFilePath) const; @@ -121,6 +123,7 @@ private: static QHash m_qml1PuppetForKitPuppetHash; static QHash m_qml2PuppetForKitPuppetHash; const Model *m_model; + QString m_qrcMapping; QmlPuppetVersion m_puppetVersion; }; diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index a7127c66e8f..55e53700d7a 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -766,6 +766,11 @@ QStringList RewriterView::importDirectories() const return m_textToModelMerger->vContext().paths; } +QSet > RewriterView::qrcMapping() const +{ + return m_textToModelMerger->qrcMapping(); +} + void RewriterView::qmlTextChanged() { if (inErrorState()) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 6ab8cd7dd04..f5c89218264 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -865,6 +865,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH // maybe the project environment (kit, ...) changed, so we need to clean old caches NodeMetaInfo::clearCache(); + m_qrcMapping.clear(); const QUrl url = m_rewriterView->model()->fileUrl(); @@ -1411,11 +1412,33 @@ void TextToModelMerger::syncArrayProperty(AbstractProperty &modelProperty, } } +static QString fileForFullQrcPath(const QString &string) +{ + QStringList stringList = string.split(QLatin1String("/")); + if (stringList.isEmpty()) + return QString(); + + return stringList.last(); +} + +static QString removeFileFromQrcPath(const QString &string) +{ + QStringList stringList = string.split(QLatin1String("/")); + if (stringList.isEmpty()) + return QString(); + + stringList.removeLast(); + return stringList.join(QLatin1String("/")); +} + void TextToModelMerger::syncVariantProperty(AbstractProperty &modelProperty, const QVariant &astValue, const TypeName &astType, DifferenceHandler &differenceHandler) { + if (astValue.canConvert(QMetaType::QString)) + populateQrcMapping(astValue.toString()); + if (modelProperty.isVariantProperty()) { VariantProperty modelVariantProperty = modelProperty.toVariantProperty(); @@ -1909,6 +1932,25 @@ void TextToModelMerger::setupComponent(const ModelNode &node) ModelNode(node).setNodeSource(result); } +void TextToModelMerger::populateQrcMapping(const QString &filePath) +{ + QString path = removeFileFromQrcPath(filePath); + QString fileName = fileForFullQrcPath(filePath); + if (path.contains(QLatin1String("qrc:"))) { + path.remove(QLatin1String("qrc:")); + QMap map = ModelManagerInterface::instance()->filesInQrcPath(path); + if (map.contains(fileName)) { + if (!map.value(fileName).isEmpty()) { + QString fileSystemPath = map.value(fileName).first(); + fileSystemPath.remove(fileName); + if (path.isEmpty()) + path.prepend(QLatin1String("/")); + m_qrcMapping.insert(qMakePair(path, fileSystemPath)); + } + } + } +} + void TextToModelMerger::setupComponentDelayed(const ModelNode &node, bool synchron) { if (synchron) { @@ -1957,6 +1999,11 @@ void TextToModelMerger::delayedSetup() m_setupComponentList.clear(); } +QSet > TextToModelMerger::qrcMapping() const +{ + return m_qrcMapping; +} + QString TextToModelMerger::textAt(const Document::Ptr &doc, const AST::SourceLocation &location) { diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 3ee8f086f8e..c9cf71a8b00 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -131,10 +131,15 @@ public: void setupCustomParserNodeDelayed(const ModelNode &node, bool synchron); void delayedSetup(); + + QSet > qrcMapping() const; + private: void setupCustomParserNode(const ModelNode &node); void setupComponent(const ModelNode &node); + void populateQrcMapping(const QString &filePath); + static QString textAt(const QmlJS::Document::Ptr &doc, const QmlJS::AST::SourceLocation &location); static QString textAt(const QmlJS::Document::Ptr &doc, @@ -150,6 +155,7 @@ private: QSet m_setupComponentList; QSet m_setupCustomParserList; QmlJS::ViewerContext m_vContext; + QSet > m_qrcMapping; }; class DifferenceHandler