aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2019-10-09 13:37:51 +0200
committerLars Knoll <lars.knoll@qt.io>2019-10-14 09:42:50 +0200
commit754b8b3e09a84960feb37a412c893895fe41a390 (patch)
treeaecb6ef225564c0b9d269d6da71024fe3fb712c2 /src
parent04b0d1b217229494e317ab0dfcd0b15436d67f70 (diff)
Fix updating of text nodes in QQuickTextEdit
The update algorithm wasn't correctly removing all node that requires removing, as the startPosition is not always up to date when deleting lines of code. Instead, figure out the first Node after the changed region that is clean and keep that one as a reference. Amends 560a1991ac4524ff16352da23a2b54d717548f33. Fixes: QTBUG-74745 Change-Id: I4a2c5bd7a673af5cad1850e3a5b703f9554cd7e6 Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> Reviewed-by: Igor Bugaev <freedbrt@gmail.com> Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/quick/items/qquicktextedit.cpp9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index ad1a6039c7..bdfbb979dd 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -2047,20 +2047,19 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
firstDirtyPos = nodeIterator->startPos();
// ### this could be optimized if the first and last dirty nodes are not connected
// as the intermediate text nodes would usually only need to be transformed differently.
- int lastDirtyPos = firstDirtyPos;
+ QQuickTextNode *firstCleanNode = nullptr;
auto it = d->textNodeMap.constEnd();
while (it != nodeIterator) {
--it;
- if (it->dirty()) {
- lastDirtyPos = it->startPos();
+ if (it->dirty())
break;
- }
+ firstCleanNode = it->textNode();
}
do {
rootNode->removeChildNode(nodeIterator->textNode());
delete nodeIterator->textNode();
nodeIterator = d->textNodeMap.erase(nodeIterator);
- } while (nodeIterator != d->textNodeMap.constEnd() && nodeIterator->startPos() <= lastDirtyPos);
+ } while (nodeIterator != d->textNodeMap.constEnd() && nodeIterator->textNode() != firstCleanNode);
}
// FIXME: the text decorations could probably be handled separately (only updated for affected textFrames)