Invalidate text painting nodes when document text block is updated
authorSarunas Valaskevicius <rakatan@gmail.com>
Sun, 9 Feb 2014 18:50:42 +0000 (18:50 +0000)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 5 May 2014 10:39:13 +0000 (12:39 +0200)
The commit fixes text repainting when only formatting of the text is
changed by invalidating the affected blocks which will be repainted
on the next update.

Task-number: QTBUG-36743
Change-Id: I03ba747f9d08a9f49d0a012b8349c89c20dc6b55
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
src/quick/items/qquicktextedit.cpp
src/quick/items/qquicktextedit_p.h

index b69d8fa..3c4d0d4 100644 (file)
@@ -2011,6 +2011,7 @@ void QQuickTextEditPrivate::init()
     qmlobject_connect(document, QQuickTextDocumentWithImageResources, SIGNAL(redoAvailable(bool)), q, QQuickTextEdit, SIGNAL(canRedoChanged()));
     qmlobject_connect(document, QQuickTextDocumentWithImageResources, SIGNAL(imagesLoaded()), q, QQuickTextEdit, SLOT(updateSize()));
     QObject::connect(document, &QQuickTextDocumentWithImageResources::contentsChange, q, &QQuickTextEdit::q_contentsChange);
+    QObject::connect(document->documentLayout(), &QAbstractTextDocumentLayout::updateBlock, q, &QQuickTextEdit::invalidateBlock);
 
     document->setDefaultFont(font);
     document->setDocumentMargin(textMargin);
@@ -2245,6 +2246,11 @@ void QQuickTextEdit::updateWholeDocument()
     }
 }
 
+void QQuickTextEdit::invalidateBlock(const QTextBlock &block)
+{
+    markDirtyNodesForRange(block.position(), block.position() + block.length(), 0);
+}
+
 void QQuickTextEdit::updateCursor()
 {
     Q_D(QQuickTextEdit);
index b84552d..c6b7ce3 100644 (file)
@@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE
 
 class QQuickTextDocument;
 class QQuickTextEditPrivate;
+class QTextBlock;
+
 class Q_QUICK_PRIVATE_EXPORT QQuickTextEdit : public QQuickImplicitSizeItem
 {
     Q_OBJECT
@@ -326,6 +328,7 @@ private Q_SLOTS:
     void createCursor();
     void q_canPasteChanged();
     void updateWholeDocument();
+    void invalidateBlock(const QTextBlock &block);
     void updateCursor();
     void q_updateAlignment();
     void updateSize();