aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickitem.cpp149
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickitem.h40
-rw-r--r--src/plugins/accessible/quick/qaccessiblequickview.cpp13
-rw-r--r--src/plugins/accessible/shared/qqmlaccessible.cpp9
-rw-r--r--src/plugins/accessible/shared/qqmlaccessible.h4
5 files changed, 183 insertions, 32 deletions
diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.cpp b/src/plugins/accessible/quick/qaccessiblequickitem.cpp
index da70fe0424..12884ffa4f 100644
--- a/src/plugins/accessible/quick/qaccessiblequickitem.cpp
+++ b/src/plugins/accessible/quick/qaccessiblequickitem.cpp
@@ -40,16 +40,20 @@
****************************************************************************/
#include "qaccessiblequickitem.h"
+
+#include <QtGui/qtextdocument.h>
+
#include "QtQuick/private/qquickitem_p.h"
#include "QtQuick/private/qquicktext_p.h"
#include "QtQuick/private/qquickaccessibleattached_p.h"
+#include "QtQuick/qquicktextdocument.h"
QT_BEGIN_NAMESPACE
#ifndef QT_NO_ACCESSIBILITY
QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item)
- : QQmlAccessible(item)
+ : QQmlAccessible(item), m_doc(textDocument())
{
}
@@ -86,7 +90,6 @@ bool QAccessibleQuickItem::clipsChildren() const
return static_cast<QQuickItem *>(item())->clip();
}
-
QAccessibleInterface *QAccessibleQuickItem::parent() const
{
QQuickItem *parent = item()->parentItem();
@@ -231,10 +234,11 @@ QString QAccessibleQuickItem::text(QAccessible::Text textType) const
// the following block handles item-specific behavior
if (role() == QAccessible::EditableText) {
if (textType == QAccessible::Value) {
+ if (QTextDocument *doc = textDocument()) {
+ return doc->toPlainText();
+ }
QVariant text = object()->property("text");
return text.toString();
- } else if (textType == QAccessible::Name) {
- return object()->objectName();
}
}
@@ -310,6 +314,143 @@ QRect itemScreenRect(QQuickItem *item)
return QRect(screenPos, itemSize);
}
+QTextDocument *QAccessibleQuickItem::textDocument() const
+{
+ QVariant docVariant = item()->property("textDocument");
+ if (docVariant.canConvert<QQuickTextDocument*>()) {
+ QQuickTextDocument *qqdoc = docVariant.value<QQuickTextDocument*>();
+ return qqdoc->textDocument();
+ }
+ return 0;
+}
+
+int QAccessibleQuickItem::characterCount() const
+{
+ if (m_doc) {
+ QTextCursor cursor = QTextCursor(m_doc);
+ cursor.movePosition(QTextCursor::End);
+ return cursor.position();
+ }
+ return text(QAccessible::Value).size();
+}
+
+int QAccessibleQuickItem::cursorPosition() const
+{
+ QVariant pos = item()->property("cursorPosition");
+ return pos.toInt();
+}
+
+void QAccessibleQuickItem::setCursorPosition(int position)
+{
+ item()->setProperty("cursorPosition", position);
+}
+
+QString QAccessibleQuickItem::text(int startOffset, int endOffset) const
+{
+ if (m_doc) {
+ QTextCursor cursor = QTextCursor(m_doc);
+ cursor.setPosition(startOffset);
+ cursor.setPosition(endOffset, QTextCursor::KeepAnchor);
+ return cursor.selectedText();
+ }
+ return text(QAccessible::Value).mid(startOffset, endOffset - startOffset);
+}
+
+QString QAccessibleQuickItem::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
+ int *startOffset, int *endOffset) const
+{
+ Q_ASSERT(startOffset);
+ Q_ASSERT(endOffset);
+
+ if (m_doc) {
+ QTextCursor cursor = QTextCursor(m_doc);
+ cursor.setPosition(offset);
+ QPair<int, int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
+ cursor.setPosition(boundaries.first - 1);
+ boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
+
+ *startOffset = boundaries.first;
+ *endOffset = boundaries.second;
+
+ return text(boundaries.first, boundaries.second);
+ } else {
+ return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);
+ }
+}
+
+QString QAccessibleQuickItem::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
+ int *startOffset, int *endOffset) const
+{
+ Q_ASSERT(startOffset);
+ Q_ASSERT(endOffset);
+
+ if (m_doc) {
+ QTextCursor cursor = QTextCursor(m_doc);
+ cursor.setPosition(offset);
+ QPair<int, int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
+ cursor.setPosition(boundaries.second);
+ boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
+
+ *startOffset = boundaries.first;
+ *endOffset = boundaries.second;
+
+ return text(boundaries.first, boundaries.second);
+ } else {
+ return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);
+ }
+}
+
+QString QAccessibleQuickItem::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType,
+ int *startOffset, int *endOffset) const
+{
+ Q_ASSERT(startOffset);
+ Q_ASSERT(endOffset);
+
+ if (m_doc) {
+ QTextCursor cursor = QTextCursor(m_doc);
+ cursor.setPosition(offset);
+ QPair<int, int> boundaries = QAccessible::qAccessibleTextBoundaryHelper(cursor, boundaryType);
+
+ *startOffset = boundaries.first;
+ *endOffset = boundaries.second;
+ return text(boundaries.first, boundaries.second);
+ } else {
+ return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);
+ }
+}
+
+void QAccessibleQuickItem::selection(int selectionIndex, int *startOffset, int *endOffset) const
+{
+ if (selectionIndex == 0) {
+ *startOffset = item()->property("selectionStart").toInt();
+ *endOffset = item()->property("selectionEnd").toInt();
+ } else {
+ *startOffset = 0;
+ *endOffset = 0;
+ }
+}
+
+int QAccessibleQuickItem::selectionCount() const
+{
+ if (item()->property("selectionStart").toInt() != item()->property("selectionEnd").toInt())
+ return 1;
+ return 0;
+}
+
+void QAccessibleQuickItem::addSelection(int /* startOffset */, int /* endOffset */)
+{
+
+}
+void QAccessibleQuickItem::removeSelection(int /* selectionIndex */)
+{
+
+}
+void QAccessibleQuickItem::setSelection(int /* selectionIndex */, int /* startOffset */, int /* endOffset */)
+{
+
+}
+
+
#endif // QT_NO_ACCESSIBILITY
QT_END_NAMESPACE
diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.h b/src/plugins/accessible/quick/qaccessiblequickitem.h
index e82b2f84d2..d9eb652030 100644
--- a/src/plugins/accessible/quick/qaccessiblequickitem.h
+++ b/src/plugins/accessible/quick/qaccessiblequickitem.h
@@ -50,6 +50,8 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_ACCESSIBILITY
+class QTextDocument;
+
class QAccessibleQuickItem : public QQmlAccessible, public QAccessibleValueInterface, public QAccessibleTextInterface
{
public:
@@ -81,37 +83,41 @@ public:
// Text Interface
- // selection (ignored for now)
- void selection(int /* selectionIndex */, int *startOffset, int *endOffset) const { *startOffset = 0; *endOffset = 0; }
- int selectionCount() const { return 0; }
- void addSelection(int /* startOffset */, int /* endOffset */) {}
- void removeSelection(int /* selectionIndex */) {}
- void setSelection(int /* selectionIndex */, int /* startOffset */, int /* endOffset */) {}
+ void selection(int selectionIndex, int *startOffset, int *endOffset) const;
+ int selectionCount() const;
+ void addSelection(int startOffset, int endOffset);
+ void removeSelection(int selectionIndex);
+ void setSelection(int selectionIndex, int startOffset, int endOffset);
// cursor
- int cursorPosition() const { return 0; }
- void setCursorPosition(int /* position */) {}
+ int cursorPosition() const;
+ void setCursorPosition(int position);
// text
- QString text(int startOffset, int endOffset) const { return text(QAccessible::Name).mid(startOffset, endOffset - startOffset); }
-// QString textBeforeOffset(int offset, QAccessible2::BoundaryType boundaryType,
-// int *startOffset, int *endOffset) const;
-// QString textAfterOffset(int offset, QAccessible2::BoundaryType boundaryType,
-// int *startOffset, int *endOffset) const;
-// QString textAtOffset(int offset, QAccessible2::BoundaryType boundaryType,
-// int *startOffset, int *endOffset) const;
- int characterCount() const { return text(QAccessible::Name).count(); }
+ QString text(int startOffset, int endOffset) const;
+ QString textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType,
+ int *startOffset, int *endOffset) const;
+ QString textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType,
+ int *startOffset, int *endOffset) const;
+ QString textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType,
+ int *startOffset, int *endOffset) const;
+ int characterCount() const;
// character <-> geometry
QRect characterRect(int /* offset */) const { return QRect(); }
int offsetAtPoint(const QPoint & /* point */) const { return -1; }
void scrollToSubstring(int /* startIndex */, int /* endIndex */) {}
- QString attributes(int /* offset */, int * /* startOffset */, int * /* endOffset */) const { return QString(); }
+ QString attributes(int /* offset */, int *startOffset, int *endOffset) const { *startOffset = 0; *endOffset = 0; return QString(); }
+
+ QTextDocument *textDocument() const;
protected:
QQuickItem *item() const { return static_cast<QQuickItem*>(object()); }
void *interface_cast(QAccessible::InterfaceType t);
+
+private:
+ QTextDocument *m_doc;
};
QRect itemScreenRect(QQuickItem *item);
diff --git a/src/plugins/accessible/quick/qaccessiblequickview.cpp b/src/plugins/accessible/quick/qaccessiblequickview.cpp
index 4251a80b33..1240b2ef4c 100644
--- a/src/plugins/accessible/quick/qaccessiblequickview.cpp
+++ b/src/plugins/accessible/quick/qaccessiblequickview.cpp
@@ -60,8 +60,11 @@ QAccessibleQuickWindow::QAccessibleQuickWindow(QQuickWindow *object)
QQuickItem *QAccessibleQuickWindow::rootItem() const
{
- if (window()->contentItem())
- return window()->contentItem()->childItems().first();
+ if (QQuickItem *ci = window()->contentItem()) {
+ const QList<QQuickItem *> &childItems = ci->childItems();
+ if (!childItems.isEmpty())
+ return childItems.first();
+ }
return 0;
}
@@ -78,10 +81,8 @@ QAccessibleInterface *QAccessibleQuickWindow::parent() const
QAccessibleInterface *QAccessibleQuickWindow::child(int index) const
{
- if (index == 0) {
- if (QQuickItem *declarativeRoot = rootItem())
- return new QAccessibleQuickItem(declarativeRoot);
- }
+ if (index == 0)
+ return QAccessible::queryAccessibleInterface(rootItem());
return 0;
}
diff --git a/src/plugins/accessible/shared/qqmlaccessible.cpp b/src/plugins/accessible/shared/qqmlaccessible.cpp
index c4daa3e014..d08f9bdb2c 100644
--- a/src/plugins/accessible/shared/qqmlaccessible.cpp
+++ b/src/plugins/accessible/shared/qqmlaccessible.cpp
@@ -129,7 +129,8 @@ QStringList QQmlAccessible::actionNames() const
break;
case QAccessible::RadioButton:
case QAccessible::CheckBox:
- actions << QAccessibleActionInterface::toggleAction();
+ actions << QAccessibleActionInterface::toggleAction()
+ << QAccessibleActionInterface::pressAction();
break;
case QAccessible::Slider:
case QAccessible::SpinBox:
@@ -153,7 +154,7 @@ void QQmlAccessible::doAction(const QString &actionName)
return;
}
- // Role-specific default action handling follows. Items are excepted to provide
+ // Role-specific default action handling follows. Items are expected to provide
// properties according to role conventions. These will then be read and/or updated
// by the accessibility system.
// Checkable roles : checked
@@ -163,7 +164,9 @@ void QQmlAccessible::doAction(const QString &actionName)
case QAccessible::CheckBox: {
QVariant checked = object()->property("checked");
if (checked.isValid()) {
- if (actionName == QAccessibleActionInterface::toggleAction()) {
+ if (actionName == QAccessibleActionInterface::toggleAction() ||
+ actionName == QAccessibleActionInterface::pressAction()) {
+
object()->setProperty("checked", QVariant(!checked.toBool()));
}
}
diff --git a/src/plugins/accessible/shared/qqmlaccessible.h b/src/plugins/accessible/shared/qqmlaccessible.h
index c6ac4e49dd..5280c78485 100644
--- a/src/plugins/accessible/shared/qqmlaccessible.h
+++ b/src/plugins/accessible/shared/qqmlaccessible.h
@@ -54,8 +54,8 @@ QT_BEGIN_NAMESPACE
-- Declarative Accessibility Overview. --
* Item interface classes:
- QAccessibleDeclarativeItem for QtQuick1
- QAccessibleQuickItem for for QtQuick2
+ QAccessibleDeclarativeItem for Qt Quick 1
+ QAccessibleQuickItem for for Qt Quick 2
Common base class: QQmlAccessible
* View interface classes.