diff options
Diffstat (limited to 'src/plugins/qmldesigner/designercore/model/rewriterview.cpp')
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/rewriterview.cpp | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 4d8ebd4315..eb9c650746 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -53,6 +53,8 @@ #include <utils/changeset.h> #include <utils/qtcassert.h> +#include <QRegExp> + #include <utility> #include <vector> @@ -70,7 +72,12 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren m_textToModelMerger(new Internal::TextToModelMerger(this)) { m_amendTimer.setSingleShot(true); + m_amendTimer.setInterval(400); connect(&m_amendTimer, &QTimer::timeout, this, &RewriterView::amendQmlText); + + QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); + connect(modelManager, &QmlJS::ModelManagerInterface::libraryInfoUpdated, + this, &RewriterView::handleLibraryInfoUpdate, Qt::QueuedConnection); } RewriterView::~RewriterView() = default; @@ -87,6 +94,8 @@ Internal::TextToModelMerger *RewriterView::textToModelMerger() const void RewriterView::modelAttached(Model *model) { + m_modelAttachPending = false; + if (model && model->textModifier()) setTextModifier(model->textModifier()); @@ -100,10 +109,12 @@ void RewriterView::modelAttached(Model *model) if (!(m_errors.isEmpty() && m_warnings.isEmpty())) notifyErrorsAndWarnings(m_errors); - if (hasIncompleteTypeInformation()) + if (hasIncompleteTypeInformation()) { + m_modelAttachPending = true; QTimer::singleShot(1000, this, [this, model](){ modelAttached(model); }); + } } void RewriterView::modelAboutToBeDetached(Model * /*model*/) @@ -530,6 +541,9 @@ QString RewriterView::auxiliaryDataAsQML() const QTC_ASSERT(!m_canonicalIntModelNode.isEmpty(), return {}); int columnCount = 0; + + const QRegExp safeName("[a-z][a-zA-Z0-9]*"); + for (const auto &node : allModelNodes()) { QHash<PropertyName, QVariant> data = node.auxiliaryData(); if (!data.isEmpty()) { @@ -562,6 +576,9 @@ QString RewriterView::auxiliaryDataAsQML() const if (idIsQmlKeyWord(key)) continue; + if (!safeName.exactMatch(key)) + continue; + const QVariant value = data.value(key.toUtf8()); QString strValue = value.toString(); @@ -796,6 +813,13 @@ void RewriterView::setupCanonicalHashes() const } } +void RewriterView::handleLibraryInfoUpdate() +{ + // Trigger dummy amend to reload document when library info changes + if (isAttached() && !m_modelAttachPending) + m_amendTimer.start(); +} + ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const { return nodeAtTextCursorPositionHelper(rootModelNode(), cursorPosition); @@ -936,27 +960,31 @@ QStringList RewriterView::autoComplete(const QString &text, int pos, bool explic return list; } -QList<CppTypeData> RewriterView::getCppTypes() +QList<QmlTypeData> RewriterView::getQMLTypes() const { - QList<CppTypeData> cppDataList; - for (const QmlJS::ModelManagerInterface::CppData &cppData : QmlJS::ModelManagerInterface::instance()->cppData().values()) + QList<QmlTypeData> qmlDataList; + + qmlDataList.append(m_textToModelMerger->getQMLSingletons()); + + for (const QmlJS::ModelManagerInterface::CppData &cppData : + QmlJS::ModelManagerInterface::instance()->cppData().values()) for (const LanguageUtils::FakeMetaObject::ConstPtr &fakeMetaObject : cppData.exportedTypes) { - for (const LanguageUtils::FakeMetaObject::Export &exportItem : fakeMetaObject->exports()) { - - CppTypeData cppData; - cppData.cppClassName = fakeMetaObject->className(); - cppData.typeName = exportItem.type; - cppData.importUrl = exportItem.package; - cppData.versionString = exportItem.version.toString(); - cppData.superClassName = fakeMetaObject->superclassName(); - cppData.isSingleton = fakeMetaObject->isSingleton(); - - if (cppData.importUrl != "<cpp>") //ignore pure unregistered cpp types - cppDataList.append(cppData); + for (const LanguageUtils::FakeMetaObject::Export &exportItem : + fakeMetaObject->exports()) { + QmlTypeData qmlData; + qmlData.cppClassName = fakeMetaObject->className(); + qmlData.typeName = exportItem.type; + qmlData.importUrl = exportItem.package; + qmlData.versionString = exportItem.version.toString(); + qmlData.superClassName = fakeMetaObject->superclassName(); + qmlData.isSingleton = fakeMetaObject->isSingleton(); + + if (qmlData.importUrl != "<cpp>") //ignore pure unregistered cpp types + qmlDataList.append(qmlData); } } - return cppDataList; + return qmlDataList; } void RewriterView::setWidgetStatusCallback(std::function<void (bool)> setWidgetStatusCallback) @@ -966,7 +994,6 @@ void RewriterView::setWidgetStatusCallback(std::function<void (bool)> setWidgetS void RewriterView::qmlTextChanged() { - getCppTypes(); if (inErrorState()) return; @@ -995,7 +1022,7 @@ void RewriterView::qmlTextChanged() auto &viewManager = QmlDesignerPlugin::instance()->viewManager(); if (viewManager.usesRewriterView(this)) { QmlDesignerPlugin::instance()->viewManager().disableWidgets(); - m_amendTimer.start(400); + m_amendTimer.start(); } #else /*Keep test synchronous*/ |