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