aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicktextinput.cpp44
-rw-r--r--src/quick/items/qquicktextinput_p_p.h10
-rw-r--r--tests/auto/quick/qquicktextinput/tst_qquicktextinput.cpp9
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()