From 3d48d7565cf7e2836f2a67b25d595efa4508ebed Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 3 Jan 2017 17:28:23 +0100 Subject: [PATCH] QmlDesigner: Delay and compress text changes from editor This is required to avoid blocking the ui while typing, because the model is updated. It will take 400ms without changes to the text until the model gets updated. Change-Id: Id428a52c15aeb8f0b802ee0448be8e6777a7402a Reviewed-by: Tim Jenssen --- .../designercore/include/rewriterview.h | 5 ++- .../designercore/model/rewriterview.cpp | 41 +++++++++++-------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index fe7356366c1..251bbf92b85 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -31,6 +31,7 @@ #include "rewritererror.h" #include +#include #include namespace QmlJS { @@ -170,6 +171,7 @@ protected: // functions void setModificationGroupActive(bool active); void applyModificationGroupChanges(); void applyChanges(); + void amendQmlText(); private: //variables TextModifier *m_textModifier = nullptr; @@ -185,7 +187,8 @@ private: //variables QList m_warnings; RewriterTransaction m_removeDefaultPropertyTransaction; QString m_rewritingErrorMessage; - QString lastCorrectQmlSource; + QString m_lastCorrectQmlSource; + QTimer m_amendTimer; }; } //QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 7e9c9b273d3..8d6ba3ecc84 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -53,6 +53,8 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren m_modelToTextMerger(new Internal::ModelToTextMerger(this)), m_textToModelMerger(new Internal::TextToModelMerger(this)) { + m_amendTimer.setSingleShot(true); + connect(&m_amendTimer, &QTimer::timeout, this, &RewriterView::amendQmlText); } RewriterView::~RewriterView() @@ -79,7 +81,7 @@ void RewriterView::modelAttached(Model *model) ModelAmender differenceHandler(m_textToModelMerger.data()); const QString qmlSource = m_textModifier->text(); if (m_textToModelMerger->load(qmlSource, differenceHandler)) - lastCorrectQmlSource = qmlSource; + m_lastCorrectQmlSource = qmlSource; } void RewriterView::modelAboutToBeDetached(Model * /*model*/) @@ -411,6 +413,18 @@ void RewriterView::applyChanges() } } +void RewriterView::amendQmlText() +{ + emitCustomNotification(StartRewriterAmend); + + const QString newQmlText = m_textModifier->text(); + + ModelAmender differenceHandler(m_textToModelMerger.data()); + if (m_textToModelMerger->load(newQmlText, differenceHandler)) + m_lastCorrectQmlSource = newQmlText; + emitCustomNotification(EndRewriterAmend); +} + Internal::ModelNodePositionStorage *RewriterView::positionStorage() const { return m_positionStorage.data(); @@ -714,22 +728,17 @@ void RewriterView::qmlTextChanged() #endif switch (m_differenceHandling) { - case Validate: { - ModelValidator differenceHandler(m_textToModelMerger.data()); - if (m_textToModelMerger->load(newQmlText, differenceHandler)) - lastCorrectQmlSource = newQmlText; - break; - } + case Validate: { + ModelValidator differenceHandler(m_textToModelMerger.data()); + if (m_textToModelMerger->load(newQmlText, differenceHandler)) + m_lastCorrectQmlSource = newQmlText; + break; + } - case Amend: - default: { - emitCustomNotification(StartRewriterAmend); - ModelAmender differenceHandler(m_textToModelMerger.data()); - if (m_textToModelMerger->load(newQmlText, differenceHandler)) - lastCorrectQmlSource = newQmlText; - emitCustomNotification(EndRewriterAmend); - break; - } + case Amend: { + m_amendTimer.start(400); + break; + } } } }