aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickitem.cpp
diff options
context:
space:
mode:
authorSérgio Martins <sergio.martins.qnx@kdab.com>2012-09-07 12:00:30 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-11 16:07:33 +0200
commit2c9886dfb9d448b08794d88ea112076c2744f194 (patch)
treeb569067de827a34cc24c37014d77bf4de30afea7 /src/quick/items/qquickitem.cpp
parentcad818ae17c5537a2bbf733806719eafa8227032 (diff)
Fix performance bottleneck in QQuickWindow::mouseMoveEvent().
When a mouse move event is received, a lot of time is spent looking for items with cursors, recursively. With this patch, it will only recur into item hierarchies that contain cursors. Not having cursors is much more common than having them. Benchmark included: Before: 15 msecs per iteration (total: 62, iterations: 4) After: 0.000064 msecs per iteration (total: 68, iterations: 1048576) Task-number: QTBUG-27054 Change-Id: I3a5441652ca1c0b8d2cbc5683013562174f5af4a Reviewed-by: Alan Alpert <416365416c@gmail.com>
Diffstat (limited to 'src/quick/items/qquickitem.cpp')
-rw-r--r--src/quick/items/qquickitem.cpp28
1 files changed, 27 insertions, 1 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)
{