diff options
author | Vladimir Belyavsky <belyavskyv@gmail.com> | 2023-12-11 21:45:22 +0300 |
---|---|---|
committer | Vladimir Belyavsky <belyavskyv@gmail.com> | 2024-01-09 08:50:50 +0300 |
commit | 694a677535ef11f9c966920c5e99d304bdbd94a5 (patch) | |
tree | 34ba408e6027dc176b7b4ef5f4912298b67e0868 /src/quick/items/qquicktextedit.cpp | |
parent | 4513eb4ec956a0363f1537359d7157456ac311bd (diff) |
TextArea/TextField: properly update placeholder text alignment
Placeholder text alignment depends on actual alignment of a parent
control, e.g. TextArea or TextField. Thus, if the horizontal text
alignment of the parent control is set explicitly, the placeholder
text must have the same alignment. Otherwise, the placeholder text
alignment should respect to the natural alignment of the text.
In order to do this QQuickPlaceholderText is connected to
effectiveHorizontalAlignmentChanged() signal of the parent control.
The problem is that the signal may not be emitted when alignment
is set explicitly after the component creation, so the placeholder
text alignment will not be updated respectively. To solve this we
need to make sure that the signal is forcibly emitted every time
when the alignment is set explicitly.
Fixes: QTBUG-120052
Pick-to: 6.7 6.6 6.5
Change-Id: Ib66a7a46d523777cc54ca6b6883d3fecc800dfb2
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quick/items/qquicktextedit.cpp')
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index fce8a4eb32..f5f85a771c 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -737,9 +737,8 @@ QQuickTextEdit::HAlignment QQuickTextEdit::hAlign() const void QQuickTextEdit::setHAlign(HAlignment align) { Q_D(QQuickTextEdit); - bool forceAlign = d->hAlignImplicit && d->effectiveLayoutMirror; - d->hAlignImplicit = false; - if (d->setHAlign(align, forceAlign) && isComponentComplete()) { + + if (d->setHAlign(align, true) && isComponentComplete()) { d->updateDefaultTextOption(); updateSize(); } @@ -774,21 +773,34 @@ QQuickTextEdit::HAlignment QQuickTextEdit::effectiveHAlign() const return effectiveAlignment; } -bool QQuickTextEditPrivate::setHAlign(QQuickTextEdit::HAlignment alignment, bool forceAlign) +bool QQuickTextEditPrivate::setHAlign(QQuickTextEdit::HAlignment align, bool forceAlign) { Q_Q(QQuickTextEdit); - if (hAlign != alignment || forceAlign) { - QQuickTextEdit::HAlignment oldEffectiveHAlign = q->effectiveHAlign(); - hAlign = alignment; - emit q->horizontalAlignmentChanged(alignment); - if (oldEffectiveHAlign != q->effectiveHAlign()) - emit q->effectiveHorizontalAlignmentChanged(); + if (hAlign == align && !forceAlign) + return false; + + const bool wasImplicit = hAlignImplicit; + const auto oldEffectiveHAlign = q->effectiveHAlign(); + + hAlignImplicit = !forceAlign; + if (hAlign != align) { + hAlign = align; + emit q->horizontalAlignmentChanged(align); + } + + if (q->effectiveHAlign() != oldEffectiveHAlign) { + emit q->effectiveHorizontalAlignmentChanged(); return true; } + + if (forceAlign && wasImplicit) { + // QTBUG-120052 - when horizontal text alignment is set explicitly, + // we need notify any other controls that may depend on it, like QQuickPlaceholderText + emit q->effectiveHorizontalAlignmentChanged(); + } return false; } - Qt::LayoutDirection QQuickTextEditPrivate::textDirection(const QString &text) const { const QChar *character = text.constData(); @@ -811,22 +823,24 @@ Qt::LayoutDirection QQuickTextEditPrivate::textDirection(const QString &text) co bool QQuickTextEditPrivate::determineHorizontalAlignment() { Q_Q(QQuickTextEdit); - if (hAlignImplicit && q->isComponentComplete()) { - Qt::LayoutDirection direction = contentDirection; + if (!hAlignImplicit || !q->isComponentComplete()) + return false; + + Qt::LayoutDirection direction = contentDirection; #if QT_CONFIG(im) - if (direction == Qt::LayoutDirectionAuto) { - QTextBlock block = control->textCursor().block(); - if (!block.layout()) - return false; - direction = textDirection(block.layout()->preeditAreaText()); - } - if (direction == Qt::LayoutDirectionAuto) - direction = qGuiApp->inputMethod()->inputDirection(); + if (direction == Qt::LayoutDirectionAuto) { + QTextBlock block = control->textCursor().block(); + if (!block.layout()) + return false; + direction = textDirection(block.layout()->preeditAreaText()); + } + if (direction == Qt::LayoutDirectionAuto) + direction = qGuiApp->inputMethod()->inputDirection(); #endif - return setHAlign(direction == Qt::RightToLeft ? QQuickTextEdit::AlignRight : QQuickTextEdit::AlignLeft); - } - return false; + const auto implicitHAlign = direction == Qt::RightToLeft ? + QQuickTextEdit::AlignRight : QQuickTextEdit::AlignLeft; + return setHAlign(implicitHAlign); } void QQuickTextEditPrivate::mirrorChange() |