diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2020-02-28 16:56:10 +0100 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2020-06-12 15:09:28 +0200 |
commit | ee1101043f0da636bf76972232f384e599becd64 (patch) | |
tree | 1661ccc3cdb2c977ae7f0370d38040f472e08170 /src/quick/items/qquicktextinput.cpp | |
parent | 864f9b79fba25b38a1139d67a7b299b63149c470 (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.cpp | 50 |
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; } |