diff options
Diffstat (limited to 'src/plugins/qmldesigner/designercore')
25 files changed, 207 insertions, 147 deletions
diff --git a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp index 809fe37ed4..7b30dcd179 100644 --- a/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp +++ b/src/plugins/qmldesigner/designercore/filemanager/qmlrefactoring.cpp @@ -111,7 +111,7 @@ bool QmlRefactoring::addProperty(int parentLocation, const TypeName &dynamicTypeName) { if (parentLocation < 0) - return false; + return true; /* Node is not in hierarchy, yet and operation can be ignored. */ AddPropertyVisitor visit(*textModifier, parentLocation, name, value, propertyType, m_propertyOrder, dynamicTypeName); return visit(qmlDocument->qmlProgram()); diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index d32a403e5c..dcbeb5ee74 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -39,6 +39,8 @@ #include <QObject> #include <QPointer> +#include <functional> + QT_BEGIN_NAMESPACE class QStyle; class QToolButton; @@ -263,6 +265,9 @@ public: void activateTimelineRecording(const ModelNode &timeline); void deactivateTimelineRecording(); + using OperationBlock = std::function<void()>; + bool executeInTransaction(const QByteArray &identifier, const OperationBlock &lambda); + protected: void setModel(Model * model); void removeModel(); diff --git a/src/plugins/qmldesigner/designercore/include/metainforeader.h b/src/plugins/qmldesigner/designercore/include/metainforeader.h index 20672e0e05..eb725b5f86 100644 --- a/src/plugins/qmldesigner/designercore/include/metainforeader.h +++ b/src/plugins/qmldesigner/designercore/include/metainforeader.h @@ -39,7 +39,6 @@ class ItemLibraryEntry; namespace Internal { - class MetaInfoReader : protected QmlJS::SimpleAbstractStreamReader { Q_DECLARE_TR_FUNCTIONS(QmlDesigner::Internal::MetaInfoReader) diff --git a/src/plugins/qmldesigner/designercore/include/nodehints.h b/src/plugins/qmldesigner/designercore/include/nodehints.h index 1e8b7d99e4..7fed390ee0 100644 --- a/src/plugins/qmldesigner/designercore/include/nodehints.h +++ b/src/plugins/qmldesigner/designercore/include/nodehints.h @@ -64,9 +64,11 @@ public: bool isStackedContainer() const; bool canBeReparentedTo(const ModelNode &potenialParent); QString indexPropertyForStackedContainer() const; + QStringList visibleNonDefaultProperties() const; bool takesOverRenderingOfChildren() const; bool visibleInNavigator() const; bool visibleInLibrary() const; + QString forceNonDefaultProperty() const; QHash<QString, QString> hints() const; static NodeHints fromModelNode(const ModelNode &modelNode); diff --git a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h index 5d2d171ae7..09daa924aa 100644 --- a/src/plugins/qmldesigner/designercore/include/nodemetainfo.h +++ b/src/plugins/qmldesigner/designercore/include/nodemetainfo.h @@ -85,6 +85,7 @@ public: bool defaultPropertyIsComponent() const; TypeName typeName() const; + TypeName simplifiedTypeName() const; int majorVersion() const; int minorVersion() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index f857a36432..1560ebb3ff 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -53,10 +53,15 @@ public: static bool isItemOrWindow(const ModelNode &modelNode); static QmlItemNode createQmlItemNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QPointF &position, + QmlItemNode parentQmlItemNode); + + static QmlObjectNode createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode); - static QmlItemNode createQmlItemNode(AbstractView *view, + static QmlObjectNode createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty); diff --git a/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h b/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h index dc2f0732ee..da21c17cd9 100644 --- a/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h +++ b/src/plugins/qmldesigner/designercore/include/subcomponentmanager.h @@ -60,7 +60,7 @@ private: // functions void addImport(int pos, const Import &import); void removeImport(int pos); void parseDirectories(); - QList<QFileInfo> watchedFiles(const QString &canonicalDirPath); + QFileInfoList watchedFiles(const QString &canonicalDirPath); void unregisterQmlFile(const QFileInfo &fileInfo, const QString &qualifier); void registerQmlFile(const QFileInfo &fileInfo, const QString &qualifier, bool addToLibrary); Model *model() const; diff --git a/src/plugins/qmldesigner/designercore/include/viewmanager.h b/src/plugins/qmldesigner/designercore/include/viewmanager.h index 4673e341cc..71c869916e 100644 --- a/src/plugins/qmldesigner/designercore/include/viewmanager.h +++ b/src/plugins/qmldesigner/designercore/include/viewmanager.h @@ -80,7 +80,7 @@ public: void disableWidgets(); void enableWidgets(); - void pushFileOnCrumbleBar(const Utils::FileName &fileName); + void pushFileOnCrumbleBar(const Utils::FilePath &fileName); void pushInFileComponentOnCrumbleBar(const ModelNode &modelNode); void nextFileIsCalledInternally(); diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 609db1fe95..c0723bf751 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -143,17 +143,17 @@ NodeInstanceServerProxy::NodeInstanceServerProxy(NodeInstanceView *nodeInstanceV const int second = 1000; const int waitConstant = 8 * second; if (m_qmlPuppetEditorProcess->waitForStarted(waitConstant)) { - connect(m_qmlPuppetEditorProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), + connect(m_qmlPuppetEditorProcess.data(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), m_qmlPuppetEditorProcess.data(), &QProcess::deleteLater); qCInfo(instanceViewBenchmark) << "puppets started:" << m_benchmarkTimer.elapsed(); if (runModus == NormalModus) { m_qmlPuppetPreviewProcess->waitForStarted(waitConstant / 2); - connect(m_qmlPuppetPreviewProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), + connect(m_qmlPuppetPreviewProcess.data(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), m_qmlPuppetPreviewProcess.data(), &QProcess::deleteLater); m_qmlPuppetRenderProcess->waitForStarted(waitConstant / 2); - connect(m_qmlPuppetRenderProcess.data(), static_cast<void (QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), + connect(m_qmlPuppetRenderProcess.data(), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), m_qmlPuppetRenderProcess.data(), &QProcess::deleteLater); } diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h index d0309aacaa..60565261d2 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.h @@ -29,8 +29,8 @@ #include <QPointer> #include <QProcess> +#include <QElapsedTimer> #include <QFile> -#include <QTime> #include <QTimer> QT_BEGIN_NAMESPACE @@ -127,7 +127,7 @@ private: quint32 m_thirdLastReadCommandCounter = 0; RunModus m_runModus; int m_synchronizeId = -1; - QTime m_benchmarkTimer; + QElapsedTimer m_benchmarkTimer; bool m_destructing = false; }; diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 8ab932e8b1..0959dd4a9e 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -90,7 +90,7 @@ QHash<Core::Id, PuppetCreator::PuppetType> PuppetCreator::m_qml2PuppetForKitPupp QByteArray PuppetCreator::qtHash() const { - QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitInformation::qtVersion(m_kit); + QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitAspect::qtVersion(m_kit); if (currentQtVersion) { return QCryptographicHash::hash(currentQtVersion->qmakeProperty("QT_INSTALL_DATA").toUtf8(), QCryptographicHash::Sha1) @@ -102,7 +102,7 @@ QByteArray PuppetCreator::qtHash() const QDateTime PuppetCreator::qtLastModified() const { - QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitInformation::qtVersion(m_kit); + QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitAspect::qtVersion(m_kit); if (currentQtVersion) return QFileInfo(currentQtVersion->qmakeProperty("QT_INSTALL_LIBS")).lastModified(); @@ -153,7 +153,7 @@ QString PuppetCreator::getStyleConfigFileName() const { #ifndef QMLDESIGNER_TEST if (m_currentProject) { - for (const Utils::FileName &fileName : m_currentProject->files(ProjectExplorer::Project::SourceFiles)) { + for (const Utils::FilePath &fileName : m_currentProject->files(ProjectExplorer::Project::SourceFiles)) { if (fileName.fileName() == "qtquickcontrols2.conf") return fileName.toString(); } @@ -419,10 +419,10 @@ QProcessEnvironment PuppetCreator::processEnvironment() const Utils::Environment environment = Utils::Environment::systemEnvironment(); if (!useOnlyFallbackPuppet()) m_kit->addToEnvironment(environment); - const QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(m_kit); + const QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(m_kit); if (QTC_GUARD(qt)) { // Kits without a Qt version should not have a puppet! // Update PATH to include QT_HOST_BINS - const Utils::FileName qtBinPath = qt->binPath(); + const Utils::FilePath qtBinPath = qt->binPath(); environment.prependOrSetPath(qtBinPath.toString()); } environment.set("QML_BAD_GUI_RENDER_LOOP", "true"); @@ -472,10 +472,15 @@ QProcessEnvironment PuppetCreator::processEnvironment() const if (!styleConfigFileName.isEmpty()) environment.appendOrSet("QT_QUICK_CONTROLS_CONF", styleConfigFileName); + QStringList customFileSelectors; + if (m_currentProject && m_currentProject->activeTarget()) { QStringList designerImports = m_currentProject->activeTarget() ->additionalData("QmlDesignerImportPath").toStringList(); importPaths.append(designerImports); + + customFileSelectors = m_currentProject->activeTarget() + ->additionalData("CustomFileSelectorsData").toStringList(); } if (m_availablePuppetType == FallbackPuppet) @@ -483,10 +488,14 @@ QProcessEnvironment PuppetCreator::processEnvironment() const environment.appendOrSet("QML2_IMPORT_PATH", importPaths.join(pathSep), pathSep); + if (!customFileSelectors.isEmpty()) + environment.appendOrSet("QML_FILE_SELECTORS", customFileSelectors.join(","), pathSep); + qCInfo(puppetStart) << Q_FUNC_INFO; qCInfo(puppetStart) << "Puppet qrc mapping" << m_qrcMapping; qCInfo(puppetStart) << "Puppet import paths:" << importPaths; qCInfo(puppetStart) << "Puppet environment:" << environment.toStringList(); + qCInfo(puppetStart) << "Puppet selectors:" << customFileSelectors; return environment.toProcessEnvironment(); } @@ -497,18 +506,18 @@ QString PuppetCreator::buildCommand() const m_kit->addToEnvironment(environment); ProjectExplorer::ToolChain *toolChain - = ProjectExplorer::ToolChainKitInformation::toolChain(m_kit, + = ProjectExplorer::ToolChainKitAspect::toolChain(m_kit, ProjectExplorer::Constants::CXX_LANGUAGE_ID); if (toolChain) - return toolChain->makeCommand(environment); + return toolChain->makeCommand(environment).toString(); return QString(); } QString PuppetCreator::qmakeCommand() const { - QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitInformation::qtVersion(m_kit); + QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitAspect::qtVersion(m_kit); if (currentQtVersion) return currentQtVersion->qmakeCommand().toString(); @@ -595,7 +604,7 @@ static bool nonEarlyQt5Version(const QtSupport::QtVersionNumber ¤tQtVersio bool PuppetCreator::qtIsSupported() const { - QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitInformation::qtVersion(m_kit); + QtSupport::BaseQtVersion *currentQtVersion = QtSupport::QtKitAspect::qtVersion(m_kit); return currentQtVersion && currentQtVersion->isValid() diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp index be7623323d..dcb350c448 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodehints.cpp @@ -51,7 +51,6 @@ namespace QmlDesigner { - static bool isSwipeView(const ModelNode &node) { if (node.metaInfo().isValid() @@ -193,6 +192,19 @@ QString NodeHints::indexPropertyForStackedContainer() const return Internal::evaluateExpression(expression, modelNode(), ModelNode()).toString(); } +QStringList NodeHints::visibleNonDefaultProperties() const +{ + if (!isValid()) + return {}; + + const QString expression = m_hints.value("visibleNonDefaultProperties"); + + if (expression.isEmpty()) + return {}; + + return Internal::evaluateExpression(expression, modelNode(), ModelNode()).toString().split(","); +} + bool NodeHints::takesOverRenderingOfChildren() const { if (!isValid()) @@ -214,6 +226,16 @@ bool NodeHints::visibleInLibrary() const return evaluateBooleanExpression("visibleInLibrary", true); } +QString NodeHints::forceNonDefaultProperty() const +{ + const QString expression = m_hints.value("forceNonDefaultProperty"); + + if (expression.isEmpty()) + return {}; + + return Internal::evaluateExpression(expression, modelNode(), ModelNode()).toString(); +} + QHash<QString, QString> NodeHints::hints() const { return m_hints; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 9c88cd130a..25ff950644 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -1483,6 +1483,11 @@ TypeName NodeMetaInfo::typeName() const return m_privateData->qualfiedTypeName(); } +TypeName NodeMetaInfo::simplifiedTypeName() const +{ + return typeName().split('.').constLast(); +} + int NodeMetaInfo::majorVersion() const { return m_privateData->majorVersion(); diff --git a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp index bc9dd3c184..85a84af9a3 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/subcomponentmanager.cpp @@ -202,8 +202,8 @@ void SubComponentManager::parseDirectory(const QString &canonicalDirPath, bool a dir.setNameFilters(QStringList(s_qmlFilePattern)); dir.setFilter(QDir::Files | QDir::Readable | QDir::CaseSensitive); - QList<QFileInfo> monitoredList = watchedFiles(canonicalDirPath); - QList<QFileInfo> newList; + QFileInfoList monitoredList = watchedFiles(canonicalDirPath); + QFileInfoList newList; foreach (const QFileInfo &qmlFile, dir.entryInfoList()) { if (QFileInfo(m_filePath.toLocalFile()) == qmlFile) { // do not parse main file @@ -280,9 +280,9 @@ void SubComponentManager::parseFile(const QString &canonicalFilePath) } // dirInfo must already contain a canonical path -QList<QFileInfo> SubComponentManager::watchedFiles(const QString &canonicalDirPath) +QFileInfoList SubComponentManager::watchedFiles(const QString &canonicalDirPath) { - QList<QFileInfo> files; + QFileInfoList files; foreach (const QString &monitoredFile, m_watcher.files()) { QFileInfo fileInfo(monitoredFile); diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 68e11782df..eb7ed16b9a 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -44,7 +44,6 @@ namespace QmlDesigner { - /*! \class QmlDesigner::AbstractView \ingroup CoreModel @@ -617,6 +616,20 @@ void AbstractView::deactivateTimelineRecording() model()->d->notifyCurrentTimelineChanged(ModelNode()); } +bool AbstractView::executeInTransaction(const QByteArray &identifier, const AbstractView::OperationBlock &lambda) +{ + try { + RewriterTransaction transaction = beginRewriterTransaction(identifier); + lambda(); + transaction.commit(); + } catch (const Exception &e) { + e.showException(); + return false; + } + + return true; +} + QList<ModelNode> AbstractView::allModelNodes() const { return toModelNodeList(model()->d->allNodes()); diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index 161cf1f9f5..8517f9cb82 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -178,29 +178,23 @@ void ModelMerger::replaceModel(const ModelNode &modelNode) view()->model()->changeImports(modelNode.model()->imports(), {}); view()->model()->setFileUrl(modelNode.model()->fileUrl()); - try { - RewriterTransaction transaction(view()->beginRewriterTransaction(QByteArrayLiteral("ModelMerger::replaceModel"))); - - ModelNode rootNode(view()->rootModelNode()); - - foreach (const PropertyName &propertyName, rootNode.propertyNames()) - rootNode.removeProperty(propertyName); - - QHash<QString, QString> idRenamingHash; - setupIdRenamingHash(modelNode, idRenamingHash, view()); - - syncAuxiliaryProperties(rootNode, modelNode); - syncVariantProperties(rootNode, modelNode); - syncBindingProperties(rootNode, modelNode, idRenamingHash); - syncId(rootNode, modelNode, idRenamingHash); - syncNodeProperties(rootNode, modelNode, idRenamingHash, view()); - syncNodeListProperties(rootNode, modelNode, idRenamingHash, view()); - m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); - - transaction.commit(); - } catch (const RewritingException &e) { - qWarning() << e.description(); //silent error - } + view()->executeInTransaction("ModelMerger::replaceModel", [this, modelNode](){ + ModelNode rootNode(view()->rootModelNode()); + + foreach (const PropertyName &propertyName, rootNode.propertyNames()) + rootNode.removeProperty(propertyName); + + QHash<QString, QString> idRenamingHash; + setupIdRenamingHash(modelNode, idRenamingHash, view()); + + syncAuxiliaryProperties(rootNode, modelNode); + syncVariantProperties(rootNode, modelNode); + syncBindingProperties(rootNode, modelNode, idRenamingHash); + syncId(rootNode, modelNode, idRenamingHash); + syncNodeProperties(rootNode, modelNode, idRenamingHash, view()); + syncNodeListProperties(rootNode, modelNode, idRenamingHash, view()); + m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); + }); } } //namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp b/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp index c7a9e5aa28..ba821dd788 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp @@ -31,7 +31,6 @@ namespace QmlDesigner { - static PropertyName lineTypeToString(AnchorLineType lineType) { switch (lineType) { @@ -162,22 +161,23 @@ void QmlAnchors::setAnchor(AnchorLineType sourceAnchorLine, const QmlItemNode &targetQmlItemNode, AnchorLineType targetAnchorLine) { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::setAnchor")); - if (qmlItemNode().isInBaseState()) { - if ((qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) - || ((qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)))) { - removeAnchor(sourceAnchorLine); - } + qmlItemNode().view()->executeInTransaction("QmlAnchors::setAnchor", [this, sourceAnchorLine, targetQmlItemNode, targetAnchorLine](){ + if (qmlItemNode().isInBaseState()) { + if ((qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) + || ((qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)))) { + removeAnchor(sourceAnchorLine); + } - const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); - ModelNode targetModelNode = targetQmlItemNode.modelNode(); - QString targetExpression = targetModelNode.validId(); - if (targetQmlItemNode.modelNode() == qmlItemNode().modelNode().parentProperty().parentModelNode()) - targetExpression = QLatin1String("parent"); - if (sourceAnchorLine != AnchorLineCenter && sourceAnchorLine != AnchorLineFill) - targetExpression = targetExpression + QLatin1Char('.') + QString::fromLatin1(lineTypeToString(targetAnchorLine)); - qmlItemNode().modelNode().bindingProperty(propertyName).setExpression(targetExpression); - } + const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); + ModelNode targetModelNode = targetQmlItemNode.modelNode(); + QString targetExpression = targetModelNode.validId(); + if (targetQmlItemNode.modelNode() == qmlItemNode().modelNode().parentProperty().parentModelNode()) + targetExpression = QLatin1String("parent"); + if (sourceAnchorLine != AnchorLineCenter && sourceAnchorLine != AnchorLineFill) + targetExpression = targetExpression + QLatin1Char('.') + QString::fromLatin1(lineTypeToString(targetAnchorLine)); + qmlItemNode().modelNode().bindingProperty(propertyName).setExpression(targetExpression); + } + }); } bool detectHorizontalCycle(const ModelNode &node, QList<ModelNode> knownNodeList) @@ -316,47 +316,49 @@ AnchorLine QmlAnchors::instanceAnchor(AnchorLineType sourceAnchorLine) const void QmlAnchors::removeAnchor(AnchorLineType sourceAnchorLine) { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::removeAnchor")); - if (qmlItemNode().isInBaseState()) { - const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) { - qmlItemNode().modelNode().removeProperty("anchors.fill"); - qmlItemNode().modelNode().bindingProperty("anchors.top").setExpression(QLatin1String("parent.top")); - qmlItemNode().modelNode().bindingProperty("anchors.left").setExpression(QLatin1String("parent.left")); - qmlItemNode().modelNode().bindingProperty("anchors.bottom").setExpression(QLatin1String("parent.bottom")); - qmlItemNode().modelNode().bindingProperty("anchors.right").setExpression(QLatin1String("parent.right")); + qmlItemNode().view()->executeInTransaction("QmlAnchors::removeAnchor", [this, sourceAnchorLine](){ + if (qmlItemNode().isInBaseState()) { + const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) { + qmlItemNode().modelNode().removeProperty("anchors.fill"); + qmlItemNode().modelNode().bindingProperty("anchors.top").setExpression(QLatin1String("parent.top")); + qmlItemNode().modelNode().bindingProperty("anchors.left").setExpression(QLatin1String("parent.left")); + qmlItemNode().modelNode().bindingProperty("anchors.bottom").setExpression(QLatin1String("parent.bottom")); + qmlItemNode().modelNode().bindingProperty("anchors.right").setExpression(QLatin1String("parent.right")); + + } else if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)) { + qmlItemNode().modelNode().removeProperty("anchors.centerIn"); + qmlItemNode().modelNode().bindingProperty("anchors.horizontalCenter").setExpression(QLatin1String("parent.horizontalCenter")); + qmlItemNode().modelNode().bindingProperty("anchors.verticalCenter").setExpression(QLatin1String("parent.verticalCenter")); + } - } else if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)) { - qmlItemNode().modelNode().removeProperty("anchors.centerIn"); - qmlItemNode().modelNode().bindingProperty("anchors.horizontalCenter").setExpression(QLatin1String("parent.horizontalCenter")); - qmlItemNode().modelNode().bindingProperty("anchors.verticalCenter").setExpression(QLatin1String("parent.verticalCenter")); + qmlItemNode().modelNode().removeProperty(propertyName); } - - qmlItemNode().modelNode().removeProperty(propertyName); - } + }); } void QmlAnchors::removeAnchors() { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::removeAnchors")); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill")) - qmlItemNode().modelNode().removeProperty("anchors.fill"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn")) - qmlItemNode().modelNode().removeProperty("anchors.centerIn"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.top")) - qmlItemNode().modelNode().removeProperty("anchors.top"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.left")) - qmlItemNode().modelNode().removeProperty("anchors.left"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.right")) - qmlItemNode().modelNode().removeProperty("anchors.right"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.bottom")) - qmlItemNode().modelNode().removeProperty("anchors.bottom"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.horizontalCenter")) - qmlItemNode().modelNode().removeProperty("anchors.horizontalCenter"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.verticalCenter")) - qmlItemNode().modelNode().removeProperty("anchors.verticalCenter"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.baseline")) - qmlItemNode().modelNode().removeProperty("anchors.baseline"); + qmlItemNode().view()->executeInTransaction("QmlAnchors::removeAnchors", [this](){ + if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill")) + qmlItemNode().modelNode().removeProperty("anchors.fill"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn")) + qmlItemNode().modelNode().removeProperty("anchors.centerIn"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.top")) + qmlItemNode().modelNode().removeProperty("anchors.top"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.left")) + qmlItemNode().modelNode().removeProperty("anchors.left"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.right")) + qmlItemNode().modelNode().removeProperty("anchors.right"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.bottom")) + qmlItemNode().modelNode().removeProperty("anchors.bottom"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.horizontalCenter")) + qmlItemNode().modelNode().removeProperty("anchors.horizontalCenter"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.verticalCenter")) + qmlItemNode().modelNode().removeProperty("anchors.verticalCenter"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.baseline")) + qmlItemNode().modelNode().removeProperty("anchors.baseline"); + }); } bool QmlAnchors::instanceHasAnchor(AnchorLineType sourceAnchorLine) const @@ -533,13 +535,14 @@ void QmlAnchors::removeMargin(AnchorLineType sourceAnchorLineType) void QmlAnchors::removeMargins() { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::removeMargins")); - removeMargin(AnchorLineLeft); - removeMargin(AnchorLineRight); - removeMargin(AnchorLineTop); - removeMargin(AnchorLineBottom); - removeMargin(AnchorLineHorizontalCenter); - removeMargin(AnchorLineVerticalCenter); + qmlItemNode().view()->executeInTransaction("QmlAnchors::removeMargins", [this](){ + removeMargin(AnchorLineLeft); + removeMargin(AnchorLineRight); + removeMargin(AnchorLineTop); + removeMargin(AnchorLineBottom); + removeMargin(AnchorLineHorizontalCenter); + removeMargin(AnchorLineVerticalCenter); + }); } void QmlAnchors::fill() diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index f02ca1ead7..65b34f1de4 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -85,8 +85,15 @@ static QmlItemNode createQmlItemNodeFromSource(AbstractView *view, const QString return QmlItemNode(); } +QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QPointF &position, + QmlItemNode parentQmlItemNode) +{ + return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode)); +} -QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode) +QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode) { if (!parentQmlItemNode.isValid()) parentQmlItemNode = QmlItemNode(view->rootModelNode()); @@ -95,16 +102,14 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibrary NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty(); - return QmlItemNode::createQmlItemNode(view, itemLibraryEntry, position, parentProperty); + return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty); } -QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty) +QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty) { - QmlItemNode newQmlItemNode; - - try { - RewriterTransaction transaction = view->beginRewriterTransaction(QByteArrayLiteral("QmlItemNode::createQmlItemNode")); + QmlObjectNode newQmlObjectNode; + view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){ NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); int minorVersion = metaInfo.minorVersion(); @@ -130,34 +135,31 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibrary } } - newQmlItemNode = QmlItemNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); + newQmlObjectNode = QmlItemNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); } else { - newQmlItemNode = createQmlItemNodeFromSource(view, itemLibraryEntry.qmlSource(), position); + newQmlObjectNode = createQmlItemNodeFromSource(view, itemLibraryEntry.qmlSource(), position); } if (parentproperty.isValid()) - parentproperty.reparentHere(newQmlItemNode); + parentproperty.reparentHere(newQmlObjectNode); - if (!newQmlItemNode.isValid()) - return newQmlItemNode; + if (!newQmlObjectNode.isValid()) + return; - newQmlItemNode.setId(view->generateNewId(itemLibraryEntry.name())); + newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name())); for (const auto &propertyBindingEntry : propertyBindingList) - newQmlItemNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second); + newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second); for (const auto &propertyBindingEntry : propertyEnumList) - newQmlItemNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); + newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); - Q_ASSERT(newQmlItemNode.isValid()); - } - catch (const RewritingException &e) { - e.showException(); - } + Q_ASSERT(newQmlObjectNode.isValid()); + }); - Q_ASSERT(newQmlItemNode.isValid()); + Q_ASSERT(newQmlObjectNode.isValid()); - return newQmlItemNode; + return newQmlObjectNode; } QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, QmlItemNode parentQmlItemNode) @@ -174,10 +176,8 @@ QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QS { QmlItemNode newQmlItemNode; - if (parentproperty.isValid()) { - RewriterTransaction transaction = view->beginRewriterTransaction(QByteArrayLiteral("QmlItemNode::createQmlItemNodeFromImage")); - - if (view->model()->hasNodeMetaInfo("QtQuick.Image")) { + if (parentproperty.isValid() && view->model()->hasNodeMetaInfo("QtQuick.Image")) { + view->executeInTransaction("QmlItemNode::createQmlItemNodeFromImage", [=, &newQmlItemNode, &parentproperty](){ NodeMetaInfo metaInfo = view->model()->metaInfo("QtQuick.Image"); QList<QPair<PropertyName, QVariant> > propertyPairList; propertyPairList.append({PropertyName("x"), QVariant(qRound(position.x()))}); @@ -200,8 +200,7 @@ QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QS newQmlItemNode.modelNode().variantProperty("fillMode").setEnumeration("Image.PreserveAspectFit"); Q_ASSERT(newQmlItemNode.isValid()); - } - Q_ASSERT(newQmlItemNode.isValid()); + }); } return newQmlItemNode; diff --git a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp index 65ed482bfb..53e29b7157 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlobjectnode.cpp @@ -263,7 +263,7 @@ QString QmlObjectNode::stripedTranslatableText(const PropertyName &name) const return regularExpressionPatter.cap(2); return instanceValue(name).toString(); } - return modelNode().variantProperty(name).value().toString(); + return instanceValue(name).toString(); } QString QmlObjectNode::expression(const PropertyName &name) const diff --git a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp index 08105bf2be..8ab244fe2b 100644 --- a/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp @@ -41,12 +41,10 @@ using namespace QmlDesigner::Internal; inline static QString properColorName(const QColor &color) { - QString s; if (color.alpha() == 255) - s.sprintf("#%02x%02x%02x", color.red(), color.green(), color.blue()); + return QString::asprintf("#%02x%02x%02x", color.red(), color.green(), color.blue()); else - s.sprintf("#%02x%02x%02x%02x", color.alpha(), color.red(), color.green(), color.blue()); - return s; + return QString::asprintf("#%02x%02x%02x%02x", color.alpha(), color.red(), color.green(), color.blue()); } inline static QString doubleToString(double d) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 739011f092..b9b82f5714 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -48,10 +48,10 @@ #include <qmljs/qmljscheck.h> #include <qmljs/qmljsutils.h> #include <qmljs/qmljsmodelmanagerinterface.h> -#include <qmljs/qmljsqrcparser.h> #include <qmljs/qmljsinterpreter.h> #include <qmljs/qmljsvalueowner.h> +#include <utils/qrcparser.h> #include <utils/qtcassert.h> #include <QSet> @@ -372,6 +372,13 @@ bool smartVeryFuzzyCompare(const QVariant &value1, const QVariant &value2) return false; } +bool smartColorCompare(const QVariant &value1, const QVariant &value2) +{ + if ((value1.type() == QVariant::Color) || (value2.type() == QVariant::Color)) + return value1.value<QColor>().rgba() == value2.value<QColor>().rgba(); + return false; +} + bool equals(const QVariant &a, const QVariant &b) { if (a.canConvert<QmlDesigner::Enumeration>() && b.canConvert<QmlDesigner::Enumeration>()) @@ -380,6 +387,8 @@ bool equals(const QVariant &a, const QVariant &b) return true; if (smartVeryFuzzyCompare(a, b)) return true; + if (smartColorCompare(a, b)) + return true; return false; } @@ -457,7 +466,7 @@ public: if (!name.isEmpty() && name != QLatin1String(".")) typeName.prepend(name + QLatin1Char('.')); } else if (importInfo.isValid() && importInfo.type() == ImportType::QrcDirectory) { - QString path = QrcParser::normalizedQrcDirectoryPath(importInfo.path()); + QString path = Utils::QrcParser::normalizedQrcDirectoryPath(importInfo.path()); path = path.mid(1, path.size() - ((path.size() > 1) ? 2 : 1)); const QString name = path.replace(QLatin1Char('/'), QLatin1Char('.')); if (!name.isEmpty()) diff --git a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp index c22ce39ad1..c2f36fad90 100644 --- a/src/plugins/qmldesigner/designercore/model/viewmanager.cpp +++ b/src/plugins/qmldesigner/designercore/model/viewmanager.cpp @@ -384,7 +384,7 @@ void ViewManager::enableWidgets() view->enableWidget(); } -void ViewManager::pushFileOnCrumbleBar(const Utils::FileName &fileName) +void ViewManager::pushFileOnCrumbleBar(const Utils::FilePath &fileName) { crumbleBar()->pushFile(fileName); } diff --git a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp index 149a76ef51..9b319a814d 100644 --- a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp +++ b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.cpp @@ -190,7 +190,7 @@ QStandardItem *WidgetPluginPath::createModelItem() QStandardItem *failedCategory = nullptr; const auto end = m_plugins.end(); for (auto it = m_plugins.begin(); it != end; ++it) { - QStandardItem *pluginItem = new QStandardItem(Utils::FileName::fromString(it->path).fileName()); + QStandardItem *pluginItem = new QStandardItem(Utils::FilePath::fromString(it->path).fileName()); if (instance(*it)) { pluginItem->appendRow(new QStandardItem(QString::fromUtf8(it->instanceGuard->metaObject()->className()))); pathItem->appendRow(pluginItem); diff --git a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h index 13ad38fcd3..2ad7d554f4 100644 --- a/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h +++ b/src/plugins/qmldesigner/designercore/pluginmanager/widgetpluginpath.h @@ -40,8 +40,6 @@ namespace QmlDesigner { class IWidgetPlugin; namespace Internal { - - // Dumb plugin data structure. Note that whereas QObjects can // casted to an interface, QPointer does not work with the // interface class, so, we need a separate QPointer as a guard diff --git a/src/plugins/qmldesigner/designercore/rewritertransaction.cpp b/src/plugins/qmldesigner/designercore/rewritertransaction.cpp index 1cbe8f8cac..1bae709e0c 100644 --- a/src/plugins/qmldesigner/designercore/rewritertransaction.cpp +++ b/src/plugins/qmldesigner/designercore/rewritertransaction.cpp @@ -39,8 +39,6 @@ namespace QmlDesigner { - - QList<QByteArray> RewriterTransaction::m_identifierList; bool RewriterTransaction::m_activeIdentifier = qEnvironmentVariableIsSet("QML_DESIGNER_TRACE_REWRITER_TRANSACTION"); |