diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index c9019c6670ee14d8177d71ab778cb701ee38c170..9cf187e7a0fc77ae5da4df5205f46d86b41c5249 100644 --- a/src/quick/items/qquicktextinput.cpp +++ b/src/quick/items/qquicktextinput.cpp @@ -467,16 +467,48 @@ bool QQuickTextInputPrivate::setHAlign(QQuickTextInput::HAlignment alignment, bo return false; } +Qt::LayoutDirection QQuickTextInputPrivate::textDirection() const +{ + QString text = m_text; + if (text.isEmpty()) + text = m_textLayout.preeditAreaText(); + + const QChar *character = text.constData(); + while (!character->isNull()) { + switch (character->direction()) { + case QChar::DirL: + return Qt::LeftToRight; + case QChar::DirR: + case QChar::DirAL: + case QChar::DirAN: + return Qt::RightToLeft; + default: + break; + } + character++; + } + return Qt::LayoutDirectionAuto; +} + +Qt::LayoutDirection QQuickTextInputPrivate::layoutDirection() const +{ + Qt::LayoutDirection direction = m_layoutDirection; + if (direction == Qt::LayoutDirectionAuto) { + direction = textDirection(); + if (direction == Qt::LayoutDirectionAuto) + direction = qApp->inputMethod()->inputDirection(); + } + return (direction == Qt::LayoutDirectionAuto) ? Qt::LeftToRight : direction; +} + bool QQuickTextInputPrivate::determineHorizontalAlignment() { if (hAlignImplicit) { // if no explicit alignment has been set, follow the natural layout direction of the text - QString text = q_func()->text(); - if (text.isEmpty()) - text = m_textLayout.preeditAreaText(); - bool isRightToLeft = text.isEmpty() ? qApp->inputMethod()->inputDirection() == Qt::RightToLeft - : text.isRightToLeft(); - return setHAlign(isRightToLeft ? QQuickTextInput::AlignRight : QQuickTextInput::AlignLeft); + Qt::LayoutDirection direction = textDirection(); + if (direction == Qt::LayoutDirectionAuto) + direction = qApp->inputMethod()->inputDirection(); + return setHAlign(direction == Qt::RightToLeft ? QQuickTextInput::AlignRight : QQuickTextInput::AlignLeft); } return false; } diff --git a/src/quick/items/qquicktextinput_p_p.h b/src/quick/items/qquicktextinput_p_p.h index d952b27b6ff64cd5a7190bca80ca4289fc77c43f..34aa0726d32d880ea5e5b7d853a487671a7e6ef8 100644 --- a/src/quick/items/qquicktextinput_p_p.h +++ b/src/quick/items/qquicktextinput_p_p.h @@ -380,14 +380,8 @@ public: m_passwordEchoTimer.stop(); } - Qt::LayoutDirection layoutDirection() const { - if (m_layoutDirection == Qt::LayoutDirectionAuto) { - if (m_text.isEmpty()) - return qApp->inputMethod()->inputDirection(); - return m_text.isRightToLeft() ? Qt::RightToLeft : Qt::LeftToRight; - } - return m_layoutDirection; - } + Qt::LayoutDirection textDirection() const; + Qt::LayoutDirection layoutDirection() const; void setLayoutDirection(Qt::LayoutDirection direction) { if (direction != m_layoutDirection) { diff --git a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp index 27e557bee5816166e948089edd54371770cc00e8..2ea24867af079d90aeadce332b3ad135d9f8044a 100644 --- a/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp +++ b/tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp @@ -1432,6 +1432,15 @@ void tst_qquicktextinput::horizontalAlignment_RightToLeft() QCOMPARE(textInput->hAlign(), QQuickTextInput::AlignRight); QVERIFY(textInput->boundingRect().right() >= textInput->width() - 1); QVERIFY(textInput->boundingRect().right() <= textInput->width() + 1); + + // neutral text should fall back to input direction + textInput->setFocus(true); + textInput->resetHAlign(); + textInput->setText(" ()((=<>"); + platformInputContext.setInputDirection(Qt::LeftToRight); + QCOMPARE(textInput->effectiveHAlign(), QQuickTextInput::AlignLeft); + platformInputContext.setInputDirection(Qt::RightToLeft); + QCOMPARE(textInput->effectiveHAlign(), QQuickTextInput::AlignRight); } void tst_qquicktextinput::verticalAlignment()