aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickitem.cpp28
-rw-r--r--src/quick/items/qquickitem_p.h3
-rw-r--r--src/quick/items/qquickwindow.cpp19
-rw-r--r--tests/benchmarks/qml/qml.pro3
-rw-r--r--tests/benchmarks/qml/qquickwindow/qquickwindow.pro11
-rw-r--r--tests/benchmarks/qml/qquickwindow/tst_qquickwindow.cpp91
6 files changed, 146 insertions, 9 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp
index 76fbe9b012..783994666c 100644
--- a/src/quick/items/qquickitem.cpp
+++ b/src/quick/items/qquickitem.cpp
@@ -2180,6 +2180,10 @@ void QQuickItemPrivate::addChild(QQuickItem *child)
childItems.append(child);
+ QQuickItemPrivate *childPrivate = QQuickItemPrivate::get(child);
+ if (childPrivate->extra.isAllocated())
+ incrementCursorCount(childPrivate->extra.value().numItemsWithCursor);
+
markSortedChildrenDirty(child);
dirty(QQuickItemPrivate::ChildrenChanged);
@@ -2197,6 +2201,10 @@ void QQuickItemPrivate::removeChild(QQuickItem *child)
childItems.removeOne(child);
Q_ASSERT(!childItems.contains(child));
+ QQuickItemPrivate *childPrivate = QQuickItemPrivate::get(child);
+ if (childPrivate->extra.isAllocated())
+ incrementCursorCount(-childPrivate->extra.value().numItemsWithCursor);
+
markSortedChildrenDirty(child);
dirty(QQuickItemPrivate::ChildrenChanged);
@@ -6012,8 +6020,20 @@ void QQuickItem::setAcceptHoverEvents(bool enabled)
d->hoverEnabled = enabled;
}
+void QQuickItemPrivate::incrementCursorCount(int delta)
+{
#ifndef QT_NO_CURSOR
+ Q_Q(QQuickItem);
+ extra.value().numItemsWithCursor += delta;
+ QQuickItem *parent = q->parentItem();
+ if (parent) {
+ QQuickItemPrivate *parentPrivate = QQuickItemPrivate::get(parent);
+ parentPrivate->incrementCursorCount(delta);
+ }
+#endif
+}
+#ifndef QT_NO_CURSOR
/*!
Returns the cursor shape for this item.
@@ -6059,6 +6079,7 @@ void QQuickItem::setCursor(const QCursor &cursor)
}
if (!d->hasCursor) {
+ d->incrementCursorCount(+1);
d->hasCursor = true;
if (d->window) {
QPointF pos = d->window->mapFromGlobal(QGuiApplicationPrivate::lastCursorPosition.toPoint());
@@ -6079,6 +6100,7 @@ void QQuickItem::unsetCursor()
Q_D(QQuickItem);
if (!d->hasCursor)
return;
+ d->incrementCursorCount(-1);
d->hasCursor = false;
if (d->extra.isAllocated())
d->extra->cursor = QCursor();
@@ -7047,7 +7069,11 @@ void QQuickItemLayer::updateMatrix()
QQuickItemPrivate::ExtraData::ExtraData()
: z(0), scale(1), rotation(0), opacity(1),
contents(0), screenAttached(0), layoutDirectionAttached(0),
- keyHandler(0), layer(0), effectRefCount(0), hideRefCount(0),
+ keyHandler(0), layer(0),
+#ifndef QT_NO_CURSOR
+ numItemsWithCursor(0),
+#endif
+ effectRefCount(0), hideRefCount(0),
opacityNode(0), clipNode(0), rootNode(0), beforePaintNode(0),
acceptedMouseButtons(0), origin(QQuickItem::Center)
{
diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h
index 6f2642e1ae..1f372b5764 100644
--- a/src/quick/items/qquickitem_p.h
+++ b/src/quick/items/qquickitem_p.h
@@ -344,6 +344,7 @@ public:
mutable QQuickItemLayer *layer;
#ifndef QT_NO_CURSOR
QCursor cursor;
+ int numItemsWithCursor;
#endif
QPointF userTransformOriginPoint;
@@ -574,6 +575,8 @@ public:
static void start(QElapsedTimer &);
static qint64 elapsed(QElapsedTimer &);
static qint64 restart(QElapsedTimer &);
+
+ void incrementCursorCount(int delta);
};
/*
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp
index b657094e29..7cc645f48a 100644
--- a/src/quick/items/qquickwindow.cpp
+++ b/src/quick/items/qquickwindow.cpp
@@ -1893,13 +1893,18 @@ QQuickItem *QQuickWindowPrivate::findCursorItem(QQuickItem *item, const QPointF
return 0;
}
- QList<QQuickItem *> children = itemPrivate->paintOrderChildItems();
- for (int ii = children.count() - 1; ii >= 0; --ii) {
- QQuickItem *child = children.at(ii);
- if (!child->isVisible() || !child->isEnabled() || QQuickItemPrivate::get(child)->culled)
- continue;
- if (QQuickItem *cursorItem = findCursorItem(child, scenePos))
- return cursorItem;
+ const int numCursorsInHierarchy = itemPrivate->extra.isAllocated() ? itemPrivate->extra.value().numItemsWithCursor : 0;
+ const int numChildrenWithCursor = itemPrivate->hasCursor ? numCursorsInHierarchy-1 : numCursorsInHierarchy;
+
+ if (numChildrenWithCursor > 0) {
+ QList<QQuickItem *> children = itemPrivate->paintOrderChildItems();
+ for (int ii = children.count() - 1; ii >= 0; --ii) {
+ QQuickItem *child = children.at(ii);
+ if (!child->isVisible() || !child->isEnabled() || QQuickItemPrivate::get(child)->culled)
+ continue;
+ if (QQuickItem *cursorItem = findCursorItem(child, scenePos))
+ return cursorItem;
+ }
}
if (itemPrivate->hasCursor) {
diff --git a/tests/benchmarks/qml/qml.pro b/tests/benchmarks/qml/qml.pro
index 7a75c69dd1..3fbf130969 100644
--- a/tests/benchmarks/qml/qml.pro
+++ b/tests/benchmarks/qml/qml.pro
@@ -11,7 +11,8 @@ SUBDIRS += \
qqmlmetaproperty \
script \
qmltime \
- js
+ js \
+ qquickwindow
contains(QT_CONFIG, opengl): SUBDIRS += painting
diff --git a/tests/benchmarks/qml/qquickwindow/qquickwindow.pro b/tests/benchmarks/qml/qquickwindow/qquickwindow.pro
new file mode 100644
index 0000000000..76aecf9d13
--- /dev/null
+++ b/tests/benchmarks/qml/qquickwindow/qquickwindow.pro
@@ -0,0 +1,11 @@
+CONFIG += testcase
+TARGET = tst_qquickwindow
+SOURCES += tst_qquickwindow.cpp
+macx:CONFIG -= app_bundle
+
+testDataFiles.files = data
+testDataFiles.path = .
+DEPLOYMENT += testDataFiles
+
+QT += core-private gui-private v8-private qml-private quick-private opengl-private testlib
+DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 \ No newline at end of file
diff --git a/tests/benchmarks/qml/qquickwindow/tst_qquickwindow.cpp b/tests/benchmarks/qml/qquickwindow/tst_qquickwindow.cpp
new file mode 100644
index 0000000000..01ddd70838
--- /dev/null
+++ b/tests/benchmarks/qml/qquickwindow/tst_qquickwindow.cpp
@@ -0,0 +1,91 @@
+/***************************************************************************
+**
+** Copyright (C) 2011 - 2012 Research In Motion
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the plugins of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, 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, Digia gives you certain additional
+** rights. These rights are described in the Digia 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.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtQuick/QQuickWindow>
+#include <QtQuick/private/qquickrectangle_p.h>
+#include <QtQuick/private/qquickwindow_p.h>
+
+#include <qtest.h>
+#include <QtTest/QtTest>
+
+class tst_qquickwindow : public QObject
+{
+ Q_OBJECT
+public:
+ tst_qquickwindow();
+
+private slots:
+ void tst_updateCursor();
+ void cleanupTestCase();
+private:
+ QQuickWindow* window;
+};
+
+tst_qquickwindow::tst_qquickwindow()
+{
+ window = new QQuickWindow;
+ window->resize(250, 250);
+ window->setPos(100, 100);
+ for ( int i=0; i<8000; i++ ) {
+ QQuickRectangle *r =new QQuickRectangle(window->rootItem());
+ for ( int j=0; j<10; ++j ) {
+ new QQuickRectangle(r);
+ }
+ }
+ window->show();
+ QVERIFY(QTest::qWaitForWindowExposed(window));
+}
+
+void tst_qquickwindow::cleanupTestCase()
+{
+ delete window;
+}
+
+void tst_qquickwindow::tst_updateCursor()
+{
+ QBENCHMARK {
+ QQuickWindowPrivate::get(window)->updateCursor(QPoint(100,100));
+ }
+}
+
+QTEST_MAIN(tst_qquickwindow);
+
+#include "tst_qquickwindow.moc"