diff options
Diffstat (limited to 'src/quick/items/qquicktextedit.cpp')
| -rw-r--r-- | src/quick/items/qquicktextedit.cpp | 85 |
1 files changed, 60 insertions, 25 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index 69541accc7..441335ec7a 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -704,9 +704,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(); } @@ -741,21 +740,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(); @@ -778,20 +790,22 @@ 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) { - const QString preeditText = control->textCursor().block().layout()->preeditAreaText(); - direction = textDirection(preeditText); - } - if (direction == Qt::LayoutDirectionAuto) - direction = qGuiApp->inputMethod()->inputDirection(); + if (direction == Qt::LayoutDirectionAuto) { + const QString preeditText = control->textCursor().block().layout()->preeditAreaText(); + direction = textDirection(preeditText); + } + 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() @@ -1483,14 +1497,35 @@ void QQuickTextEdit::setInputMethodHints(Qt::InputMethodHints hints) void QQuickTextEdit::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(QQuickTextEdit); - if (!d->inLayout && ((newGeometry.width() != oldGeometry.width() && widthValid()) - || (newGeometry.height() != oldGeometry.height() && heightValid()))) { + if (!d->inLayout && ((newGeometry.width() != oldGeometry.width()) + || (newGeometry.height() != oldGeometry.height()))) { updateSize(); updateWholeDocument(); - moveCursorDelegate(); + if (widthValid() || heightValid()) + moveCursorDelegate(); } QQuickImplicitSizeItem::geometryChange(newGeometry, oldGeometry); +} + +void QQuickTextEdit::itemChange(ItemChange change, const ItemChangeData &value) +{ + Q_D(QQuickTextEdit); + Q_UNUSED(value); + switch (change) { + case ItemDevicePixelRatioHasChanged: + if (d->renderType == NativeRendering) { + // Native rendering optimizes for a given pixel grid, so its results must not be scaled. + // Text layout code respects the current device pixel ratio automatically, we only need + // to rerun layout after the ratio changed. + updateSize(); + updateWholeDocument(); + } + break; + default: + break; + } + QQuickImplicitSizeItem::itemChange(change, value); } /*! |
