aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquicktextinput.cpp
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2020-02-28 16:56:10 +0100
committerMitch Curtis <mitch.curtis@qt.io>2020-06-12 15:09:28 +0200
commitee1101043f0da636bf76972232f384e599becd64 (patch)
tree1661ccc3cdb2c977ae7f0370d38040f472e08170 /src/quick/items/qquicktextinput.cpp
parent864f9b79fba25b38a1139d67a7b299b63149c470 (diff)
QQuickTextInputPrivate: refactor getImplicitWidth() to calculateImplicitWidth()
This patch moves the implicit width calculation in getImplicitWidth() into calculateImplicitWidth(const QString &text). This allows QQuickComboBox in qtquickcontrols2 to get the implicit width of a TextInput (TextField) item, as QQuickTextInput does some extra layouting and accounting for padding that QFontMetrics does not. Change-Id: I81e6c2627e21ca4d89ea9502abbb6aec79068793 Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
Diffstat (limited to 'src/quick/items/qquicktextinput.cpp')
-rw-r--r--src/quick/items/qquicktextinput.cpp50
1 files changed, 27 insertions, 23 deletions
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp
index 163df3522f..2f022e6c08 100644
--- a/src/quick/items/qquicktextinput.cpp
+++ b/src/quick/items/qquicktextinput.cpp
@@ -2907,36 +2907,40 @@ void QQuickTextInputPrivate::updateDisplayText(bool forceUpdate)
}
}
-qreal QQuickTextInputPrivate::getImplicitWidth() const
+qreal QQuickTextInputPrivate::calculateImplicitWidthForText(const QString &text) const
{
Q_Q(const QQuickTextInput);
- if (!requireImplicitWidth) {
- QQuickTextInputPrivate *d = const_cast<QQuickTextInputPrivate *>(this);
- d->requireImplicitWidth = true;
+ QTextLayout layout(text);
- if (q->isComponentComplete()) {
- // One time cost, only incurred if implicitWidth is first requested after
- // componentComplete.
- QTextLayout layout(m_text);
-
- QTextOption option = m_textLayout.textOption();
- option.setTextDirection(m_layoutDirection);
- option.setFlags(QTextOption::IncludeTrailingSpaces);
- option.setWrapMode(QTextOption::WrapMode(wrapMode));
- option.setAlignment(Qt::Alignment(q->effectiveHAlign()));
- layout.setTextOption(option);
- layout.setFont(font);
+ QTextOption option = m_textLayout.textOption();
+ option.setTextDirection(m_layoutDirection);
+ option.setFlags(QTextOption::IncludeTrailingSpaces);
+ option.setWrapMode(QTextOption::WrapMode(wrapMode));
+ option.setAlignment(Qt::Alignment(q->effectiveHAlign()));
+ layout.setTextOption(option);
+ layout.setFont(font);
#if QT_CONFIG(im)
- layout.setPreeditArea(m_textLayout.preeditAreaPosition(), m_textLayout.preeditAreaText());
+ layout.setPreeditArea(m_textLayout.preeditAreaPosition(), m_textLayout.preeditAreaText());
#endif
- layout.beginLayout();
+ layout.beginLayout();
- QTextLine line = layout.createLine();
- line.setLineWidth(INT_MAX);
- d->implicitWidth = qCeil(line.naturalTextWidth()) + q->leftPadding() + q->rightPadding();
+ QTextLine line = layout.createLine();
+ line.setLineWidth(INT_MAX);
+ const qreal theImplicitWidth = qCeil(line.naturalTextWidth()) + q->leftPadding() + q->rightPadding();
- layout.endLayout();
- }
+ layout.endLayout();
+ return theImplicitWidth;
+}
+
+qreal QQuickTextInputPrivate::getImplicitWidth() const
+{
+ Q_Q(const QQuickTextInput);
+ if (!requireImplicitWidth) {
+ QQuickTextInputPrivate *d = const_cast<QQuickTextInputPrivate *>(this);
+ d->requireImplicitWidth = true;
+
+ if (q->isComponentComplete())
+ d->implicitWidth = calculateImplicitWidthForText(m_text);
}
return implicitWidth;
}