QQuickTextEdit to follow input method direction changes

Change-Id: I458f85452a2ffe1c43438f9588cfc271461a42c6
Reviewed-by: Joona Petrell <joona.t.petrell@nokia.com>
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
This commit is contained in:
Pekka Vuorela 2012-01-09 16:31:54 +02:00 committed by Qt by Nokia
parent 6cd7247877
commit dc7aecd088
3 changed files with 62 additions and 15 deletions

View File

@ -1502,6 +1502,15 @@ void QQuickTextEdit::itemChange(ItemChange change, const ItemChangeData &value)
{
if (change == ItemActiveFocusHasChanged) {
setCursorVisible(value.boolValue); // ### refactor: focus handling && d->canvas && d->canvas->hasFocus());
if (value.boolValue) {
q_updateAlignment();
connect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)),
this, SLOT(q_updateAlignment()));
} else {
disconnect(qApp->inputPanel(), SIGNAL(inputDirectionChanged(Qt::LayoutDirection)),
this, SLOT(q_updateAlignment()));
}
}
QQuickItem::itemChange(change, value);
}
@ -1926,6 +1935,15 @@ void QQuickTextEdit::updateCursor()
}
}
void QQuickTextEdit::q_updateAlignment()
{
Q_D(QQuickTextEdit);
if (d->determineHorizontalAlignment()) {
d->updateDefaultTextOption();
moveCursorDelegate();
}
}
void QQuickTextEdit::updateTotalLines()
{
Q_D(QQuickTextEdit);

View File

@ -282,6 +282,7 @@ private Q_SLOTS:
void q_canPasteChanged();
void updateDocument();
void updateCursor();
void q_updateAlignment();
private:
void updateSize();

View File

@ -97,6 +97,7 @@ public:
tst_qquicktextedit();
private slots:
void cleanup();
void text();
void width();
void wrap();
@ -296,6 +297,13 @@ tst_qquicktextedit::tst_qquicktextedit()
//
}
void tst_qquicktextedit::cleanup()
{
// ensure not even skipped tests with custom input context leave it dangling
QInputPanelPrivate *inputPanelPrivate = QInputPanelPrivate::get(qApp->inputPanel());
inputPanelPrivate->testContext = 0;
}
void tst_qquicktextedit::text()
{
{
@ -616,6 +624,10 @@ void tst_qquicktextedit::hAlign()
void tst_qquicktextedit::hAlign_RightToLeft()
{
PlatformInputContext platformInputContext;
QInputPanelPrivate *inputPanelPrivate = QInputPanelPrivate::get(qApp->inputPanel());
inputPanelPrivate->testContext = &platformInputContext;
QQuickView canvas(testFileUrl("horizontalAlignment_RightToLeft.qml"));
QQuickTextEdit *textEdit = canvas.rootObject()->findChild<QQuickTextEdit*>("text");
QVERIFY(textEdit != 0);
@ -716,24 +728,40 @@ void tst_qquicktextedit::hAlign_RightToLeft()
// empty text with implicit alignment follows the system locale-based
// keyboard input direction from qApp->inputPanel()->inputDirection
textEdit->setText("");
QCOMPARE(textEdit->hAlign(), qApp->inputPanel()->inputDirection() == Qt::LeftToRight ?
QQuickTextEdit::AlignLeft : QQuickTextEdit::AlignRight);
if (qApp->inputPanel()->inputDirection() == Qt::LeftToRight)
QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
else
QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
textEdit->setHAlign(QQuickTextEdit::AlignRight);
platformInputContext.setInputDirection(Qt::LeftToRight);
QVERIFY(qApp->inputPanel()->inputDirection() == Qt::LeftToRight);
QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignLeft);
QVERIFY(textEdit->positionToRectangle(0).x() < canvas.width()/2);
QSignalSpy cursorRectangleSpy(textEdit, SIGNAL(cursorRectangleChanged()));
platformInputContext.setInputDirection(Qt::RightToLeft);
QCOMPARE(cursorRectangleSpy.count(), 1);
QVERIFY(qApp->inputPanel()->inputDirection() == Qt::RightToLeft);
QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight);
QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
// alignment of TextEdit with no text set to it
QString componentStr = "import QtQuick 2.0\nTextEdit {}";
QDeclarativeComponent textComponent(&engine);
textComponent.setData(componentStr.toLatin1(), QUrl::fromLocalFile(""));
QQuickTextEdit *textObject = qobject_cast<QQuickTextEdit*>(textComponent.create());
QCOMPARE(textObject->hAlign(), qApp->inputPanel()->inputDirection() == Qt::LeftToRight ?
QQuickTextEdit::AlignLeft : QQuickTextEdit::AlignRight);
delete textObject;
// set input direction while having content
platformInputContext.setInputDirection(Qt::LeftToRight);
textEdit->setText("a");
textEdit->setCursorPosition(1);
platformInputContext.setInputDirection(Qt::RightToLeft);
QTest::keyClick(&canvas, Qt::Key_Backspace);
QVERIFY(textEdit->text().isEmpty());
QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight);
QVERIFY(textEdit->cursorRectangle().left() > canvas.width()/2);
// input direction changed while not having focus
platformInputContext.setInputDirection(Qt::LeftToRight);
textEdit->setFocus(false);
platformInputContext.setInputDirection(Qt::RightToLeft);
textEdit->setFocus(true);
QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight);
QVERIFY(textEdit->cursorRectangle().left() > canvas.width()/2);
textEdit->setHAlign(QQuickTextEdit::AlignRight);
QCOMPARE(textEdit->hAlign(), QQuickTextEdit::AlignRight);
QVERIFY(textEdit->positionToRectangle(0).x() > canvas.width()/2);
}
void tst_qquicktextedit::vAlign()