aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmldesigner/designercore/model/rewriterview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qmldesigner/designercore/model/rewriterview.cpp')
-rw-r--r--src/plugins/qmldesigner/designercore/model/rewriterview.cpp65
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*/