diff options
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 44 | ||||
-rw-r--r-- | src/quick/items/qquicktextinput_p_p.h | 10 | ||||
-rw-r--r-- | tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp | 9 |
3 files changed, 49 insertions, 14 deletions
diff --git a/src/quick/items/qquicktextinput.cpp b/src/quick/items/qquicktextinput.cpp index c9019c6670..9cf187e7a0 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 d952b27b6f..34aa0726d3 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 27e557bee5..2ea24867af 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() |