Accessibility text updates for QTextEdit
For Mac this makes QTextEdit work nicely with VoiceOver. Task-number: QTBUG-37204 Change-Id: I1326d24ca6a932ad667ee395f62881b6ec64e892 Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
This commit is contained in:
parent
39c5098dbb
commit
cc57a2e90f
@ -438,6 +438,7 @@ void QWidgetTextControlPrivate::setContent(Qt::TextFormat format, const QString
|
|||||||
|
|
||||||
QObject::connect(doc, SIGNAL(contentsChanged()), q, SLOT(_q_updateCurrentCharFormatAndSelection()));
|
QObject::connect(doc, SIGNAL(contentsChanged()), q, SLOT(_q_updateCurrentCharFormatAndSelection()));
|
||||||
QObject::connect(doc, SIGNAL(cursorPositionChanged(QTextCursor)), q, SLOT(_q_emitCursorPosChanged(QTextCursor)));
|
QObject::connect(doc, SIGNAL(cursorPositionChanged(QTextCursor)), q, SLOT(_q_emitCursorPosChanged(QTextCursor)));
|
||||||
|
QObject::connect(doc, SIGNAL(contentsChange(int,int,int)), q, SLOT(_q_contentsChanged(int,int,int)));
|
||||||
QObject::connect(doc, SIGNAL(documentLayoutChanged()), q, SLOT(_q_documentLayoutChanged()));
|
QObject::connect(doc, SIGNAL(documentLayoutChanged()), q, SLOT(_q_documentLayoutChanged()));
|
||||||
|
|
||||||
// convenience signal forwards
|
// convenience signal forwards
|
||||||
@ -641,6 +642,33 @@ void QWidgetTextControlPrivate::_q_emitCursorPosChanged(const QTextCursor &someC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QWidgetTextControlPrivate::_q_contentsChanged(int from, int charsRemoved, int charsAdded)
|
||||||
|
{
|
||||||
|
Q_Q(QWidgetTextControl);
|
||||||
|
#ifndef QT_NO_ACCESSIBILITY
|
||||||
|
if (QAccessible::isActive()) {
|
||||||
|
QTextCursor tmp(doc);
|
||||||
|
tmp.setPosition(from);
|
||||||
|
tmp.setPosition(from + charsAdded, QTextCursor::KeepAnchor);
|
||||||
|
QString newText = tmp.selectedText();
|
||||||
|
|
||||||
|
// always report the right number of removed chars, but in lack of the real string use spaces
|
||||||
|
QString oldText = QString(charsRemoved, QLatin1Char(' '));
|
||||||
|
|
||||||
|
QAccessibleEvent *ev = 0;
|
||||||
|
if (charsRemoved == 0) {
|
||||||
|
ev = new QAccessibleTextInsertEvent(q->parent(), from, newText);
|
||||||
|
} else if (charsAdded == 0) {
|
||||||
|
ev = new QAccessibleTextRemoveEvent(q->parent(), from, oldText);
|
||||||
|
} else {
|
||||||
|
ev = new QAccessibleTextUpdateEvent(q->parent(), from, oldText, newText);
|
||||||
|
}
|
||||||
|
QAccessible::updateAccessibility(ev);
|
||||||
|
delete ev;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void QWidgetTextControlPrivate::_q_documentLayoutChanged()
|
void QWidgetTextControlPrivate::_q_documentLayoutChanged()
|
||||||
{
|
{
|
||||||
Q_Q(QWidgetTextControl);
|
Q_Q(QWidgetTextControl);
|
||||||
|
@ -262,6 +262,7 @@ private:
|
|||||||
Q_PRIVATE_SLOT(d_func(), void _q_copyLink())
|
Q_PRIVATE_SLOT(d_func(), void _q_copyLink())
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_updateBlock(const QTextBlock &))
|
Q_PRIVATE_SLOT(d_func(), void _q_updateBlock(const QTextBlock &))
|
||||||
Q_PRIVATE_SLOT(d_func(), void _q_documentLayoutChanged())
|
Q_PRIVATE_SLOT(d_func(), void _q_documentLayoutChanged())
|
||||||
|
Q_PRIVATE_SLOT(d_func(), void _q_contentsChanged(int, int, int))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void _q_emitCursorPosChanged(const QTextCursor &someCursor);
|
void _q_emitCursorPosChanged(const QTextCursor &someCursor);
|
||||||
|
void _q_contentsChanged(int from, int charsRemoved, int charsAdded);
|
||||||
|
|
||||||
void setBlinkingCursorEnabled(bool enable);
|
void setBlinkingCursorEnabled(bool enable);
|
||||||
|
|
||||||
|
@ -1711,6 +1711,48 @@ void tst_QAccessibility::textEditTest()
|
|||||||
QCOMPARE(textIface->textAtOffset(28, QAccessible::CharBoundary, &start, &end), QLatin1String("\n"));
|
QCOMPARE(textIface->textAtOffset(28, QAccessible::CharBoundary, &start, &end), QLatin1String("\n"));
|
||||||
QCOMPARE(start, 28);
|
QCOMPARE(start, 28);
|
||||||
QCOMPARE(end, 29);
|
QCOMPARE(end, 29);
|
||||||
|
|
||||||
|
edit.clear();
|
||||||
|
QTestAccessibility::clearEvents();
|
||||||
|
|
||||||
|
// make sure we get notifications when typing text
|
||||||
|
QTestEventList keys;
|
||||||
|
keys.addKeyClick('A');
|
||||||
|
keys.simulate(&edit);
|
||||||
|
keys.clear();
|
||||||
|
QAccessibleTextInsertEvent insertA(&edit, 0, "A");
|
||||||
|
QVERIFY_EVENT(&insertA);
|
||||||
|
QAccessibleTextCursorEvent move1(&edit, 1);
|
||||||
|
QVERIFY_EVENT(&move1);
|
||||||
|
|
||||||
|
|
||||||
|
keys.addKeyClick('c');
|
||||||
|
keys.simulate(&edit);
|
||||||
|
keys.clear();
|
||||||
|
QAccessibleTextInsertEvent insertC(&edit, 1, "c");
|
||||||
|
QVERIFY_EVENT(&insertC);
|
||||||
|
QAccessibleTextCursorEvent move2(&edit, 2);
|
||||||
|
QVERIFY_EVENT(&move2);
|
||||||
|
|
||||||
|
keys.addKeyClick(Qt::Key_Backspace);
|
||||||
|
keys.simulate(&edit);
|
||||||
|
keys.clear();
|
||||||
|
|
||||||
|
// FIXME this should get a proper string instead of space
|
||||||
|
QAccessibleTextRemoveEvent del(&edit, 1, " ");
|
||||||
|
QVERIFY_EVENT(&del);
|
||||||
|
QVERIFY_EVENT(&move1);
|
||||||
|
|
||||||
|
// it would be nicer to get a text update event, but the current implementation
|
||||||
|
// instead does remove and insert which is also fine
|
||||||
|
edit.setText(QStringLiteral("Accessibility rocks"));
|
||||||
|
QAccessibleTextRemoveEvent remove(&edit, 0, " ");
|
||||||
|
QVERIFY_EVENT(&remove);
|
||||||
|
|
||||||
|
// FIXME the new text is not there yet
|
||||||
|
QEXPECT_FAIL("", "Inserting should always contain the new text", Continue);
|
||||||
|
QAccessibleTextInsertEvent insert(&edit, 0, "Accessibility rocks");
|
||||||
|
QVERIFY_EVENT(&insert);
|
||||||
}
|
}
|
||||||
QTestAccessibility::clearEvents();
|
QTestAccessibility::clearEvents();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user