Remove "All rights reserved" line from license headers.
[profile/ivi/qtdeclarative.git] / src / plugins / accessible / quick / qaccessiblequickview.cpp
index 65e7e18..00748b4 100644 (file)
@@ -1,8 +1,7 @@
 /****************************************************************************
 **
 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
+** Contact: http://www.qt-project.org/
 **
 ** This file is part of the QtDeclarative module of the Qt Toolkit.
 **
@@ -35,6 +34,7 @@
 **
 **
 **
+**
 ** $QT_END_LICENSE$
 **
 ****************************************************************************/
@@ -42,6 +42,7 @@
 #include "qaccessiblequickview.h"
 
 #include <QtQuick/qquickitem.h>
+#include <QtQuick/private/qquickitem_p.h>
 
 #include "qaccessiblequickitem.h"
 #include "qdeclarativeaccessible.h"
@@ -53,12 +54,11 @@ 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;
+    return view()->rootItem() ? 1 : 0;
 }
 
 QAccessibleInterface *QAccessibleQuickView::parent() const
@@ -70,8 +70,8 @@ QAccessibleInterface *QAccessibleQuickView::parent() const
 QAccessibleInterface *QAccessibleQuickView::child(int index) const
 {
     if (index == 0) {
-        QQuickItem *declarativeRoot = m_view->rootObject();
-        return new QAccessibleQuickItem(declarativeRoot);
+        if (QQuickItem *declarativeRoot = view()->rootObject())
+            return new QAccessibleQuickItem(declarativeRoot);
     }
     return 0;
 }
@@ -83,12 +83,12 @@ QAccessible::Role QAccessibleQuickView::role() const
 
 QAccessible::State QAccessibleQuickView::state() const
 {
-    return QAccessible::Normal; // FIXME
+    return QAccessible::State(); // FIXME
 }
 
 QRect QAccessibleQuickView::rect() const
 {
-    return QRect(m_view->x(), m_view->y(), m_view->width(), m_view->height());
+    return QRect(view()->x(), view()->y(), view()->width(), view()->height());
 }
 
 int QAccessibleQuickView::navigate(QAccessible::RelationFlag rel, int entry, QAccessibleInterface **target) const
@@ -106,22 +106,59 @@ QString QAccessibleQuickView::text(QAccessible::Text text) const
         return QString::fromAscii(object()->metaObject()->className()) ;
     }
 #endif
-    return m_view->windowTitle();
+    return view()->windowTitle();
+}
+
+
+/*!
+  \internal
+
+  Can also return \a item itself
+  */
+static QQuickItem *childAt_helper(QQuickItem *item, int x, int y)
+{
+    if (item->opacity() == 0.0 || !item->isVisible() || !item->isEnabled())
+        return 0;
+
+    if (item->flags() & QQuickItem::ItemClipsChildrenToShape) {
+        if (!itemScreenRect(item).contains(x, y))
+            return 0;
+    }
+
+    QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item);
+
+    QList<QQuickItem *> children = itemPrivate->paintOrderChildItems();
+    for (int i = children.count() - 1; i >= 0; --i) {
+        QQuickItem *child = children.at(i);
+        if (QQuickItem *childChild = childAt_helper(child, x, y))
+            return childChild;
+    }
+
+    QRect screenRect = itemScreenRect(item);
+
+    if (screenRect.contains(x, y))
+        return item;
+
+    return 0;
 }
 
 QAccessibleInterface *QAccessibleQuickView::childAt(int x, int y) const
 {
-    Q_UNUSED(x);
-    Q_UNUSED(y);
-    return child(0); // return the top-level QML item
+    Q_ASSERT(view());
+    QQuickItem *root = view()->rootItem();
+    if (root) {
+        if (QQuickItem *item = childAt_helper(root, x, y))
+            return QAccessible::queryAccessibleInterface(item);
+    }
+    return 0;
 }
 
 int QAccessibleQuickView::indexOfChild(const QAccessibleInterface *iface) const
 {
     if (iface) {
-        QQuickItem *declarativeRoot = m_view->rootObject();
+        QQuickItem *declarativeRoot = view()->rootObject();
         if (declarativeRoot == iface->object())
-            return 1;
+            return 0;
     }
     return -1;