diff options
Diffstat (limited to 'src/qtquick1/graphicsitems')
7 files changed, 266 insertions, 0 deletions
diff --git a/src/qtquick1/graphicsitems/graphicsitems.pri b/src/qtquick1/graphicsitems/graphicsitems.pri index 9904274023..d3125d0b66 100644 --- a/src/qtquick1/graphicsitems/graphicsitems.pri +++ b/src/qtquick1/graphicsitems/graphicsitems.pri @@ -2,6 +2,7 @@ INCLUDEPATH += $$PWD HEADERS += \ $$PWD/qdeclarativeitemsmodule_p.h \ + $$PWD/qdeclarativeaccessibleattached_p.h \ $$PWD/qdeclarativeanchors_p.h \ $$PWD/qdeclarativeanchors_p_p.h \ $$PWD/qdeclarativeevents_p_p.h \ @@ -59,6 +60,7 @@ HEADERS += \ SOURCES += \ $$PWD/qdeclarativeitemsmodule.cpp \ + $$PWD/qdeclarativeaccessibleattached.cpp \ $$PWD/qdeclarativeanchors.cpp \ $$PWD/qdeclarativeevents.cpp \ $$PWD/qdeclarativeflickable.cpp \ diff --git a/src/qtquick1/graphicsitems/qdeclarativeaccessibleattached.cpp b/src/qtquick1/graphicsitems/qdeclarativeaccessibleattached.cpp new file mode 100644 index 0000000000..c9d0645b01 --- /dev/null +++ b/src/qtquick1/graphicsitems/qdeclarativeaccessibleattached.cpp @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation ([email protected]) +** +** 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 diff --git a/src/qtquick1/graphicsitems/qdeclarativeaccessibleattached_p.h b/src/qtquick1/graphicsitems/qdeclarativeaccessibleattached_p.h new file mode 100644 index 0000000000..8671c671b7 --- /dev/null +++ b/src/qtquick1/graphicsitems/qdeclarativeaccessibleattached_p.h @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation ([email protected]) +** +** 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 + diff --git a/src/qtquick1/graphicsitems/qdeclarativeitem.cpp b/src/qtquick1/graphicsitems/qdeclarativeitem.cpp index 1f57d53b7e..016dc94408 100644 --- a/src/qtquick1/graphicsitems/qdeclarativeitem.cpp +++ b/src/qtquick1/graphicsitems/qdeclarativeitem.cpp @@ -53,6 +53,8 @@ #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> @@ -64,6 +66,8 @@ #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> @@ -1779,7 +1783,11 @@ QDeclarativeItem::~QDeclarativeItem() */ void QDeclarativeItem::setParentItem(QDeclarativeItem *parent) { + Q_D(QDeclarativeItem); QGraphicsObject::setParentItem(parent); + if (d->isAccessible && parentItem()) { + parentItem()->d_func()->setAccessibleFlagAndListener(); + } } /*! @@ -3022,6 +3030,25 @@ QDeclarativeItemPrivate::AnchorLines::AnchorLines(QGraphicsObject *q) 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); diff --git a/src/qtquick1/graphicsitems/qdeclarativeitem.h b/src/qtquick1/graphicsitems/qdeclarativeitem.h index c56b59125b..80c5e35ce4 100644 --- a/src/qtquick1/graphicsitems/qdeclarativeitem.h +++ b/src/qtquick1/graphicsitems/qdeclarativeitem.h @@ -50,6 +50,7 @@ #include <QtGui/qfont.h> #include <QtWidgets/qgraphicsitem.h> #include <QtWidgets/qgraphicstransform.h> +#include <QtGui/qaccessible.h> #include <QtWidgets/qaction.h> QT_BEGIN_HEADER @@ -198,6 +199,8 @@ protected: private: Q_DISABLE_COPY(QDeclarativeItem) Q_DECLARE_PRIVATE_D(QGraphicsItem::d_ptr.data(), QDeclarativeItem) + + friend class QDeclarativeAccessibleAttached; }; template<typename T> diff --git a/src/qtquick1/graphicsitems/qdeclarativeitem_p.h b/src/qtquick1/graphicsitems/qdeclarativeitem_p.h index 1dcafe55f4..b884c38b6a 100644 --- a/src/qtquick1/graphicsitems/qdeclarativeitem_p.h +++ b/src/qtquick1/graphicsitems/qdeclarativeitem_p.h @@ -71,6 +71,7 @@ #include <QtCore/qlist.h> #include <QtCore/qrect.h> #include <QtCore/qdebug.h> +#include <QtGui/qaccessible.h> #include <QtWidgets/private/qgraphicsitem_p.h> @@ -287,6 +288,7 @@ public: bool isMirrorImplicit:1; bool inheritMirrorFromParent:1; bool inheritMirrorFromItem:1; + bool isAccessible:1; QDeclarativeItemKeyFilter *keyHandler; @@ -298,6 +300,7 @@ public: QDeclarative1LayoutMirroringAttached* attachedLayoutDirection; bool hadSubFocusItem; + void setAccessibleFlagAndListener(); QPointF computeTransformOrigin() const; @@ -617,6 +620,7 @@ private: static const SigMap sigMap[]; }; + Q_DECLARE_OPERATORS_FOR_FLAGS(QDeclarativeItemPrivate::ChangeTypes); QT_END_NAMESPACE diff --git a/src/qtquick1/graphicsitems/qdeclarativeitemsmodule.cpp b/src/qtquick1/graphicsitems/qdeclarativeitemsmodule.cpp index 0a20b949b8..24ab4df4e2 100644 --- a/src/qtquick1/graphicsitems/qdeclarativeitemsmodule.cpp +++ b/src/qtquick1/graphicsitems/qdeclarativeitemsmodule.cpp @@ -76,6 +76,7 @@ #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) { @@ -199,6 +200,11 @@ void QDeclarative1ItemModule::defineModule(QDeclarativeQtQuick1Module::Module mo 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", |