diff options
author | Pekka Vuorela <pekka.ta.vuorela@nokia.com> | 2012-04-13 17:49:52 +0300 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-27 13:47:03 +0200 |
commit | a150d1211f9ec49f963227452ee4818746b8c6ed (patch) | |
tree | 42a0c2d2aa385fd4a558ad98610d0f851244cf7d /src/quick/items/qquicktextinput.cpp | |
parent | 63240b55333d602df118f2a540174c8100576fd5 (diff) |
QQuickTextInput aligment to follow input method on neutral content
Earlier input method was followed only on empty editor. This made
inputting one space character with arabic to be visualized left to
right.
As related change arabic numbers are aligned right even though the
flow goes left to right.
Change-Id: I36448949569f6290faad69de14df424575d8b97e
Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
Diffstat (limited to 'src/quick/items/qquicktextinput.cpp')
-rw-r--r-- | src/quick/items/qquicktextinput.cpp | 44 |
1 files changed, 38 insertions, 6 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; } |