aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-11-24 01:00:07 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-11-24 01:00:07 +0100
commitdf8784fa1fc4792007393ea995756c2d490691d7 (patch)
treed4b8d6bdc855e4045c39f7710f206b7cfcf3d493 /src/quick
parentb799e061a3cbf995ac7c88b315f5916e3a687162 (diff)
parent5246b910771e0dd824b4eea7c5245e5f9f3a63f0 (diff)
Merge remote-tracking branch 'origin/5.12' into dev
Diffstat (limited to 'src/quick')
-rw-r--r--src/quick/items/qquicktext.cpp26
-rw-r--r--src/quick/items/qquicktext_p_p.h1
-rw-r--r--src/quick/items/qquicktextedit.cpp15
-rw-r--r--src/quick/items/qquicktextnode.cpp2
-rw-r--r--src/quick/items/qquicktextnodeengine.cpp27
-rw-r--r--src/quick/items/qquicktextnodeengine_p.h2
-rw-r--r--src/quick/quick.pro2
7 files changed, 51 insertions, 24 deletions
diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp
index 3cce30aaf6..4d4540bc36 100644
--- a/src/quick/items/qquicktext.cpp
+++ b/src/quick/items/qquicktext.cpp
@@ -343,6 +343,19 @@ void QQuickTextPrivate::updateBaseline(qreal baseline, qreal dy)
q->setBaselineOffset(baseline + yoff + q->topPadding());
}
+void QQuickTextPrivate::signalSizeChange(const QSizeF &previousSize)
+{
+ Q_Q(QQuickText);
+
+ if (layedOutTextRect.size() != previousSize) {
+ emit q->contentSizeChanged();
+ if (layedOutTextRect.width() != previousSize.width())
+ emit q->contentWidthChanged(layedOutTextRect.width());
+ if (layedOutTextRect.height() != previousSize.height())
+ emit q->contentHeightChanged(layedOutTextRect.height());
+ }
+}
+
void QQuickTextPrivate::updateSize()
{
Q_Q(QQuickText);
@@ -363,6 +376,8 @@ void QQuickTextPrivate::updateSize()
qreal hPadding = q->leftPadding() + q->rightPadding();
qreal vPadding = q->topPadding() + q->bottomPadding();
+ const QSizeF previousSize = layedOutTextRect.size();
+
if (text.isEmpty() && !isLineLaidOutConnected() && fontSizeMode() == QQuickText::FixedSize) {
// How much more expensive is it to just do a full layout on an empty string here?
// There may be subtle differences in the height and baseline calculations between
@@ -379,14 +394,13 @@ void QQuickTextPrivate::updateSize()
q->setImplicitSize(hPadding, fontHeight + vPadding);
layedOutTextRect = QRectF(0, 0, 0, fontHeight);
advance = QSizeF();
- emit q->contentSizeChanged();
+ signalSizeChange(previousSize);
updateType = UpdatePaintNode;
q->update();
return;
}
QSizeF size(0, 0);
- QSizeF previousSize = layedOutTextRect.size();
//setup instance of QTextLayout for all cases other than richtext
if (!richText) {
@@ -483,13 +497,7 @@ void QQuickTextPrivate::updateSize()
}
}
-
- if (layedOutTextRect.size() != previousSize)
- emit q->contentSizeChanged();
- if (layedOutTextRect.width() != previousSize.width())
- emit q->contentWidthChanged(layedOutTextRect.width());
- if (layedOutTextRect.height() != previousSize.height())
- emit q->contentHeightChanged(layedOutTextRect.height());
+ signalSizeChange(previousSize);
updateType = UpdatePaintNode;
q->update();
}
diff --git a/src/quick/items/qquicktext_p_p.h b/src/quick/items/qquicktext_p_p.h
index fd26d966c8..efa45e0958 100644
--- a/src/quick/items/qquicktext_p_p.h
+++ b/src/quick/items/qquicktext_p_p.h
@@ -75,6 +75,7 @@ public:
void updateBaseline(qreal baseline, qreal dy);
void updateSize();
+ void signalSizeChange(const QSizeF &previousSize);
void updateLayout();
bool determineHorizontalAlignment();
bool setHAlign(QQuickText::HAlignment, bool forceAlign = false);
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp
index bfc9f4c769..06a0fc396b 100644
--- a/src/quick/items/qquicktextedit.cpp
+++ b/src/quick/items/qquicktextedit.cpp
@@ -2044,11 +2044,22 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
int firstDirtyPos = 0;
if (nodeIterator != d->textNodeMap.end()) {
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;
+ auto it = d->textNodeMap.constEnd();
+ while (it != nodeIterator) {
+ --it;
+ if (it->dirty()) {
+ lastDirtyPos = it->startPos();
+ break;
+ }
+ }
do {
rootNode->removeChildNode(nodeIterator->textNode());
delete nodeIterator->textNode();
nodeIterator = d->textNodeMap.erase(nodeIterator);
- } while (nodeIterator != d->textNodeMap.end() && nodeIterator->dirty());
+ } while (nodeIterator != d->textNodeMap.constEnd() && nodeIterator->startPos() <= lastDirtyPos);
}
// FIXME: the text decorations could probably be handled separately (only updated for affected textFrames)
@@ -2090,7 +2101,7 @@ QSGNode *QQuickTextEdit::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *
QTextCharFormat format = a->formatAccessor(pos);
QTextBlock block = textFrame->firstCursorPosition().block();
engine.setCurrentLine(block.layout()->lineForTextPosition(pos - block.position()));
- engine.addTextObject(QPointF(0, 0), format, QQuickTextNodeEngine::Unselected, d->document,
+ engine.addTextObject(block, QPointF(0, 0), format, QQuickTextNodeEngine::Unselected, d->document,
pos, textFrame->frameFormat().position());
nodeStart = pos;
} else {
diff --git a/src/quick/items/qquicktextnode.cpp b/src/quick/items/qquicktextnode.cpp
index 13a8219cbd..0dd12207b7 100644
--- a/src/quick/items/qquicktextnode.cpp
+++ b/src/quick/items/qquicktextnode.cpp
@@ -205,7 +205,7 @@ void QQuickTextNode::addTextDocument(const QPointF &position, QTextDocument *tex
QTextBlock block = textFrame->firstCursorPosition().block();
engine.setCurrentLine(block.layout()->lineForTextPosition(pos - block.position()));
- engine.addTextObject(rect.topLeft(), format, QQuickTextNodeEngine::Unselected, textDocument,
+ engine.addTextObject(block, rect.topLeft(), format, QQuickTextNodeEngine::Unselected, textDocument,
pos, textFrame->frameFormat().position());
} else {
QTextFrame::iterator it = textFrame->begin();
diff --git a/src/quick/items/qquicktextnodeengine.cpp b/src/quick/items/qquicktextnodeengine.cpp
index 9c91ae4896..792aa31a88 100644
--- a/src/quick/items/qquicktextnodeengine.cpp
+++ b/src/quick/items/qquicktextnodeengine.cpp
@@ -423,10 +423,11 @@ void QQuickTextNodeEngine::addImage(const QRectF &rect, const QImage &image, qre
QRectF searchRect = rect;
if (layoutPosition == QTextFrameFormat::InFlow) {
if (m_currentLineTree.isEmpty()) {
+ qreal y = m_currentLine.ascent() - ascent;
if (m_currentTextDirection == Qt::RightToLeft)
- searchRect.moveTopRight(m_position + m_currentLine.rect().topRight() + QPointF(0, 1));
+ searchRect.moveTopRight(m_position + m_currentLine.rect().topRight() + QPointF(0, y));
else
- searchRect.moveTopLeft(m_position + m_currentLine.position() + QPointF(0,1));
+ searchRect.moveTopLeft(m_position + m_currentLine.position() + QPointF(0, y));
} else {
const BinaryTreeNode *lastNode = m_currentLineTree.data() + m_currentLineTree.size() - 1;
if (lastNode->glyphRun.isRightToLeft()) {
@@ -443,7 +444,7 @@ void QQuickTextNodeEngine::addImage(const QRectF &rect, const QImage &image, qre
m_hasContents = true;
}
-void QQuickTextNodeEngine::addTextObject(const QPointF &position, const QTextCharFormat &format,
+void QQuickTextNodeEngine::addTextObject(const QTextBlock &block, const QPointF &position, const QTextCharFormat &format,
SelectionState selectionState,
QTextDocument *textDocument, int pos,
QTextFrameFormat::Position layoutPosition)
@@ -476,17 +477,23 @@ void QQuickTextNodeEngine::addTextObject(const QPointF &position, const QTextCha
}
qreal ascent;
- QFontMetrics m(format.font());
+ QTextLine line = block.layout()->lineForTextPosition(pos);
switch (format.verticalAlignment())
{
- case QTextCharFormat::AlignMiddle:
- ascent = size.height() / 2 - 1;
+ case QTextCharFormat::AlignTop:
+ ascent = line.ascent();
break;
- case QTextCharFormat::AlignBaseline:
- ascent = size.height() - m.descent() - 1;
+ case QTextCharFormat::AlignMiddle: {
+ QFontMetrics m(format.font());
+ ascent = (size.height() - m.xHeight()) / 2;
+ break;
+ }
+ case QTextCharFormat::AlignBottom:
+ ascent = size.height() - line.descent();
break;
+ case QTextCharFormat::AlignBaseline:
default:
- ascent = size.height() - 1;
+ ascent = size.height();
}
addImage(QRectF(position, size), image, ascent, selectionState, layoutPosition);
@@ -1058,7 +1065,7 @@ void QQuickTextNodeEngine::addTextBlock(QTextDocument *textDocument, const QText
? QQuickTextNodeEngine::Selected
: QQuickTextNodeEngine::Unselected;
- addTextObject(QPointF(), charFormat, selectionState, textDocument, textPos);
+ addTextObject(block, QPointF(), charFormat, selectionState, textDocument, textPos);
}
textPos += text.length();
} else {
diff --git a/src/quick/items/qquicktextnodeengine_p.h b/src/quick/items/qquicktextnodeengine_p.h
index 18c624513a..49c1766045 100644
--- a/src/quick/items/qquicktextnodeengine_p.h
+++ b/src/quick/items/qquicktextnodeengine_p.h
@@ -179,7 +179,7 @@ public:
const QVarLengthArray<QTextLayout::FormatRange> &colorChanges,
int textPos, int fragmentEnd,
int selectionStart, int selectionEnd);
- void addTextObject(const QPointF &position, const QTextCharFormat &format,
+ void addTextObject(const QTextBlock &block, const QPointF &position, const QTextCharFormat &format,
SelectionState selectionState,
QTextDocument *textDocument, int pos,
QTextFrameFormat::Position layoutPosition = QTextFrameFormat::InFlow);
diff --git a/src/quick/quick.pro b/src/quick/quick.pro
index 4db614d335..37d2ad1172 100644
--- a/src/quick/quick.pro
+++ b/src/quick/quick.pro
@@ -5,7 +5,7 @@ qtConfig(qml-network): \
QT_PRIVATE += network
DEFINES += QT_NO_URL_CAST_FROM_STRING QT_NO_INTEGER_EVENT_COORDINATES
-win32-msvc*:DEFINES *= _CRT_SECURE_NO_WARNINGS
+msvc:DEFINES *= _CRT_SECURE_NO_WARNINGS
solaris-cc*:QMAKE_CXXFLAGS_RELEASE -= -O2
win32:!winrt: LIBS += -luser32