\o \l{Dynamic Object Management in QML}{Dynamic Object Management}
\o \l{Network Transparency}{Loading Resources in QML}
\o \l{QML Internationalization}{Internationalization}
+\o \l{Accessible}{Accessibility}
\endlist
\section1 QML Add-Ons
\o The \l{QtQuick.Particles 2} module provides a set of Particle System elements for QtQuick 2
\endlist
+\section1 Accessibility
+\list
+\o \l {Accessible} - Attached property to make components accessible
+\endlist
+
*/
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Window 2.0
+import "widgets"
+
+Rectangle {
+ id: window
+
+ width: 360; height: 300
+ color: "white"
+
+ Column {
+ id: column
+ spacing: 6
+ anchors.fill: parent
+ width: parent.width
+ Row {
+ spacing: 6
+ width: column.width
+ Button { width: 100; height: column.h + 20; text: "Send" }
+ Button { width: 100; height: column.h + 20; text: "Discard" }
+ }
+
+ Row {
+ spacing: 6
+ width: column.width
+ height: column.h
+ Text {
+ id: subjectLabel
+ Accessible.role: Accessible.StaticText
+ Accessible.name: text
+ text: "Subject:"
+ width: 50
+ }
+ Rectangle {
+ id: subjectBorder
+ Accessible.role: Accessible.EditableText
+ Accessible.name: subjectEdit.text
+ border.width: 1
+ border.color: "black"
+ height: subjectEdit.height
+ width: 304
+ TextInput {
+ id: subjectEdit
+ text: "Vacation plans"
+ }
+ }
+ }
+ Rectangle {
+ id: textBorder
+ Accessible.role: Accessible.EditableText
+ property alias text : textEdit.text
+ border.width: 1
+ border.color: "black"
+ width: parent.width
+ height: textEdit.height
+ TextEdit {
+ id: textEdit
+ text: "Hi, we're going to the Dolomites this summer. Weren't you also going to northern Italy? \n\nbest wishes, your friend Luke"
+ width: parent.width
+ wrapMode: TextEdit.WordWrap
+ }
+ }
+ }
+}
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: button
+
+ property alias text : buttonText.text
+ Accessible.name: text
+ Accessible.description: "This button does " + text
+ Accessible.role: Accessible.Button
+
+ signal clicked
+
+ width: buttonText.width + 20
+ height: 30
+ gradient: Gradient {
+ GradientStop { position: 0.0; color: "lightsteelblue" }
+ GradientStop { position: 1.0; color: "blue" }
+ }
+ border.width: 2
+ border.color: "black";
+ radius: 10
+
+ Text {
+ id: buttonText
+ text: parent.description
+ anchors.centerIn: parent
+ font.pixelSize: parent.height * .5
+ style: Text.Sunken; color: "white"; styleColor: "black"; smooth: true
+ }
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ onClicked: {
+ checked = !checked;
+ }
+ }
+}
property alias operation: buttonText.text
property string color: ""
+ Accessible.name: operation
+ Accessible.description: "This button does " + operation
+ Accessible.role: Accessible.Button
+
signal clicked
source: "images/button-" + color + ".png"; clip: true
--- /dev/null
+TEMPLATE = subdirs
+SUBDIRS += quick
+SUBDIRS += qtquick1
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativeaccessible.h"
+#include "qaccessibledeclarativeview.h"
+#include "qaccessibledeclarativeitem.h"
+
+#include <QtQuick1/qdeclarativeitem.h>
+#include <QtWidgets/qgraphicsview.h>
+
+#include <qaccessibleplugin.h>
+#include <qplugin.h>
+#include <qvariant.h>
+#include <qaccessible.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+class AccessibleQtQuick1Factory : public QAccessiblePlugin
+{
+public:
+ AccessibleQtQuick1Factory();
+
+ QStringList keys() const;
+ QAccessibleInterface *create(const QString &classname, QObject *object);
+};
+
+AccessibleQtQuick1Factory::AccessibleQtQuick1Factory()
+{
+}
+
+QStringList AccessibleQtQuick1Factory::keys() const
+{
+ QStringList list;
+ list << QLatin1String("QDeclarativeView");
+ list << QLatin1String("QDeclarativeItem");
+ return list;
+}
+
+QAccessibleInterface *AccessibleQtQuick1Factory::create(const QString &classname, QObject *object)
+{
+ if (classname == QLatin1String("QDeclarativeView")) {
+ QWidget *widget = qobject_cast<QWidget*>(object);
+ if (qobject_cast<QDeclarativeView *>(widget) != 0)
+ return new QAccessibleDeclarativeView(widget);
+ } else if (classname == QLatin1String("QDeclarativeItem")) {
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem *>(object);
+ if (!item->scene())
+ return 0;
+
+ QList<QGraphicsView *> views = item->scene()->views();
+ if (views.isEmpty())
+ return 0;
+ QGraphicsView *view = views.at(0); // Accessibility support for the first view only.
+ // (Not a problem for QDeclarative)
+ return new QAccessibleDeclarativeItem(item, view);
+ }
+
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(AccessibleQtQuick1Factory)
+Q_EXPORT_PLUGIN2(qtaccessibleqtquick1, AccessibleQtQuick1Factory)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessibledeclarativeitem.h"
+
+#include <QtQuick1/qdeclarativeitem.h>
+#include <QtQuick1/private/qdeclarativeaccessibleattached_p.h>
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleDeclarativeItem::QAccessibleDeclarativeItem(QGraphicsObject *item, QGraphicsView *view)
+ :QDeclarativeAccessible(item)
+ ,m_item(item)
+ ,m_view(view)
+{
+
+}
+
+int QAccessibleDeclarativeItem::childCount() const
+{
+ QList<QGraphicsItem *> children = m_item->childItems();
+ return children.count();
+}
+
+QRect QAccessibleDeclarativeItem::rect() const
+{
+ QRectF sceneRect = m_item->sceneTransform().mapRect(m_item->boundingRect());
+ QPoint pos = m_view->mapFromScene(m_view->mapToGlobal(sceneRect.topLeft().toPoint()));
+ QSize size = sceneRect.size().toSize();
+ return QRect(pos, size);
+}
+
+QRect QAccessibleDeclarativeItem::viewRect() const
+{
+ QPoint screenPos = m_view->mapToGlobal(m_view->pos());
+ return QRect(screenPos, m_view->size());
+}
+
+bool QAccessibleDeclarativeItem::clipsChildren() const
+{
+ return static_cast<QDeclarativeItem *>(m_item)->clip();
+}
+
+static inline bool isAncestor(const QObject *ancestorCandidate, const QObject *child)
+{
+ while (child) {
+ if (child == ancestorCandidate)
+ return true;
+ child = child->parent();
+ }
+ return false;
+}
+
+
+QAccessibleInterface *QAccessibleDeclarativeItem::parent() const
+{
+ QGraphicsItem *parent = m_item->parentItem();
+ QGraphicsObject *parentObj = parent ? parent->toGraphicsObject() : 0;
+ if (parent && !parentObj)
+ qWarning("Can not make QGraphicsItems accessible");
+ QAccessibleInterface *ancestor = (parentObj
+ ? new QAccessibleDeclarativeItem(parentObj, m_view)
+ : QAccessible::queryAccessibleInterface(m_view));
+ return ancestor;
+}
+
+QAccessibleInterface *QAccessibleDeclarativeItem::child(int index) const
+{
+ QList<QGraphicsItem *> children = m_item->childItems();
+
+ if (index >= children.count())
+ return 0;
+
+ QGraphicsItem *child = children.at(index);
+ QGraphicsObject *childObject = qobject_cast<QGraphicsObject *>(child);
+ if (!childObject)
+ return 0;
+
+ return new QAccessibleDeclarativeItem(childObject, m_view);
+}
+
+int QAccessibleDeclarativeItem::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ //qDebug() << "QAccessibleDeclarativeItem navigate" << rel << entry;
+ Q_ASSERT(entry >= 0);
+
+ *target = 0;
+ if (entry == 0) {
+ *target = new QAccessibleDeclarativeItem(m_item->toGraphicsObject(), m_view);
+ return 0;
+ }
+
+ switch (rel) {
+ case QAccessible::Child: {
+ QList<QGraphicsItem *> children = m_item->childItems();
+ const int childIndex = entry - 1;
+
+ if (childIndex >= children.count())
+ return -1;
+
+ QGraphicsItem *child = children.at(childIndex);
+ QGraphicsObject *childObject = qobject_cast<QGraphicsObject *>(child);
+ if (!childObject)
+ return -1;
+
+ *target = new QAccessibleDeclarativeItem(childObject, m_view);
+ return 0;
+ break;}
+ case QAccessible::Ancestor: {
+ Q_ASSERT(entry >= 1);
+ QGraphicsItem *parent = m_item->parentItem();
+ QGraphicsObject *parentObj = parent ? parent->toGraphicsObject() : 0;
+ if (parent && !parentObj)
+ qWarning("Can not make QGraphicsItems accessible");
+ QAccessibleInterface *ancestor = (parentObj
+ ? new QAccessibleDeclarativeItem(parentObj, m_view)
+ : QAccessible::queryAccessibleInterface(m_view));
+ if (entry == 1) {
+ *target = ancestor;
+ return 0;
+ } else if (entry > 1) {
+ int ret = ancestor->navigate(QAccessible::Ancestor, entry - 1, target);
+ delete ancestor;
+ return ret;
+ }
+ break;}
+ case QAccessible::Sibling: {
+ QAccessibleInterface *iface = 0;
+ if (navigate(QAccessible::Ancestor, 1, &iface) == 0) {
+ if (iface) {
+ int ret = iface->navigate(QAccessible::Child, entry, target);
+ delete iface;
+ return ret;
+ }
+ }
+ return -1;
+ break;}
+ case QAccessible::FocusChild: {
+ QGraphicsObject *focusObject = 0;
+ if (m_item->hasFocus()) {
+ focusObject = m_item->toGraphicsObject();
+ } else {
+ if (QGraphicsItem *focusItem = m_view->scene()->focusItem()) {
+ if (m_item->isAncestorOf(focusItem)) {
+ focusObject = focusItem->toGraphicsObject();
+ }
+ }
+ }
+ //qDebug() << "QAccessibleDeclarativeItem navigate QAccessible::FocusChild" << rel << entry;
+ if (focusObject) {
+ *target = new QAccessibleDeclarativeItem(focusObject, m_view);
+ return 0;
+ }
+ }
+ default: break;
+ }
+
+ return -1;
+
+}
+
+int QAccessibleDeclarativeItem::indexOfChild(const QAccessibleInterface *iface) const
+{
+ // ### No QAccessibleInterfaces are created with a QGraphicsItem.
+ // However, we want to support QML, not QGraphicsView in general.
+ // And since the UI is written in QML, this means we can assume that *all*
+ // QGraphicsItems are actually QGraphicsObjects
+
+ const QGraphicsObject *childObj = static_cast<QGraphicsObject*>(iface->object());
+ if (m_item == childObj)
+ return 0;
+
+ QList<QGraphicsItem*> kids = m_item->childItems();
+ int index = kids.indexOf(const_cast<QGraphicsItem*>(static_cast<const QGraphicsItem*>(childObj)));
+ if (index != -1) {
+ ++index;
+ }
+ return index;
+}
+
+QFlags<QAccessible::StateFlag> QAccessibleDeclarativeItem::state() const
+{
+ QAccessible::State state = QAccessible::Normal;
+
+ if (m_item->hasFocus()) {
+ state |= QAccessible::Focused;
+ }
+ return state;
+}
+
+QAccessible::Role QAccessibleDeclarativeItem::role() const
+{
+ // ### Workaround for setAccessibleRole() not working.
+ // Text items are special since they are defined
+ // entirely from C++ (setting the role from QML works.)
+// if (qobject_cast<QDeclarative1Text*>(m_item))
+// return QAccessible::StaticText;
+
+ QVariant v = QDeclarativeAccessibleAttached::property(m_item, "role");
+ bool ok;
+ QAccessible::Role role = (QAccessible::Role)v.toInt(&ok);
+ if (!ok) // Not sure if this check is needed.
+ role = QAccessible::Pane;
+ return role;
+}
+
+bool QAccessibleDeclarativeItem::isAccessible() const
+{
+ return true;
+}
+
+QString QAccessibleDeclarativeItem::text(QAccessible::Text textType) const
+{
+ // handles generic behaviour not specific to an item
+ switch (textType) {
+ case QAccessible::Name: {
+ QVariant accessibleName = QDeclarativeAccessibleAttached::property(object(), "name");
+ if (!accessibleName.isNull())
+ return accessibleName.toString();
+ break;}
+ case QAccessible::Description: {
+ QVariant accessibleDecription = QDeclarativeAccessibleAttached::property(object(), "description");
+ if (!accessibleDecription.isNull())
+ return accessibleDecription.toString();
+ break;}
+ case QAccessible::Value:
+ case QAccessible::Help:
+ case QAccessible::Accelerator:
+ default:
+ break;
+ }
+
+ // the following blocks handles item-specific behaviour
+ if (role() == QAccessible::EditableText) {
+ if (textType == QAccessible::Value) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ } else if (textType == QAccessible::Name) {
+ return object()->objectName();
+ }
+ } else {
+ if (textType == QAccessible::Name) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ }
+ }
+
+
+ return QString();
+}
+
+QT_END_NAMESPACE
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEDECLARATIVEITEM_H
+#define QACCESSIBLEDECLARATIVEITEM_H
+
+#include "qdeclarativeaccessible.h"
+
+#include <QtWidgets/qgraphicsview.h>
+#include <QtWidgets/qgraphicsitem.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAccessibleDeclarativeItem : public QDeclarativeAccessible
+{
+public:
+ QAccessibleDeclarativeItem(QGraphicsObject *item, QGraphicsView *view);
+
+ QRect rect() const;
+ QRect viewRect() const;
+
+ bool clipsChildren() const;
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+
+ QFlags<QAccessible::StateFlag> state() const;
+ QAccessible::Role role() const;
+ QString text(QAccessible::Text) const;
+
+ virtual bool isAccessible() const;
+private:
+ QGraphicsObject *m_item;
+ QGraphicsView *m_view;
+};
+
+QT_END_NAMESPACE
+
+#endif // QACCESSIBLEGRAPHICSVIEWIMPLEMENTATION_H
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessibledeclarativeview.h"
+#include "qdeclarativeaccessible.h"
+#include "qaccessibledeclarativeitem.h"
+
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleDeclarativeView::QAccessibleDeclarativeView(QWidget *widget)
+ :QAccessibleWidget(widget)
+{
+ m_view = static_cast<QDeclarativeView *>(widget);
+}
+
+int QAccessibleDeclarativeView::childCount() const
+{
+ return 1;
+}
+
+QAccessibleInterface *QAccessibleDeclarativeView::child(int index) const
+{
+ if (index == 0) {
+ QDeclarativeItem *declarativeRoot = m_view->accessibleRootItem();
+ return new QAccessibleDeclarativeItem(declarativeRoot, m_view);
+ }
+ return 0;
+}
+
+int QAccessibleDeclarativeView::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ if (rel == QAccessible::Child) {
+ *target = child(entry - 1);
+ return *target ? 0 : -1;
+ }
+ return QAccessibleWidget::navigate(rel, entry, target);
+}
+
+QAccessibleInterface *QAccessibleDeclarativeView::childAt(int x, int y) const
+{
+ return child(0); // return the top-level QML item
+}
+
+int QAccessibleDeclarativeView::indexOfChild(const QAccessibleInterface *iface) const
+{
+ if (iface) {
+ QDeclarativeItem *declarativeRoot = m_view->accessibleRootItem();
+ if (declarativeRoot == iface->object())
+ return 1;
+ }
+ return -1;
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEDECLARATIVEVIEW_H
+#define QACCESSIBLEDECLARATIVEVIEW_H
+
+#include <QtGui/qaccessible2.h>
+#include <QtWidgets/qaccessiblewidget.h>
+
+#include <QtQuick1/qdeclarativeview.h>
+#include <QtQuick1/qdeclarativeitem.h>
+#include <QtWidgets/qwidget.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAccessibleDeclarativeView: public QAccessibleWidget
+{
+public:
+ explicit QAccessibleDeclarativeView(QWidget *widget);
+
+ QAccessibleInterface *child(int index) const;
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ QAccessibleInterface *childAt(int x, int y) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+
+private:
+ QDeclarativeView *m_view;
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QACCESSIBLEDECLARATIVEVIEW_H
--- /dev/null
+contains(QT_CONFIG, accessibility) {
+
+TARGET = qtaccessibleqtquick1
+load(qt_plugin)
+include ($$PWD/../shared/qaccessiblebase.pri)
+
+QT += core-private gui-private widgets-private v8-private declarative-private qtquick1-private
+DESTDIR = $$QT.gui.plugins/accessible
+
+QTDIR_build:REQUIRES += "contains(QT_CONFIG, accessibility)"
+
+DEFINES+=Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+
+SOURCES += \
+ main.cpp \
+ qaccessibledeclarativeview.cpp \
+ qaccessibledeclarativeitem.cpp
+
+HEADERS += \
+ qaccessibledeclarativeview.h \
+ qaccessibledeclarativeitem.h
+}
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include "qdeclarativeaccessible.h"
+#include "qaccessiblequickview.h"
+#include "qaccessiblequickitem.h"
+
+#include <QtQuick/QQuickView>
+#include <QtQuick/QQuickItem>
+
+#include <qaccessibleplugin.h>
+#include <qvariant.h>
+#include <qplugin.h>
+#include <qaccessible.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+class AccessibleQuickFactory : public QAccessiblePlugin
+{
+public:
+ AccessibleQuickFactory();
+
+ QStringList keys() const;
+ QAccessibleInterface *create(const QString &classname, QObject *object);
+};
+
+AccessibleQuickFactory::AccessibleQuickFactory()
+{
+}
+
+QStringList AccessibleQuickFactory::keys() const
+{
+ QStringList list;
+ list << QLatin1String("QQuickView");
+ list << QLatin1String("QQuickItem");
+ return list;
+}
+
+QAccessibleInterface *AccessibleQuickFactory::create(const QString &classname, QObject *object)
+{
+ if (classname == QLatin1String("QQuickView")) {
+ return new QAccessibleQuickView(qobject_cast<QQuickView *>(object)); // FIXME
+ } else if (classname == QLatin1String("QQuickItem")) {
+ QQuickItem * item = qobject_cast<QQuickItem *>(object);
+ Q_ASSERT(item);
+ return new QAccessibleQuickItem(item);
+ }
+
+ return 0;
+}
+
+Q_EXPORT_STATIC_PLUGIN(AccessibleQuickFactory)
+Q_EXPORT_PLUGIN2(qtaccessiblequick, AccessibleQuickFactory)
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblequickitem.h"
+#include "QtQuick/private/qquickitem_p.h"
+#include "QtQuick/private/qquicktext_p.h"
+#include "QtQuick/private/qquickaccessibleattached_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item)
+ : QDeclarativeAccessible(item)
+ , m_item(item)
+{
+}
+
+int QAccessibleQuickItem::childCount() const
+{
+ return childItems().count();
+}
+
+QRect QAccessibleQuickItem::rect() const
+{
+ // ### no canvas in some cases.
+ // ### Should we really check for 0 opacity?
+ if (!m_item->canvas() ||!m_item->isVisible() || qFuzzyIsNull(m_item->opacity())) {
+ return QRect();
+ }
+
+ QSizeF size = QSizeF(m_item->width(), m_item->height());
+ // ### If the bounding rect fails, we first try the implicit size, then we go for the
+ // parent size. WE MIGHT HAVE TO REVISIT THESE FALLBACKS.
+ if (size.isEmpty()) {
+ size = QSizeF(m_item->implicitWidth(), m_item->implicitHeight());
+ if (size.isEmpty())
+ // ### Seems that the above fallback is not enough, fallback to use the parent size...
+ size = QSizeF(m_item->parentItem()->width(), m_item->parentItem()->height());
+ }
+
+ QRectF sceneRect = m_item->mapRectToScene(QRectF(QPointF(0, 0), size));
+ QPoint screenPos = m_item->canvas()->mapToGlobal(sceneRect.topLeft().toPoint());
+
+ QRect r = QRect(screenPos, sceneRect.size().toSize());
+
+ if (!r.isValid()) {
+ qWarning() << m_item->metaObject()->className() << m_item->property("accessibleText") << r;
+ }
+ return r;
+}
+
+QRect QAccessibleQuickItem::viewRect() const
+{
+ // ### no canvas in some cases.
+ if (!m_item->canvas()) {
+ return QRect();
+ }
+
+ QQuickCanvas *canvas = m_item->canvas();
+ QPoint screenPos = canvas->mapToGlobal(QPoint(0,0));
+ return QRect(screenPos, canvas->size());
+}
+
+
+bool QAccessibleQuickItem::clipsChildren() const
+{
+ return static_cast<QQuickItem *>(m_item)->clip();
+}
+
+
+QAccessibleInterface *QAccessibleQuickItem::parent() const
+{
+ QQuickItem *parent = m_item->parentItem();
+ if (parent) {
+ QQuickCanvas *canvas = m_item->canvas();
+ // Jump out to the scene widget if the parent is the root item.
+ // There are two root items, QQuickCanvas::rootItem and
+ // QQuickView::declarativeRoot. The former is the true root item,
+ // but is not a part of the accessibility tree. Check if we hit
+ // it here and return an interface for the scene instead.
+ if (parent == canvas->rootItem()) {
+ return QAccessible::queryAccessibleInterface(canvas);
+ } else {
+ QDeclarativeAccessible *ancestor = new QAccessibleQuickItem(parent);
+ return ancestor;
+ }
+ }
+ return 0;
+}
+
+QAccessibleInterface *QAccessibleQuickItem::child(int index) const
+{
+ QList<QQuickItem *> children = childItems();
+
+ if (index < 0 || index >= children.count())
+ return 0;
+
+ QQuickItem *child = children.at(index);
+ if (!child) // FIXME can this happen?
+ return 0;
+
+ return new QAccessibleQuickItem(child);
+}
+
+int QAccessibleQuickItem::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ *target = 0;
+ if (entry == 0) {
+ *target = new QAccessibleQuickItem(m_item);
+ return 0;
+ }
+
+ switch (rel) {
+ case QAccessible::Child: { // FIMXE
+ QList<QQuickItem *> children = childItems();
+ const int childIndex = entry - 1;
+
+ if (childIndex >= children.count())
+ return -1;
+
+ QQuickItem *child = children.at(childIndex);
+ if (!child)
+ return -1;
+
+ *target = new QAccessibleQuickItem(child);
+ return 0;
+ break;}
+ case QAccessible::Ancestor: { // FIMXE
+ QQuickItem *parent = m_item->parentItem();
+ if (parent) {
+ QDeclarativeAccessible *ancestor = new QAccessibleQuickItem(parent);
+ if (entry == 1) {
+ QQuickCanvas *canvas = m_item->canvas();
+ // Jump out to the scene widget if the parent is the root item.
+ // There are two root items, QQuickCanvas::rootItem and
+ // QQuickView::declarativeRoot. The former is the true root item,
+ // but is not a part of the accessibility tree. Check if we hit
+ // it here and return an interface for the scene instead.
+ if (parent == canvas->rootItem()) {
+ *target = QAccessible::queryAccessibleInterface(canvas);
+ } else {
+ *target = ancestor;
+ }
+ return 0;
+ } else if (entry > 1) {
+ int ret = ancestor->navigate(QAccessible::Ancestor, entry - 1, target);
+ delete ancestor;
+ return ret;
+ }
+ }
+ return -1;
+ break;}
+ default: break;
+ }
+
+ return -1;
+}
+
+int QAccessibleQuickItem::indexOfChild(const QAccessibleInterface *iface) const
+{
+ QList<QQuickItem*> kids = childItems();
+ int idx = kids.indexOf(static_cast<QQuickItem*>(iface->object()));
+ if (idx != -1)
+ ++idx;
+ return idx;
+}
+
+QList<QQuickItem *> QAccessibleQuickItem::childItems() const
+{
+ if (role() == QAccessible::Button)
+ return QList<QQuickItem *>();
+ return m_item->childItems();
+}
+
+QFlags<QAccessible::StateFlag> QAccessibleQuickItem::state() const
+{
+ QAccessible::State state = QAccessible::Normal;
+
+ if (m_item->hasActiveFocus()) {
+ state |= QAccessible::Focused;
+ }
+ return state;
+}
+
+
+QAccessible::Role QAccessibleQuickItem::role() const
+{
+ // Workaround for setAccessibleRole() not working for
+ // Text items. Text items are special since they are defined
+ // entirely from C++ (setting the role from QML works.)
+ if (qobject_cast<QQuickText*>(const_cast<QQuickItem *>(m_item)))
+ return QAccessible::StaticText;
+
+ QVariant v = QQuickAccessibleAttached::property(m_item, "role");
+ bool ok;
+ QAccessible::Role role = (QAccessible::Role)v.toInt(&ok);
+ if (!ok) // Not sure if this check is needed.
+ role = QAccessible::Pane;
+ return role;
+}
+
+bool QAccessibleQuickItem::isAccessible() const
+{
+ return m_item->d_func()->isAccessible;
+}
+
+QString QAccessibleQuickItem::text(QAccessible::Text textType) const
+{
+ // handles generic behavior not specific to an item
+ switch (textType) {
+ case QAccessible::Name: {
+ QVariant accessibleName = QQuickAccessibleAttached::property(object(), "name");
+ if (!accessibleName.isNull())
+ return accessibleName.toString();
+ break;}
+ case QAccessible::Description: {
+ QVariant accessibleDecription = QQuickAccessibleAttached::property(object(), "description");
+ if (!accessibleDecription.isNull())
+ return accessibleDecription.toString();
+ break;}
+#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+ case QAccessible::DebugDescription: {
+ QString debugString;
+ debugString = QString::fromAscii(object()->metaObject()->className()) + QLatin1Char(' ');
+ debugString += isAccessible() ? QLatin1String("enabled") : QLatin1String("disabled");
+ return debugString;
+ break; }
+#endif
+ case QAccessible::Value:
+ case QAccessible::Help:
+ case QAccessible::Accelerator:
+ default:
+ break;
+ }
+
+ // the following blocks handles item-specific behavior
+ if (role() == QAccessible::EditableText) {
+ if (textType == QAccessible::Value) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ } else if (textType == QAccessible::Name) {
+ return object()->objectName();
+ }
+ } else {
+ if (textType == QAccessible::Name) {
+ QVariant text = object()->property("text");
+ return text.toString();
+ }
+ }
+
+
+ return QString();
+}
+
+QT_END_NAMESPACE
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QACCESSIBLEQUICKITEM_H
+#define QACCESSIBLEQUICKITEM_H
+
+#include <QtQuick/QQuickItem>
+#include <QtQuick/QQuickView>
+#include "qdeclarativeaccessible.h"
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAccessibleQuickItem : public QDeclarativeAccessible
+{
+public:
+ QAccessibleQuickItem(QQuickItem *item);
+
+ QRect rect() const;
+ QRect viewRect() const;
+
+ bool clipsChildren() const;
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+ QList<QQuickItem *> childItems() const;
+
+ QFlags<QAccessible::StateFlag> state() const;
+ QAccessible::Role role() const;
+ QString text(QAccessible::Text) const;
+
+ bool isAccessible() const;
+private:
+ QQuickItem *m_item;
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QACCESSIBLEQUICKITEM_H
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qaccessiblequickview.h"
+
+#include <QtQuick/qquickitem.h>
+
+#include "qaccessiblequickitem.h"
+#include "qdeclarativeaccessible.h"
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+QAccessibleQuickView::QAccessibleQuickView(QQuickView *object)
+ :QAccessibleObject(object)
+{
+ m_view = static_cast<QQuickView *>(object);
+}
+
+int QAccessibleQuickView::childCount() const
+{
+ return m_view->rootItem() ? 1 : 0;
+}
+
+QAccessibleInterface *QAccessibleQuickView::parent() const
+{
+ // FIXME: for now we assume to be a top level window...
+ return QAccessible::queryAccessibleInterface(qApp);
+}
+
+QAccessibleInterface *QAccessibleQuickView::child(int index) const
+{
+ if (index == 0) {
+ QQuickItem *declarativeRoot = m_view->rootObject();
+ return new QAccessibleQuickItem(declarativeRoot);
+ }
+ return 0;
+}
+
+QAccessible::Role QAccessibleQuickView::role() const
+{
+ return QAccessible::Window; // FIXME
+}
+
+QAccessible::State QAccessibleQuickView::state() const
+{
+ return QAccessible::Normal; // FIXME
+}
+
+QRect QAccessibleQuickView::rect() const
+{
+ return QRect(m_view->x(), m_view->y(), m_view->width(), m_view->height());
+}
+
+int QAccessibleQuickView::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
+{
+ switch (rel) {
+ case QAccessible::Child:
+ *target = child(entry - 1);
+ case QAccessible::Ancestor:
+ *target = parent();
+ default:
+ *target = 0;
+ }
+ return *target ? 0 : -1;
+}
+
+QString QAccessibleQuickView::text(QAccessible::Text text) const
+{
+#ifdef Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+ if (text == QAccessible::DebugDescription) {
+ return QString::fromAscii(object()->metaObject()->className()) ;
+ }
+#endif
+ return m_view->windowTitle();
+}
+
+QAccessibleInterface *QAccessibleQuickView::childAt(int x, int y) const
+{
+ Q_UNUSED(x);
+ Q_UNUSED(y);
+ return child(0); // return the top-level QML item
+}
+
+int QAccessibleQuickView::indexOfChild(const QAccessibleInterface *iface) const
+{
+ if (iface) {
+ QQuickItem *declarativeRoot = m_view->rootObject();
+ if (declarativeRoot == iface->object())
+ return 1;
+ }
+ return -1;
+
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAccessibleQuickView_H
+#define QAccessibleQuickView_H
+
+#include <QtGui/qaccessible2.h>
+#include <QtGui/qaccessibleobject.h>
+#include <QtQuick/qquickview.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+class QAccessibleQuickView : public QAccessibleObject
+{
+public:
+ QAccessibleQuickView(QQuickView *object);
+
+ QAccessibleInterface *parent() const;
+ QAccessibleInterface *child(int index) const;
+
+ QAccessible::Role role() const;
+ QAccessible::State state() const;
+ QRect rect() const;
+
+ int childCount() const;
+ int navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const;
+ int indexOfChild(const QAccessibleInterface *iface) const;
+ QString text(QAccessible::Text text) const;
+ QAccessibleInterface *childAt(int x, int y) const;
+private:
+ QQuickView *m_view;
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QAccessibleQuickView_H
--- /dev/null
+contains(QT_CONFIG, accessibility) {
+
+TARGET = qtaccessiblequick
+load(qt_plugin)
+include ($$PWD/../shared/qaccessiblebase.pri)
+
+QT += core-private gui-private v8-private declarative-private quick-private
+DESTDIR = $$QT.gui.plugins/accessible
+
+QTDIR_build:REQUIRES += "contains(QT_CONFIG, accessibility)"
+
+#DEFINES+=Q_ACCESSIBLE_QUICK_ITEM_ENABLE_DEBUG_DESCRIPTION
+
+SOURCES += \
+ main.cpp \
+ qaccessiblequickview.cpp \
+ qaccessiblequickitem.cpp
+
+HEADERS += \
+ qaccessiblequickview.h \
+ qaccessiblequickitem.h
+}
+
--- /dev/null
+target.path += $$[QT_INSTALL_PLUGINS]/accessible
+INSTALLS += target
+
+INCLUDEPATH += $$PWD
+DEPENDPATH += $$PWD
+SOURCES += $$PWD/qdeclarativeaccessible.cpp
+HEADERS += $$PWD/qdeclarativeaccessible.h
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qnamespace.h>
+#include "qdeclarativeaccessible.h"
+
+#ifndef QT_NO_ACCESSIBILITY
+
+QT_BEGIN_NAMESPACE
+
+
+QString Q_GUI_EXPORT qTextBeforeOffsetFromString(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset, const QString& text);
+QString Q_GUI_EXPORT qTextAtOffsetFromString(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset, const QString& text);
+QString Q_GUI_EXPORT qTextAfterOffsetFromString(int offset, QAccessible2::BoundaryType boundaryType,
+ int *startOffset, int *endOffset, const QString& text);
+
+QDeclarativeAccessible::QDeclarativeAccessible(QObject *object)
+ :QAccessibleObject(object)
+{
+}
+
+QDeclarativeAccessible::~QDeclarativeAccessible()
+{
+}
+
+QFlags<QAccessible::RelationFlag> QDeclarativeAccessible::relationTo(const QAccessibleInterface *) const
+{
+ return QAccessible::Unrelated;
+}
+
+QAccessibleInterface *QDeclarativeAccessible::childAt(int x, int y) const
+{
+ // Look for children first.
+ // Start with the last child first, because children are ordered in paint order
+ // (which is opposite of hit test order)
+
+ // If the item clips its children, we can return early if the coordinate is outside its rect
+ if (clipsChildren()) {
+ if (!rect().contains(x, y))
+ return 0;
+ }
+
+ for (int i = childCount() - 1; i >= 0; --i) {
+ QAccessibleInterface *childIface = child(i);
+ if (childIface && !(childIface->state() & QAccessible::Invisible)) {
+ if (childIface->rect().contains(x, y))
+ return childIface;
+ }
+ }
+ return 0;
+}
+
+QFlags<QAccessible::StateFlag> QDeclarativeAccessible::state() const
+{
+ QAccessible::State state;// = state();
+
+ //QRect viewRect(QPoint(0, 0), m_implementation->size());
+ //QRect itemRect(m_item->scenePos().toPoint(), m_item->boundingRect().size().toSize());
+
+ QRect viewRect_ = viewRect();
+ QRect itemRect = rect();
+
+ // qDebug() << "viewRect" << viewRect << "itemRect" << itemRect;
+ // error case:
+ if (viewRect_.isNull() || itemRect.isNull()) {
+ state |= QAccessible::Invisible;
+ }
+
+ if (!viewRect_.intersects(itemRect)) {
+ state |= QAccessible::Offscreen;
+ // state |= QAccessible::Invisible; // no set at this point to ease development
+ }
+
+ if (!object()->property("visible").toBool() || qFuzzyIsNull(object()->property("opacity").toDouble())) {
+ state |= QAccessible::Invisible;
+ }
+
+ if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && object()->property("checked").toBool()) {
+ state |= QAccessible::Checked;
+ }
+
+ if (role() == QAccessible::EditableText)
+ state |= QAccessible::Focusable;
+
+ //qDebug() << "state?" << m_item->property("state").toString() << m_item->property("status").toString() << m_item->property("visible").toString();
+
+ return state;
+}
+
+QStringList QDeclarativeAccessible::actionNames() const
+{
+ QStringList actions;
+ switch (role()) {
+ case QAccessible::PushButton:
+ actions << QAccessibleActionInterface::pressAction();
+ break;
+ case QAccessible::RadioButton:
+ case QAccessible::CheckBox:
+ actions << QAccessibleActionInterface::checkAction();
+ break;
+ default:
+ break;
+ }
+ return actions;
+}
+
+void QDeclarativeAccessible::doAction(const QString &actionName)
+{
+ if (role() == QAccessible::PushButton && actionName == QAccessibleActionInterface::pressAction()) {
+ QMetaObject::invokeMethod(object(), "accessibleAction");
+ }
+ if ((role() == QAccessible::CheckBox || role() == QAccessible::RadioButton) && actionName == QAccessibleActionInterface::checkAction()) {
+ bool checked = object()->property("checked").toBool();
+ object()->setProperty("checked", QVariant(!checked));
+ }
+}
+
+QStringList QDeclarativeAccessible::keyBindingsForAction(const QString &actionName) const
+{
+ Q_UNUSED(actionName)
+ return QStringList();
+}
+
+QVariant QDeclarativeAccessible::invokeMethod(QAccessible::Method method, const QVariantList&)
+{
+ Q_UNUSED(method)
+ return QVariant();
+}
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_ACCESSIBILITY
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDECLARATIVEACCESSIBLE_H
+#define QDECLARATIVEACCESSIBLE_H
+
+#include <QtGui/qaccessibleobject.h>
+#include <QtGui/qaccessible2.h>
+//#include <QtQuick1/qdeclarativeview.h>
+//#include <QtQuick1/qdeclarativeitem.h>
+#include <QtDeclarative/qdeclarativeproperty.h>
+
+//#include <private/qdeclarativeaccessible_p.h>
+
+QT_BEGIN_NAMESPACE
+
+#ifndef QT_NO_ACCESSIBILITY
+
+/*
+ -- Declarative Accessibility Overview. --
+
+ * Item interface classes:
+ QAccessibleDeclarativeItem for QtQuick1
+ QAccessibleQuickItem for for QtQuick2
+ Common base class: QDeclarativeAccessible
+
+ * View interface classes.
+
+ These are the root of the QML accessible tree and connects it to the widget hierarchy.
+
+ QAccessbileDeclarativeView is the root for the QGraphicsView implementation
+ QAccessbileQuickView is the root for the SceneGraph implementation
+
+*/
+class QDeclarativeAccessible: public QAccessibleObject, public QAccessibleActionInterface
+{
+public:
+ ~QDeclarativeAccessible();
+
+ virtual QRect viewRect() const = 0;
+ QFlags<QAccessible::RelationFlag> relationTo(const QAccessibleInterface*) const;
+ QAccessibleInterface *childAt(int, int) const;
+ QFlags<QAccessible::StateFlag> state() const;
+ QVariant invokeMethod(QAccessible::Method, const QVariantList &);
+
+ QStringList actionNames() const;
+ void doAction(const QString &actionName);
+ QStringList keyBindingsForAction(const QString &actionName) const;
+
+protected:
+ virtual bool clipsChildren() const = 0;
+ // For subclasses, use instantiateObject factory method outside the class.
+ QDeclarativeAccessible(QObject *object);
+};
+
+#endif // QT_NO_ACCESSIBILITY
+
+QT_END_NAMESPACE
+
+#endif // QDECLARATIVEACCESSIBLE_H
TEMPLATE = subdirs
SUBDIRS += qmltooling
+SUBDIRS += accessible
HEADERS += \
$$PWD/qdeclarativeitemsmodule_p.h \
+ $$PWD/qdeclarativeaccessibleattached_p.h \
$$PWD/qdeclarativeanchors_p.h \
$$PWD/qdeclarativeanchors_p_p.h \
$$PWD/qdeclarativeevents_p_p.h \
SOURCES += \
$$PWD/qdeclarativeitemsmodule.cpp \
+ $$PWD/qdeclarativeaccessibleattached.cpp \
$$PWD/qdeclarativeanchors.cpp \
$$PWD/qdeclarativeevents.cpp \
$$PWD/qdeclarativeflickable.cpp \
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qdeclarativeaccessibleattached_p.h"
+
+#ifndef QT_NO_ACCESSIBILITY
+
+#include "private/qdeclarativeitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+
+QDeclarativeAccessibleAttached::QDeclarativeAccessibleAttached(QObject *parent)
+ : QObject(parent)
+{
+ Q_ASSERT(parent);
+ QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(parent);
+ if (!item)
+ return;
+
+ // Enable accessibility for items with accessible content. This also
+ // enables accessibility for the ancestors of such items.
+ item->d_func()->setAccessibleFlagAndListener();
+ QAccessible::updateAccessibility(item, 0, QAccessible::ObjectCreated);
+}
+
+QDeclarativeAccessibleAttached::~QDeclarativeAccessibleAttached()
+{
+}
+
+QDeclarativeAccessibleAttached *QDeclarativeAccessibleAttached::qmlAttachedProperties(QObject *obj)
+{
+ return new QDeclarativeAccessibleAttached(obj);
+}
+
+QT_END_NAMESPACE
+
+#endif
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICK1ACCESSIBLEATTACHED_H
+#define QQUICK1ACCESSIBLEATTACHED_H
+
+#include <qdeclarativeitem.h>
+
+#include <QtCore/qobject.h>
+#include <QtCore/qstring.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+#include <private/qdeclarativeglobal_p.h>
+#include <QtGui/qaccessible.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_QTQUICK1_EXPORT QDeclarativeAccessibleAttached : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QAccessible::Role role READ role WRITE setRole NOTIFY roleChanged)
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged)
+
+public:
+ Q_ENUMS(QAccessible::Role QAccessible::Event QAccessible::State)
+
+ QDeclarativeAccessibleAttached(QObject *parent);
+ ~QDeclarativeAccessibleAttached();
+
+ QAccessible::Role role() const { return m_role; }
+ void setRole(QAccessible::Role role)
+ {
+ m_role = role;
+ emit roleChanged();
+ // There is no way to signify role changes at the moment.
+ // QAccessible::updateAccessibility(parent(), 0, QAccessible::);
+ }
+ QString name() const { return m_name; }
+ void setName(const QString &name)
+ {
+ m_name = name;
+ emit nameChanged();
+ QAccessible::updateAccessibility(parent(), 0, QAccessible::NameChanged);
+ }
+
+ QString description() const { return m_description; }
+ void setDescription(const QString &description)
+ {
+ m_description = description;
+ emit descriptionChanged();
+ QAccessible::updateAccessibility(parent(), 0, QAccessible::DescriptionChanged);
+ }
+
+ // Factory function
+ static QDeclarativeAccessibleAttached *qmlAttachedProperties(QObject *);
+
+ // Property getter
+ static QObject *attachedProperties(const QObject *obj)
+ {
+ return qmlAttachedPropertiesObject<QDeclarativeAccessibleAttached>(obj, false);
+ }
+
+ static QVariant property(const QObject *object, const char *propertyName)
+ {
+ if (QObject *attachedObject = QDeclarativeAccessibleAttached::attachedProperties(object))
+ return attachedObject->property(propertyName);
+ return QVariant();
+ }
+
+ static bool setProperty(QObject *object, const char *propertyName, const QVariant &value)
+ {
+ QObject *obj = qmlAttachedPropertiesObject<QDeclarativeAccessibleAttached>(object, true);
+ if (!obj) {
+ qWarning("cannot set property Accessible.%s of QObject %s", propertyName, object->metaObject()->className());
+ return false;
+ }
+ return obj->setProperty(propertyName, value);
+ }
+
+
+Q_SIGNALS:
+ void roleChanged();
+ void nameChanged();
+ void descriptionChanged();
+private:
+ QAccessible::Role m_role;
+ QString m_name;
+ QString m_description;
+public:
+ using QObject::property;
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QDeclarativeAccessibleAttached)
+QML_DECLARE_TYPEINFO(QDeclarativeAccessibleAttached, QML_HAS_ATTACHED_PROPERTIES)
+
+QT_END_HEADER
+
+#endif // QT_NO_ACCESSIBILITY
+
+#endif
+
#include <QtQuick1/private/qdeclarativestategroup_p.h>
#include <QtDeclarative/qdeclarativecomponent.h>
#include <QtDeclarative/qdeclarativeinfo.h>
+// ### Due to the workaround mentioned in accessibleRole()
+#include <QtQuick1/private/qdeclarativetext_p.h>
#include <QDebug>
#include <QPen>
#include <private/qv8engine_p.h>
#include <QtWidgets/qgraphicstransform.h>
#include <private/qlistmodelinterface_p.h>
+#include <QAccessible>
+#include <QtQuick1/private/qdeclarativeaccessibleattached_p.h>
#include <float.h>
*/
void QDeclarativeItem::setParentItem(QDeclarativeItem *parent)
{
+ Q_D(QDeclarativeItem);
QGraphicsObject::setParentItem(parent);
+ if (d->isAccessible && parentItem()) {
+ parentItem()->d_func()->setAccessibleFlagAndListener();
+ }
}
/*!
baseline.anchorLine = QDeclarative1AnchorLine::Baseline;
}
+void QDeclarativeItemPrivate::setAccessibleFlagAndListener()
+{
+ Q_Q(QDeclarativeItem);
+ QDeclarativeItem *item = q;
+ while (item) {
+ if (item->d_func()->isAccessible)
+ break; // already set - grandparents should have the flag set as well.
+
+// if (qmlEngine(item) != 0) {
+// item->d_func()->addItemChangeListener(QDeclarativeEnginePrivate::getAccessibilityUpdateManager(qmlEngine(item)),
+// QDeclarativeItemPrivate::Geometry | QDeclarativeItemPrivate::Visibility |
+// QDeclarativeItemPrivate::Opacity | QDeclarativeItemPrivate::Destroyed);
+// }
+
+ item->d_func()->isAccessible = true;
+ item = item->parentItem();
+ }
+}
+
QPointF QDeclarativeItemPrivate::computeTransformOrigin() const
{
Q_Q(const QDeclarativeItem);
#include <QtGui/qfont.h>
#include <QtWidgets/qgraphicsitem.h>
#include <QtWidgets/qgraphicstransform.h>
+#include <QtGui/qaccessible.h>
#include <QtWidgets/qaction.h>
QT_BEGIN_HEADER
private:
Q_DISABLE_COPY(QDeclarativeItem)
Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeItem)
+
+ friend class QDeclarativeAccessibleAttached;
};
template<typename T>
#include <QtCore/qlist.h>
#include <QtCore/qrect.h>
#include <QtCore/qdebug.h>
+#include <QtGui/qaccessible.h>
#include <QtWidgets/private/qgraphicsitem_p.h>
bool isMirrorImplicit:1;
bool inheritMirrorFromParent:1;
bool inheritMirrorFromItem:1;
+ bool isAccessible:1;
QDeclarativeItemKeyFilter *keyHandler;
QDeclarative1LayoutMirroringAttached* attachedLayoutDirection;
bool hadSubFocusItem;
+ void setAccessibleFlagAndListener();
QPointF computeTransformOrigin() const;
static const SigMap sigMap[];
};
+
Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeItemPrivate::ChangeTypes);
QT_END_NAMESPACE
#include "QtQuick1/private/qdeclarativegraphicswidget_p.h"
#include "QtQuick1/private/qdeclarativeanchors_p.h"
#include "QtQuick1/private/qdeclarativepincharea_p.h"
+#include "QtQuick1/private/qdeclarativeaccessibleattached_p.h"
static QDeclarativePrivate::AutoParentResult qgraphicsobject_autoParent(QObject *obj, QObject *parent)
{
qmlRegisterRevision<QDeclarative1ImplicitSizePaintedItem,0>("QtQuick",1,0);
qmlRegisterRevision<QDeclarative1ImplicitSizePaintedItem,1>("QtQuick",1,1);
qmlRegisterUncreatableType<QDeclarative1LayoutMirroringAttached>("QtQuick",1,1,"LayoutMirroring", QDeclarative1LayoutMirroringAttached::tr("LayoutMirroring is only available via attached properties"));
+#ifndef QT_NO_ACCESSIBILITY
+ qmlRegisterUncreatableType<QDeclarativeAccessibleAttached>("QtQuick",1,0,"Accessible",QDeclarativeAccessibleAttached::tr("Accessible is only available via attached properties"));
+ qmlRegisterUncreatableType<QDeclarativeAccessibleAttached>("QtQuick",1,1,"Accessible",QDeclarativeAccessibleAttached::tr("Accessible is only available via attached properties"));
+#endif
+
} else if (module == QDeclarativeQtQuick1Module::Qt47) {
#ifdef QT_NO_MOVIE
qmlRegisterTypeNotAvailable("Qt",4,7,"AnimatedImage",
}
+QDeclarativeItem * QDeclarativeView::accessibleRootItem() const
+{
+ Q_D(const QDeclarativeView);
+ return d->declarativeItemRoot;
+}
+
QT_END_NAMESPACE
class QDeclarativeEngine;
class QDeclarativeContext;
class QDeclarativeError;
+class QDeclarativeItem;
QT_MODULE(Declarative)
private:
Q_DISABLE_COPY(QDeclarativeView)
Q_DECLARE_PRIVATE(QDeclarativeView)
+// Accessibility support:
+ friend class QAccessibleDeclarativeView;
+ QDeclarativeItem *accessibleRootItem() const;
};
QT_END_NAMESPACE
HEADERS += \
$$PWD/qquickevents_p_p.h \
- $$PWD/qquickitemchangelistener_p.h \
$$PWD/qquickanchors_p.h \
$$PWD/qquickanchors_p_p.h \
+ $$PWD/qquickaccessibleattached_p.h \
$$PWD/qquickitem.h \
$$PWD/qquickitem_p.h \
+ $$PWD/qquickitemchangelistener_p.h \
$$PWD/qquickrectangle_p.h \
$$PWD/qquickrectangle_p_p.h \
$$PWD/qquickcanvas.h \
$$PWD/qquickspriteengine.cpp \
$$PWD/qquicksprite.cpp \
$$PWD/qquickspriteimage.cpp \
+ $$PWD/qquickaccessibleattached.cpp \
$$PWD/qquickdrag.cpp \
$$PWD/qquickdroparea.cpp \
$$PWD/qquickmultipointtoucharea.cpp \
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickaccessibleattached_p.h"
+
+#ifndef QT_NO_ACCESSIBILITY
+
+#include "private/qquickitem_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \qmlclass Accessible QQuickAccessibleAttached
+ \inqmlmodule QtQuick 2
+ \ingroup qml-basic-interaction-elements
+ \brief Attached property to enable accessibility of QML items.
+
+ Items the user interacts with or that give information to the user
+ need to expose their information in a semantic way.
+ Then assistive tools can make use of that information to enable
+ users to interact with the application in various ways.
+
+ This enables Qt Quick applications to be used with screen-readers for example.
+
+ The most important properties to set are \l name and \l role.
+
+ \sa Accessibility
+*/
+
+/*!
+ \qmlproperty string QtQuick2::Accessible::name
+
+ This property sets an accessible name.
+ For a button for example, this should have a binding to its text.
+ In general this property should be set to a simple and concise
+ but human readable name. Do not include the type of control
+ you want to represent but just the name.
+*/
+
+/*!
+ \qmlproperty string QtQuick2::Accessible::description
+
+ This property sets an accessible description.
+ Similar to the name it describes the item. The description
+ can be a little more verbose and tell what the item does,
+ for example the functionallity of the button it describes.
+*/
+
+/*!
+ \qmlproperty enumeration QtQuick2::Accessible::role
+
+ This flags sets the semantic type of the widget.
+ A button for example would have "Button" as type.
+ The value must be one of \l QAccessible::Role .
+ Example:
+ \qml
+ Item {
+ id: myButton
+ Text {
+ id: label
+ // ...
+ }
+ Accessible.name: label.text
+ Accessible.role: Accessible.Button
+ }
+ \endqml
+*/
+
+QQuickAccessibleAttached::QQuickAccessibleAttached(QObject *parent)
+ : QObject(parent)
+{
+ Q_ASSERT(parent);
+ QQuickItem *item = qobject_cast<QQuickItem*>(parent);
+ if (!item)
+ return;
+
+ // Enable accessibility for items with accessible content. This also
+ // enables accessibility for the ancestors of souch items.
+ item->d_func()->setAccessibleFlagAndListener();
+ QAccessible::updateAccessibility(item, 0, QAccessible::ObjectCreated);
+}
+
+QQuickAccessibleAttached::~QQuickAccessibleAttached()
+{
+}
+
+QQuickAccessibleAttached *QQuickAccessibleAttached::qmlAttachedProperties(QObject *obj)
+{
+ return new QQuickAccessibleAttached(obj);
+}
+
+QT_END_NAMESPACE
+
+#endif
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKACCESSIBLEATTACHED_H
+#define QQUICKACCESSIBLEATTACHED_H
+
+#include <QtQuick/qquickitem.h>
+
+#include <QtCore/qobject.h>
+#include <QtCore/qstring.h>
+
+#ifndef QT_NO_ACCESSIBILITY
+
+#include <QtGui/qaccessible.h>
+#include <private/qtquickglobal_p.h>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+QT_MODULE(Declarative)
+
+class Q_QUICK_PRIVATE_EXPORT QQuickAccessibleAttached : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QAccessible::Role role READ role WRITE setRole NOTIFY roleChanged)
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
+ Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY descriptionChanged)
+
+public:
+ Q_ENUMS(QAccessible::Role QAccessible::Event QAccessible::State)
+
+ QQuickAccessibleAttached(QObject *parent);
+ ~QQuickAccessibleAttached();
+
+ QAccessible::Role role() const { return m_role; }
+ void setRole(QAccessible::Role role)
+ {
+ if (role != m_role) {
+ m_role = role;
+ emit roleChanged();
+ // There is no way to signify role changes at the moment.
+ // QAccessible::updateAccessibility(parent(), 0, QAccessible::);
+ }
+ }
+ QString name() const { return m_name; }
+ void setName(const QString &name) {
+ if (name != m_name) {
+ m_name = name;
+ emit nameChanged();
+ QAccessible::updateAccessibility(parent(), 0, QAccessible::NameChanged);
+ }
+ }
+
+ QString description() const { return m_description; }
+ void setDescription(const QString &description)
+ {
+ if (m_description != description) {
+ m_description = description;
+ emit descriptionChanged();
+ QAccessible::updateAccessibility(parent(), 0, QAccessible::DescriptionChanged);
+ }
+ }
+
+ // Factory function
+ static QQuickAccessibleAttached *qmlAttachedProperties(QObject *obj);
+
+ // Property getter
+ static QObject *attachedProperties(const QObject *obj)
+ {
+ return qmlAttachedPropertiesObject<QQuickAccessibleAttached>(obj, false);
+ }
+
+ static QVariant property(const QObject *object, const char *propertyName)
+ {
+ if (QObject *attachedObject = QQuickAccessibleAttached::attachedProperties(object))
+ return attachedObject->property(propertyName);
+ return QVariant();
+ }
+
+ static bool setProperty(QObject *object, const char *propertyName, const QVariant &value)
+ {
+ QObject *obj = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(object, true);
+ if (!obj) {
+ qWarning("cannot set property Accessible.%s of QObject %s", propertyName, object->metaObject()->className());
+ return false;
+ }
+ return obj->setProperty(propertyName, value);
+ }
+
+
+Q_SIGNALS:
+ void roleChanged();
+ void nameChanged();
+ void descriptionChanged();
+private:
+ QAccessible::Role m_role;
+ QString m_name;
+ QString m_description;
+
+public:
+ using QObject::property;
+};
+
+
+QT_END_NAMESPACE
+
+QML_DECLARE_TYPE(QQuickAccessibleAttached)
+QML_DECLARE_TYPEINFO(QQuickAccessibleAttached, QML_HAS_ATTACHED_PROPERTIES)
+
+QT_END_HEADER
+
+#endif // QT_NO_ACCESSIBILITY
+
+#endif
bool m_eventSent;
};
+QAccessibleInterface *QQuickCanvas::accessibleRoot() const
+{
+ return QAccessible::queryAccessibleInterface(const_cast<QQuickCanvas*>(this));
+}
/*
QDeclarativeIncubationController *incubationController() const;
+ virtual QAccessibleInterface *accessibleRoot() const;
+
// Scene graph specific functions
QSGTexture *createTextureFromImage(const QImage &image) const;
QSGTexture *createTextureFromId(uint id, const QSize &size, CreateTextureOptions options = CreateTextureOption(0)) const;
#include <private/qlistmodelinterface_p.h>
#include <private/qquickitem_p.h>
#include <private/qdeclarativeaccessors_p.h>
+#include <QtQuick/private/qquickaccessibleattached_p.h>
#include <float.h>
}
}
+void QQuickItemPrivate::setAccessibleFlagAndListener()
+{
+ Q_Q(QQuickItem);
+ QQuickItem *item = q;
+ while (item) {
+ if (item->d_func()->isAccessible)
+ break; // already set - grandparents should have the flag set as well.
+
+ if (item->canvas() && item->canvas()->rootItem() == item)
+ break; // don't add a listener to the canvas root item
+
+ item->d_func()->isAccessible = true;
+ item = item->d_func()->parentItem;
+ }
+}
+
/*!
\class QQuickItem
\brief The QQuickItem class provides the most basic of all visual items in QML.
if (change.types & QQuickItemPrivate::Destroyed)
change.listener->itemDestroyed(this);
}
+
d->changeListeners.clear();
delete d->_anchorLines; d->_anchorLines = 0;
delete d->_anchors; d->_anchors = 0;
d->itemChange(ItemParentHasChanged, d->parentItem);
d->parentNotifier.notify();
+ if (d->isAccessible && d->parentItem) {
+ d->parentItem->d_func()->setAccessibleFlagAndListener();
+ }
+
emit parentChanged(d->parentItem);
}
inheritedLayoutMirror(false), effectiveLayoutMirror(false), isMirrorImplicit(true),
inheritMirrorFromParent(false), inheritMirrorFromItem(false), childrenDoNotOverlap(false),
staticSubtreeGeometry(false),
+ isAccessible(false),
canvas(0), parentItem(0), sortedChildItems(&childItems),
{
}
+void QQuickItem::sendAccessibilityUpdate()
+{
+ Q_D(QQuickItem);
+}
+
void QQuickItemPrivate::removeItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types)
{
ChangeListener change(listener, types);
void QQuickItem::focusInEvent(QFocusEvent *)
{
+ QAccessible::updateAccessibility(this, 0, QAccessible::Focus);
}
void QQuickItem::focusOutEvent(QFocusEvent *)
change.listener->itemVisibilityChanged(q);
}
+ if (isAccessible)
+ QAccessible::updateAccessibility(q, 0, effectiveVisible ? QAccessible::ObjectShow : QAccessible::ObjectHide );
+
emit q->visibleChanged();
}
#include <QtCore/QList>
#include <QtGui/qevent.h>
#include <QtGui/qfont.h>
+#include <QtGui/qaccessible.h>
QT_BEGIN_HEADER
virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
virtual void updatePolish();
+protected Q_SLOTS:
+ void sendAccessibilityUpdate();
+
protected:
QQuickItem(QQuickItemPrivate &dd, QQuickItem *parent = 0);
friend class QQuickCanvas;
friend class QQuickCanvasPrivate;
friend class QSGRenderer;
+ friend class QAccessibleQuickItem;
+ friend class QQuickAccessibleAttached;
Q_DISABLE_COPY(QQuickItem)
Q_DECLARE_PRIVATE(QQuickItem)
};
bool inheritMirrorFromItem:1;
bool childrenDoNotOverlap:1;
bool staticSubtreeGeometry:1;
+ bool isAccessible:1;
QQuickCanvas *canvas;
QSGContext *sceneGraphContext() const { Q_ASSERT(canvas); return static_cast<QQuickCanvasPrivate *>(QObjectPrivate::get(canvas))->context; }
Qt::MouseButtons acceptedMouseButtons;
Qt::InputMethodHints imHints;
+ void setAccessibleFlagAndListener();
+
QPointF transformOriginPoint;
virtual qreal getImplicitWidth() const;
#include "qquickdroparea_p.h"
#include "qquickmultipointtoucharea_p.h"
#include <private/qdeclarativemetatype_p.h>
+#include <QtQuick/private/qquickaccessibleattached_p.h>
static QDeclarativePrivate::AutoParentResult qquickitem_autoParent(QObject *obj, QObject *parent)
{
qmlRegisterType<QQuickMultiPointTouchArea>("QtQuick", 2, 0, "MultiPointTouchArea");
qmlRegisterType<QQuickTouchPoint>("QtQuick", 2, 0, "TouchPoint");
qmlRegisterType<QQuickGrabGestureEvent>();
+
+#ifndef QT_NO_ACCESSIBILITY
+ qmlRegisterUncreatableType<QQuickAccessibleAttached>("QtQuick", 2, 0, "Accessible",QQuickAccessibleAttached::tr("Accessible is only available via attached properties"));
+#endif
}
void QQuickItemsModule::defineModule()
QQuickItem::componentComplete();
if (d->updateOnComponentComplete)
d->updateLayout();
+
+ // Enable accessibility for text items.
+ d->setAccessibleFlagAndListener();
}
qmlplugindump
PRIVATETESTS += \
+ qdeclarativeaccessibility \
qdeclarativebinding \
qdeclarativechangeset \
qdeclarativeconnection \
--- /dev/null
+import QtQuick 2.0
+
+Rectangle {
+ Accessible.role : Accessible.Button
+ property string text : "test"
+
+ Text {
+ anchors.fill : parent
+ text : parent.text
+ }
+
+ MouseArea {
+ anchors.fill : parent
+ }
+}
--- /dev/null
+import QtQuick 2.0
+
+Item {
+ width: 400
+ height: 400
+
+ Text {
+ x: 100
+ y: 20
+ width: 200
+ height: 50
+ text : "Hello Accessibility"
+ }
+
+ Text {
+ x: 100
+ y: 40
+ width: 100
+ height: 40
+ text : "Hello 2"
+ Accessible.role: Accessible.StaticText
+ Accessible.name: "The Hello 2 accessible text"
+ Accessible.description: "A text description"
+ }
+}
--- /dev/null
+load(qttest_p4)
+contains(QT_CONFIG,declarative): QT += declarative-private gui network qtquick1-private
+macx:CONFIG -= app_bundle
+
+HEADERS += ../../shared/util.h
+
+SOURCES += tst_qdeclarativeaccessibility.cpp \
+ ../../shared/util.cpp
+
+
+OTHER_FILES += data/pushbutton.qml
+OTHER_FILES += data/statictext.qml
+
+symbian: {
+ importFiles.files = data
+ importFiles.path = .
+ DEPLOYMENT += importFiles
+} else {
+ DEFINES += SRCDIR=\\\"$$PWD\\\"
+}
+
+CONFIG += parallel_test
+
+wince*: {
+ accessneeded.files = $$QT_BUILD_TREE\\plugins\\accessible\\*.dll
+ accessneeded.path = accessible
+ DEPLOYMENT += accessneeded
+}
+
+
+
+
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtTest/QtTest>
+#include "QtTest/qtestaccessible.h"
+
+#include <QtGui/qaccessible.h>
+
+#include <QtQuick1/qdeclarativeview.h>
+#include <QtQuick/qquickview.h>
+#include <QtQuick/qquickitem.h>
+
+#include <QtDeclarative/qdeclarativeengine.h>
+#include <QtDeclarative/qdeclarativeproperty.h>
+#include <private/qdeclarativeaccessibleattached_p.h>
+
+#include "../../shared/util.h"
+
+
+typedef QSharedPointer<QAccessibleInterface> QAI;
+
+
+static inline bool verifyChild(QWidget *child, QAccessibleInterface *iface,
+ int index, const QRect &domain)
+{
+ if (!child) {
+ qWarning("tst_QAccessibility::verifyChild: null pointer to child.");
+ return false;
+ }
+
+ if (!iface) {
+ qWarning("tst_QAccessibility::verifyChild: null pointer to interface.");
+ return false;
+ }
+
+ // Verify that we get a valid QAccessibleInterface for the child.
+ QAccessibleInterface *childInterface = QAccessible::queryAccessibleInterface(child);
+ if (!childInterface) {
+ qWarning("tst_QAccessibility::verifyChild: Failed to retrieve interface for child.");
+ return false;
+ }
+
+ // QAccessibleInterface::indexOfChild():
+ // Verify that indexOfChild() returns an index equal to the index passed in
+ int indexFromIndexOfChild = iface->indexOfChild(childInterface);
+ delete childInterface;
+ if (indexFromIndexOfChild != index) {
+ qWarning("tst_QAccessibility::verifyChild (indexOfChild()):");
+ qWarning() << "Expected:" << index;
+ qWarning() << "Actual: " << indexFromIndexOfChild;
+ return false;
+ }
+
+ // Navigate to child, compare its object and role with the interface from queryAccessibleInterface(child).
+ QAccessibleInterface *navigatedChildInterface = iface->child(index - 1);
+ if (navigatedChildInterface == 0)
+ return false;
+
+ const QRect rectFromInterface = navigatedChildInterface->rect();
+ delete navigatedChildInterface;
+
+ // QAccessibleInterface::childAt():
+ // Calculate global child position and check that the interface
+ // returns the correct index for that position.
+ QPoint globalChildPos = child->mapToGlobal(QPoint(0, 0));
+ QAccessibleInterface *childAtInterface = iface->childAt(globalChildPos.x(), globalChildPos.y());
+ if (!childAtInterface) {
+ qWarning("tst_QAccessibility::verifyChild (childAt()):");
+ qWarning() << "Expected:" << childInterface;
+ qWarning() << "Actual: no child";
+ return false;
+ }
+ if (childAtInterface->object() != childInterface->object()) {
+ qWarning("tst_QAccessibility::verifyChild (childAt()):");
+ qWarning() << "Expected:" << childInterface;
+ qWarning() << "Actual: " << childAtInterface;
+ return false;
+ }
+ delete childInterface;
+ delete childAtInterface;
+
+ // Verify that the child is within its domain.
+ if (!domain.contains(rectFromInterface)) {
+ qWarning("tst_QAccessibility::verifyChild: Child is not within its domain.");
+ return false;
+ }
+
+ return true;
+}
+
+static inline int indexOfChild(QAccessibleInterface *parentInterface, QWidget *childWidget)
+{
+ if (!parentInterface || !childWidget)
+ return -1;
+ QAccessibleInterface *childInterface = QAccessible::queryAccessibleInterface(childWidget);
+ if (!childInterface)
+ return -1;
+ int index = parentInterface->indexOfChild(childInterface);
+ delete childInterface;
+ return index;
+}
+
+#define EXPECT(cond) \
+ do { \
+ if (!errorAt && !(cond)) { \
+ errorAt = __LINE__; \
+ qWarning("level: %d, middle: %d, role: %d (%s)", treelevel, middle, iface->role(), #cond); \
+ } \
+ } while (0)
+
+static int verifyHierarchy(QAccessibleInterface *iface)
+{
+ int errorAt = 0;
+ static int treelevel = 0; // for error diagnostics
+ QAccessibleInterface *middleChild, *if2;
+ middleChild = 0;
+ ++treelevel;
+ int middle = iface->childCount()/2 + 1;
+ if (iface->childCount() >= 2) {
+ middleChild = iface->child(middle - 1);
+ }
+ for (int i = 0; i < iface->childCount() && !errorAt; ++i) {
+ if2 = iface->child(i);
+ EXPECT(if2 != 0);
+ // navigate Ancestor...
+ QAccessibleInterface *parent = if2->parent();
+ EXPECT(iface->object() == parent->object());
+ delete parent;
+
+ // navigate Sibling...
+// if (middleChild) {
+// entry = if2->navigate(QAccessible::Sibling, middle, &if3);
+// EXPECT(entry == 0 && if3->object() == middleChild->object());
+// if (entry == 0)
+// delete if3;
+// EXPECT(iface->indexOfChild(middleChild) == middle);
+// }
+
+ // verify children...
+ if (!errorAt)
+ errorAt = verifyHierarchy(if2);
+ delete if2;
+ }
+ delete middleChild;
+
+ --treelevel;
+ return errorAt;
+}
+
+
+//TESTED_FILES=
+
+class tst_QDeclarativeAccessibility : public QDeclarativeDataTest
+{
+ Q_OBJECT
+public:
+ tst_QDeclarativeAccessibility();
+ virtual ~tst_QDeclarativeAccessibility();
+
+private slots:
+ void commonTests_data();
+ void commonTests();
+
+ void declarativeAttachedProperties();
+ void basicPropertiesTest();
+ void hitTest();
+};
+
+tst_QDeclarativeAccessibility::tst_QDeclarativeAccessibility()
+{
+
+}
+
+tst_QDeclarativeAccessibility::~tst_QDeclarativeAccessibility()
+{
+
+}
+
+void tst_QDeclarativeAccessibility::commonTests_data()
+{
+ QTest::addColumn<QString>("accessibleRoleFileName");
+
+ QTest::newRow("StaticText") << SRCDIR "/data/statictext.qml";
+ QTest::newRow("PushButton") << SRCDIR "/data/pushbutton.qml";
+}
+
+void tst_QDeclarativeAccessibility::commonTests()
+{
+ QFETCH(QString, accessibleRoleFileName);
+
+ qDebug() << "testing" << accessibleRoleFileName;
+
+ QQuickView *view = new QQuickView();
+// view->setFixedSize(240,320);
+ view->setSource(QUrl::fromLocalFile(accessibleRoleFileName));
+ view->show();
+// view->setFocus();
+ QVERIFY(view->rootObject() != 0);
+
+ QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(view);
+ QVERIFY(iface);
+
+ delete iface;
+ delete view;
+}
+
+
+
+QString eventName(const int ev)
+{
+ switch (ev) {
+ case 0x0001: return "SoundPlayed";
+ case 0x0002: return "Alert";
+ case 0x0003: return "ForegroundChanged";
+ case 0x0004: return "MenuStart";
+ case 0x0005: return "MenuEnd";
+ case 0x0006: return "PopupMenuStart";
+ case 0x0007: return "PopupMenuEnd";
+ case 0x000C: return "ContextHelpStart";
+ case 0x000D: return "ContextHelpEnd";
+ case 0x000E: return "DragDropStart";
+ case 0x000F: return "DragDropEnd";
+ case 0x0010: return "DialogStart";
+ case 0x0011: return "DialogEnd";
+ case 0x0012: return "ScrollingStart";
+ case 0x0013: return "ScrollingEnd";
+ case 0x0018: return "MenuCommand";
+ case 0x8000: return "ObjectCreated";
+ case 0x8001: return "ObjectDestroyed";
+ case 0x8002: return "ObjectShow";
+ case 0x8003: return "ObjectHide";
+ case 0x8004: return "ObjectReorder";
+ case 0x8005: return "Focus";
+ case 0x8006: return "Selection";
+ case 0x8007: return "SelectionAdd";
+ case 0x8008: return "SelectionRemove";
+ case 0x8009: return "SelectionWithin";
+ case 0x800A: return "StateChanged";
+ case 0x800B: return "LocationChanged";
+ case 0x800C: return "NameChanged";
+ case 0x800D: return "DescriptionChanged";
+ case 0x800E: return "ValueChanged";
+ case 0x800F: return "ParentChanged";
+ case 0x80A0: return "HelpChanged";
+ case 0x80B0: return "DefaultActionChanged";
+ case 0x80C0: return "AcceleratorChanged";
+ default: return "Unknown Event";
+ }
+}
+
+static QString stateNames(int state)
+{
+ QString stateString;
+ if (state == 0x00000000) stateString += " Normal";
+ if (state & 0x00000001) stateString += " Unavailable";
+ if (state & 0x00000002) stateString += " Selected";
+ if (state & 0x00000004) stateString += " Focused";
+ if (state & 0x00000008) stateString += " Pressed";
+ if (state & 0x00000010) stateString += " Checked";
+ if (state & 0x00000020) stateString += " Mixed";
+ if (state & 0x00000040) stateString += " ReadOnly";
+ if (state & 0x00000080) stateString += " HotTracked";
+ if (state & 0x00000100) stateString += " DefaultButton";
+ if (state & 0x00000200) stateString += " Expanded";
+ if (state & 0x00000400) stateString += " Collapsed";
+ if (state & 0x00000800) stateString += " Busy";
+ if (state & 0x00001000) stateString += " Floating";
+ if (state & 0x00002000) stateString += " Marqueed";
+ if (state & 0x00004000) stateString += " Animated";
+ if (state & 0x00008000) stateString += " Invisible";
+ if (state & 0x00010000) stateString += " Offscreen";
+ if (state & 0x00020000) stateString += " Sizeable";
+ if (state & 0x00040000) stateString += " Moveable";
+ if (state & 0x00080000) stateString += " SelfVoicing";
+ if (state & 0x00100000) stateString += " Focusable";
+ if (state & 0x00200000) stateString += " Selectable";
+ if (state & 0x00400000) stateString += " Linked";
+ if (state & 0x00800000) stateString += " Traversed";
+ if (state & 0x01000000) stateString += " MultiSelectable";
+ if (state & 0x02000000) stateString += " ExtSelectable";
+ if (state & 0x04000000) stateString += " AlertLow";
+ if (state & 0x08000000) stateString += " AlertMedium";
+ if (state & 0x10000000) stateString += " AlertHigh";
+ if (state & 0x20000000) stateString += " Protected";
+ if (state & 0x3fffffff) stateString += " Valid";
+
+ if (stateString.isEmpty())
+ stateString = "Unknown state " + QString::number(state);
+
+ return stateString;
+}
+
+void tst_QDeclarativeAccessibility::declarativeAttachedProperties()
+{
+ {
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.1\nItem {\n"
+ "}", QUrl());
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QObject *attachedObject = QDeclarativeAccessibleAttached::attachedProperties(object);
+ QCOMPARE(attachedObject, static_cast<QObject*>(0));
+ delete object;
+ }
+
+ // Attached property
+ {
+ QObject parent;
+ QDeclarativeAccessibleAttached *attachedObj = new QDeclarativeAccessibleAttached(&parent);
+
+ attachedObj->name();
+
+ QVariant pp = attachedObj->property("name");
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.1\nItem {\n"
+ "Accessible.role: Accessible.Button\n"
+ "}", QUrl());
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QObject *attachedObject = QDeclarativeAccessibleAttached::attachedProperties(object);
+ QVERIFY(attachedObject);
+ if (attachedObject) {
+ QVariant p = attachedObject->property("role");
+ QCOMPARE(p.isNull(), false);
+ QCOMPARE(p.toInt(), int(QAccessible::PushButton));
+ p = attachedObject->property("name");
+ QCOMPARE(p.isNull(), true);
+ p = attachedObject->property("description");
+ QCOMPARE(p.isNull(), true);
+ }
+ delete object;
+ }
+
+ // Attached property
+ {
+ QDeclarativeEngine engine;
+ QDeclarativeComponent component(&engine);
+ component.setData("import QtQuick 1.1\nItem {\n"
+ "Accessible.role: Accessible.Button\n"
+ "Accessible.name: \"Donald\"\n"
+ "Accessible.description: \"Duck\"\n"
+ "}", QUrl());
+ QObject *object = component.create();
+ QVERIFY(object != 0);
+
+ QObject *attachedObject = QDeclarativeAccessibleAttached::attachedProperties(object);
+ QVERIFY(attachedObject);
+ if (attachedObject) {
+ QVariant p = attachedObject->property("role");
+ QCOMPARE(p.isNull(), false);
+ QCOMPARE(p.toInt(), int(QAccessible::PushButton));
+ p = attachedObject->property("name");
+ QCOMPARE(p.isNull(), false);
+ QCOMPARE(p.toString(), QLatin1String("Donald"));
+ p = attachedObject->property("description");
+ QCOMPARE(p.isNull(), false);
+ QCOMPARE(p.toString(), QLatin1String("Duck"));
+ }
+ delete object;
+ }
+}
+
+
+void tst_QDeclarativeAccessibility::basicPropertiesTest()
+{
+ QAI app = QAI(QAccessible::queryAccessibleInterface(qApp));
+ QCOMPARE(app->childCount(), 0);
+
+ QQuickView *canvas = new QQuickView();
+ canvas->setSource(testFileUrl("statictext.qml"));
+ canvas->show();
+ QCOMPARE(app->childCount(), 1);
+
+ QAI iface = QAI(QAccessible::queryAccessibleInterface(canvas));
+ QVERIFY(iface.data());
+ QCOMPARE(iface->childCount(), 1);
+
+ QAI item = QAI(iface->child(0));
+ QVERIFY(item.data());
+ QCOMPARE(item->childCount(), 2);
+ QCOMPARE(item->rect().size(), QSize(400, 400));
+ QCOMPARE(item->role(), QAccessible::Pane);
+
+ QAI text = QAI(item->child(0));
+ QVERIFY(text.data());
+ QCOMPARE(text->childCount(), 0);
+
+ QCOMPARE(text->text(QAccessible::Name), QLatin1String("Hello Accessibility"));
+ QCOMPARE(text->rect().size(), QSize(200, 50));
+ QCOMPARE(text->rect().x(), item->rect().x() + 100);
+ QCOMPARE(text->rect().y(), item->rect().y() + 20);
+ QCOMPARE(text->role(), QAccessible::StaticText);
+
+ QAI text2 = QAI(item->child(1));
+ QVERIFY(text2.data());
+ QCOMPARE(text2->childCount(), 0);
+
+ QCOMPARE(text2->text(QAccessible::Name), QLatin1String("The Hello 2 accessible text"));
+ QCOMPARE(text2->rect().size(), QSize(100, 40));
+ QCOMPARE(text2->rect().x(), item->rect().x() + 100);
+ QCOMPARE(text2->rect().y(), item->rect().y() + 40);
+ QCOMPARE(text2->role(), QAccessible::StaticText);
+
+ delete canvas;
+}
+
+QAI topLevelChildAt(QAccessibleInterface *iface, int x, int y)
+{
+ QAI child = QAI(iface->childAt(x, y));
+ if (!child)
+ return QAI();
+
+ QAI childOfChild;
+ while (childOfChild = QAI(child->childAt(x, y))) {
+ child = childOfChild;
+ }
+ return child;
+}
+
+void tst_QDeclarativeAccessibility::hitTest()
+{
+ QQuickView *canvas = new QQuickView();
+ canvas->setSource(testFileUrl("statictext.qml"));
+ canvas->show();
+
+ QAI iface = QAI(QAccessible::queryAccessibleInterface(canvas));
+ QVERIFY(iface.data());
+ QAI item = QAI(iface->child(0));
+ QRect itemRect = item->rect();
+
+ // hit the root item
+ QAI itemHit = QAI(iface->childAt(itemRect.x() + 5, itemRect.y() + 5));
+ QVERIFY(itemHit);
+ QCOMPARE(itemRect, itemHit->rect());
+
+ // hit a text element
+ QAI textChild = QAI(item->child(0));
+ QAI textChildHit = topLevelChildAt(iface.data(), itemRect.x() + 105, itemRect.y() + 25);
+ QVERIFY(textChildHit);
+ QCOMPARE(textChild->rect(), textChildHit->rect());
+ QCOMPARE(textChildHit->text(QAccessible::Name), QLatin1String("Hello Accessibility"));
+
+ // should also work from top level (app)
+ QAI app = QAI(QAccessible::queryAccessibleInterface(qApp));
+ QAI textChildHit2 = topLevelChildAt(app.data(), itemRect.x() + 105, itemRect.y() + 25);
+ QVERIFY(textChildHit2);
+ QCOMPARE(textChild->rect(), textChildHit2->rect());
+ QCOMPARE(textChildHit2->text(QAccessible::Name), QLatin1String("Hello Accessibility"));
+
+ delete canvas;
+}
+QTEST_MAIN(tst_QDeclarativeAccessibility)
+
+#include "tst_qdeclarativeaccessibility.moc"
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: scene
+ width: 800; height: 600
+
+ Rectangle {
+ id: behavior
+ x : 50
+ y : 100
+ width: 100; height: 100
+ color: "red"
+
+ Text {
+ text : "Behavior"
+ }
+
+ Behavior on x {
+ NumberAnimation { duration: 1000 }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: behavior.x += 50
+ }
+ }
+
+ Rectangle {
+ id: transition
+ x : 400
+ y : 100
+ width: 100; height: 100
+ color: "red"
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ }
+
+ Text {
+ text : "Transition"
+ }
+
+ states: State {
+ name: "moved"; when: mouseArea.pressed
+ PropertyChanges { target: transition; x: 500; y: 200 }
+ }
+
+ transitions: Transition {
+ NumberAnimation { properties: "x,y"; easing.type: Easing.InOutQuad; duration: 1000 }
+ }
+ }
+
+ Rectangle {
+ id : animatee
+ width: 100; height: 100
+ x : 50
+ y : 300
+ color: "blue"
+ opacity: 0.5
+ Text {
+ anchors.centerIn: parent
+ text : "NumberAnimation"
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ animatePosition.start()
+ }
+ }
+
+ NumberAnimation {
+ id: animatePosition
+ target: animatee
+ properties: "x"
+ from: animatee.x
+ to: animatee.x + 50
+ loops: 1
+ easing {type: Easing.Linear;}
+ }
+ }
+
+ ListView {
+ id : content
+ x : 400
+ y : 300
+ width: 300
+ height: 200
+
+ model : 200
+ delegate : Text { text : "Flickable" + index; height : 50 }
+ }
+}
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: scene
+ width: 400; height: 400
+
+ Rectangle {
+ id: rect
+ y : 100
+ width: 100; height: 100
+ color: "red"
+
+ Text {
+ text : "Behavior animation"
+ }
+
+ Behavior on x {
+ NumberAnimation { duration: 1000 }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: rect.x += 50
+ }
+ }
+ }
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+
+ ListView {
+ id : content
+ width: 300
+ height: 200
+// KeyNavigation.up: gridMenu; KeyNavigation.left: contextMenu; KeyNavigation.right: list2
+
+ model : 200
+ delegate : Text { text : "foo" + index; height : 50 }
+ }
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+import QtQuick 2.0
+Rectangle {
+ id: page
+ width: 640
+ height: 480
+ color: "white"
+ Rectangle {
+ id: header
+ color: "#c0c0c0"
+ height: usage.height + chkClip.height
+ anchors.left: parent.left
+ anchors.right: parent.right
+ Text {
+ id: usage
+ text: "Use an a11y inspect tool to see if all visible rectangles can be found with hit testing."
+ }
+ Rectangle {
+ id: chkClip
+ property bool checked: true
+
+ color: (checked ? "#f0f0f0" : "#c0c0c0")
+ height: label.height
+ width: label.width
+ anchors.left: parent.left
+ anchors.bottom: parent.bottom
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: chkClip.checked = !chkClip.checked
+ }
+ Text {
+ id: label
+ text: "Click here to toggle clipping"
+ }
+ }
+ }
+ Rectangle {
+ clip: chkClip.checked
+ z: 2
+ Accessible.role: Accessible.Button
+ id: rect1
+ width: 100
+ height: 100
+ color: "#ffc0c0"
+ anchors.top: header.bottom
+ Rectangle {
+ id: rect2
+ width: 100
+ height: 100
+ x: 50
+ y: 50
+ color: "#ffa0a0"
+ Rectangle {
+ id: rect31
+ width: 100
+ height: 100
+ x: 80
+ y: 80
+ color: "#ff8080"
+ }
+ Rectangle {
+ id: rect32
+ x: 100
+ y: 70
+ z: 3
+ width: 100
+ height: 100
+ color: "#e06060"
+ }
+ Rectangle {
+ id: rect33
+ width: 100
+ height: 100
+ x: 150
+ y: 60
+ color: "#c04040"
+ }
+ }
+ }
+
+ Rectangle {
+ x: 0
+ y: 50
+ id: recta1
+ width: 100
+ height: 100
+ color: "#c0c0ff"
+ Rectangle {
+ id: recta2
+ width: 100
+ height: 100
+ x: 50
+ y: 50
+ color: "#a0a0ff"
+ Rectangle {
+ id: recta31
+ width: 100
+ height: 100
+ x: 80
+ y: 80
+ color: "#8080ff"
+ }
+ Rectangle {
+ id: recta32
+ x: 100
+ y: 70
+ z: 100
+ width: 100
+ height: 100
+ color: "#6060e0"
+ }
+ Rectangle {
+ id: recta33
+ width: 100
+ height: 100
+ x: 150
+ y: 60
+ color: "#4040c0"
+ }
+ }
+ }
+
+}
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: flashingblob
+ width: 300; height: 300
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ animatePosition.start()
+ }
+ }
+
+ Rectangle {
+ id : animatee
+ width: 100; height: 100
+ y : 100
+ color: "blue"
+ opacity: 0.5
+ Text {
+ anchors.centerIn: parent
+ text : "Be Well"
+ }
+ }
+
+ NumberAnimation {
+ id: animatePosition
+ target: animatee
+ properties: "x"
+ from: animatee.x
+ to: animatee.x + 50
+ loops: 1
+ easing {type: Easing.Linear;}
+ }
+}
--- /dev/null
+import QmlProject 1.0
+
+Project {
+ /* Include .qml, .js, and image files from current directory and subdirectories */
+ QmlFiles {
+ directory: "."
+ }
+ JavaScriptFiles {
+ directory: "."
+ }
+ ImageFiles {
+ directory: "."
+ }
+ /* List of plugin directories passed to QML runtime */
+ // importPaths: [ "../exampleplugin" ]
+}
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id : rect
+ width: 300
+ height: 200
+
+ Rectangle {
+ width : 200
+ height : 20
+
+ id: button
+ anchors.top : rect.top
+ anchors.topMargin: 30
+ property string text : "Click to activate"
+ property int counter : 0
+
+ Accessible.role : Accessible.Button
+
+ function accessibleAction(action) {
+ if (action == Qt.Press)
+ buttonAction()
+ }
+
+ function buttonAction() {
+ ++counter
+ text = "clicked " + counter
+
+ text2.x += 20
+ }
+
+ Text {
+ id : text1
+ anchors.fill: parent
+ text : parent.text
+ }
+
+ MouseArea {
+ id : mouseArea
+ anchors.fill: parent
+ onClicked: parent.buttonAction()
+ }
+ }
+
+ Text {
+ id : text2
+ anchors.top: button.bottom
+ anchors.topMargin: 50
+ text : "Hello World " + x
+
+ Behavior on x { PropertyAnimation { duration: 500 } }
+ }
+}
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtDeclarative module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+
+Rectangle {
+ id: scene
+ width: 300; height: 300
+
+ Rectangle {
+ id: rect
+ x : 100
+ y : 100
+ width: 100; height: 100
+ color: "red"
+
+ MouseArea {
+ id: mouseArea
+ anchors.fill: parent
+ }
+
+ Text {
+ text : "Transition"
+ }
+
+ states: State {
+ name: "moved"; when: mouseArea.pressed
+ PropertyChanges { target: rect; x: 150; y: 150 }
+ }
+
+ transitions: Transition {
+ NumberAnimation { properties: "x,y"; easing.type: Easing.InOutQuad; duration: 1000 }
+ }
+ }
+}