diff options
author | Pekka Vuorela <pekka.ta.vuorela@nokia.com> | 2012-04-24 16:46:27 +0300 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-04-27 13:47:34 +0200 |
commit | 70e17b48e751c9a9f9d456404c8df61cb5080037 (patch) | |
tree | f21b5ed04c717e56aa32b2fc2715640339ae3569 /src/quick/items/qquicktextedit.cpp | |
parent | 7c288f1a61173f1904960c96c703ee89ab5a847e (diff) |
TextEdit to honor input direction on neutral text
Text with neutral direction, such as e.g. plain spaces, do not
need to make text left aligned on arabic input method.
Change-Id: I9aab5244ec47cf80fb2ba0f83e7087430eb2c7bb
Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
Diffstat (limited to 'src/quick/items/qquicktextedit.cpp')
-rw-r--r-- | src/quick/items/qquicktextedit.cpp | 63 |
1 files changed, 48 insertions, 15 deletions
diff --git a/src/quick/items/qquicktextedit.cpp b/src/quick/items/qquicktextedit.cpp index fc02815adf..0e5023f272 100644 --- a/src/quick/items/qquicktextedit.cpp +++ b/src/quick/items/qquicktextedit.cpp @@ -537,20 +537,39 @@ bool QQuickTextEditPrivate::setHAlign(QQuickTextEdit::HAlignment alignment, bool return false; } + +Qt::LayoutDirection QQuickTextEditPrivate::textDirection(const QString &text) const +{ + 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; +} + bool QQuickTextEditPrivate::determineHorizontalAlignment() { Q_Q(QQuickTextEdit); if (hAlignImplicit && q->isComponentComplete()) { - bool alignToRight; - if (document->isEmpty()) { + Qt::LayoutDirection direction = contentDirection; + if (direction == Qt::LayoutDirectionAuto) { const QString preeditText = control->textCursor().block().layout()->preeditAreaText(); - alignToRight = preeditText.isEmpty() - ? qApp->inputMethod()->inputDirection() == Qt::RightToLeft - : preeditText.isRightToLeft(); - } else { - alignToRight = rightToLeftText; + direction = textDirection(preeditText); } - return setHAlign(alignToRight ? QQuickTextEdit::AlignRight : QQuickTextEdit::AlignLeft); + if (direction == Qt::LayoutDirectionAuto) + direction = qGuiApp->inputMethod()->inputDirection(); + + return setHAlign(direction == Qt::RightToLeft ? QQuickTextEdit::AlignRight : QQuickTextEdit::AlignLeft); } return false; } @@ -1781,7 +1800,11 @@ void QQuickTextEdit::q_textChanged() { Q_D(QQuickTextEdit); d->textCached = false; - d->rightToLeftText = d->document->begin().layout()->engine()->isRightToLeft(); + for (QTextBlock it = d->document->begin(); it != d->document->end(); it = it.next()) { + d->contentDirection = d->textDirection(it.text()); + if (d->contentDirection != Qt::LayoutDirectionAuto) + break; + } d->determineHorizontalAlignment(); d->updateDefaultTextOption(); updateSize(); @@ -2016,24 +2039,34 @@ void QQuickTextEditPrivate::updateDefaultTextOption() Q_Q(QQuickTextEdit); QTextOption opt = document->defaultTextOption(); int oldAlignment = opt.alignment(); + Qt::LayoutDirection oldTextDirection = opt.textDirection(); QQuickTextEdit::HAlignment horizontalAlignment = q->effectiveHAlign(); - if (rightToLeftText) { + if (contentDirection == Qt::RightToLeft) { if (horizontalAlignment == QQuickTextEdit::AlignLeft) horizontalAlignment = QQuickTextEdit::AlignRight; else if (horizontalAlignment == QQuickTextEdit::AlignRight) horizontalAlignment = QQuickTextEdit::AlignLeft; } - opt.setAlignment((Qt::Alignment)(int)(horizontalAlignment | vAlign)); + if (!hAlignImplicit) + opt.setAlignment((Qt::Alignment)(int)(horizontalAlignment | vAlign)); + else + opt.setAlignment(Qt::Alignment(vAlign)); + + if (contentDirection == Qt::LayoutDirectionAuto) { + opt.setTextDirection(qGuiApp->inputMethod()->inputDirection()); + } else { + opt.setTextDirection(contentDirection); + } QTextOption::WrapMode oldWrapMode = opt.wrapMode(); opt.setWrapMode(QTextOption::WrapMode(wrapMode)); opt.setUseDesignMetrics(true); - if (oldWrapMode == opt.wrapMode() && oldAlignment == opt.alignment()) - return; - - document->setDefaultTextOption(opt); + if (oldWrapMode != opt.wrapMode() || oldAlignment != opt.alignment() + || oldTextDirection != opt.textDirection()) { + document->setDefaultTextOption(opt); + } } |