diff options
Diffstat (limited to 'src/plugins')
17 files changed, 1662 insertions, 0 deletions
diff --git a/src/plugins/accessible/accessible.pro b/src/plugins/accessible/accessible.pro new file mode 100644 index 0000000000..71165af784 --- /dev/null +++ b/src/plugins/accessible/accessible.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS += quick +SUBDIRS += qtquick1 diff --git a/src/plugins/accessible/qtquick1/main.cpp b/src/plugins/accessible/qtquick1/main.cpp new file mode 100644 index 0000000000..5ace1a78a1 --- /dev/null +++ b/src/plugins/accessible/qtquick1/main.cpp @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp new file mode 100644 index 0000000000..202023990b --- /dev/null +++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.cpp @@ -0,0 +1,290 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h new file mode 100644 index 0000000000..5582672aae --- /dev/null +++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeitem.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp new file mode 100644 index 0000000000..1aa4bef992 --- /dev/null +++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.cpp @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h new file mode 100644 index 0000000000..48833f932c --- /dev/null +++ b/src/plugins/accessible/qtquick1/qaccessibledeclarativeview.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/qtquick1/qtquick1.pro b/src/plugins/accessible/qtquick1/qtquick1.pro new file mode 100644 index 0000000000..f4602e4420 --- /dev/null +++ b/src/plugins/accessible/qtquick1/qtquick1.pro @@ -0,0 +1,22 @@ +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 +} diff --git a/src/plugins/accessible/quick/main.cpp b/src/plugins/accessible/quick/main.cpp new file mode 100644 index 0000000000..8b8285e450 --- /dev/null +++ b/src/plugins/accessible/quick/main.cpp @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.cpp b/src/plugins/accessible/quick/qaccessiblequickitem.cpp new file mode 100644 index 0000000000..7131e110d8 --- /dev/null +++ b/src/plugins/accessible/quick/qaccessiblequickitem.cpp @@ -0,0 +1,292 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/quick/qaccessiblequickitem.h b/src/plugins/accessible/quick/qaccessiblequickitem.h new file mode 100644 index 0000000000..9782f67731 --- /dev/null +++ b/src/plugins/accessible/quick/qaccessiblequickitem.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/quick/qaccessiblequickview.cpp b/src/plugins/accessible/quick/qaccessiblequickview.cpp new file mode 100644 index 0000000000..cd4b4937ec --- /dev/null +++ b/src/plugins/accessible/quick/qaccessiblequickview.cpp @@ -0,0 +1,137 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/quick/qaccessiblequickview.h b/src/plugins/accessible/quick/qaccessiblequickview.h new file mode 100644 index 0000000000..0b9b5d1f80 --- /dev/null +++ b/src/plugins/accessible/quick/qaccessiblequickview.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/quick/quick.pro b/src/plugins/accessible/quick/quick.pro new file mode 100644 index 0000000000..97a1d50098 --- /dev/null +++ b/src/plugins/accessible/quick/quick.pro @@ -0,0 +1,23 @@ +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 +} + diff --git a/src/plugins/accessible/shared/qaccessiblebase.pri b/src/plugins/accessible/shared/qaccessiblebase.pri new file mode 100644 index 0000000000..8c82705443 --- /dev/null +++ b/src/plugins/accessible/shared/qaccessiblebase.pri @@ -0,0 +1,7 @@ +target.path += $$[QT_INSTALL_PLUGINS]/accessible +INSTALLS += target + +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD +SOURCES += $$PWD/qdeclarativeaccessible.cpp +HEADERS += $$PWD/qdeclarativeaccessible.h diff --git a/src/plugins/accessible/shared/qdeclarativeaccessible.cpp b/src/plugins/accessible/shared/qdeclarativeaccessible.cpp new file mode 100644 index 0000000000..abe73f24ea --- /dev/null +++ b/src/plugins/accessible/shared/qdeclarativeaccessible.cpp @@ -0,0 +1,172 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/accessible/shared/qdeclarativeaccessible.h b/src/plugins/accessible/shared/qdeclarativeaccessible.h new file mode 100644 index 0000000000..16b61508c0 --- /dev/null +++ b/src/plugins/accessible/shared/qdeclarativeaccessible.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** 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 diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 664a457608..ae42ba1ba4 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -1,2 +1,3 @@ TEMPLATE = subdirs SUBDIRS += qmltooling +SUBDIRS += accessible |