From 66399c6584a86180c1955e5d34617fa46b07f36e Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Mon, 2 Apr 2012 10:02:28 +1000 Subject: Also check notifier endpoints when checking whether a signal is connected. This is required for the QQmlBoundSignal optimizations. Change-Id: I63540b96cd7d4523ec49973a2540054c83d82b12 Reviewed-by: Chris Adams --- src/quick/items/context2d/qquickcanvasitem.cpp | 7 ++++++- src/quick/items/context2d/qquickcanvasitem_p.h | 1 + src/quick/items/qquickitem.cpp | 10 +++++++--- src/quick/items/qquickitem_p.h | 4 ++-- src/quick/items/qquickmousearea.cpp | 14 ++++++-------- src/quick/items/qquicktext.cpp | 8 ++++---- src/quick/items/qquickvisualdatamodel.cpp | 8 ++++++-- 7 files changed, 32 insertions(+), 20 deletions(-) (limited to 'src/quick/items') diff --git a/src/quick/items/context2d/qquickcanvasitem.cpp b/src/quick/items/context2d/qquickcanvasitem.cpp index 4f849c771b..6c8c8f3f53 100644 --- a/src/quick/items/context2d/qquickcanvasitem.cpp +++ b/src/quick/items/context2d/qquickcanvasitem.cpp @@ -446,6 +446,11 @@ QQuickCanvasContext* QQuickCanvasItem::rawContext() const return d_func()->context; } +bool QQuickCanvasItem::isPaintConnected() +{ + IS_SIGNAL_CONNECTED(this, "paint(QRect)"); +} + void QQuickCanvasItem::sceneGraphInitialized() { Q_D(QQuickCanvasItem); @@ -456,7 +461,7 @@ void QQuickCanvasItem::sceneGraphInitialized() if (!d->contextType.isNull()) QMetaObject::invokeMethod(this, "delayedCreate", Qt::QueuedConnection); - else if (receivers(SIGNAL(paint(QRect))) > 0) + else if (isPaintConnected()) QMetaObject::invokeMethod(this, "requestPaint", Qt::QueuedConnection); } diff --git a/src/quick/items/context2d/qquickcanvasitem_p.h b/src/quick/items/context2d/qquickcanvasitem_p.h index 9a57733d4c..5238fbcf6d 100644 --- a/src/quick/items/context2d/qquickcanvasitem_p.h +++ b/src/quick/items/context2d/qquickcanvasitem_p.h @@ -158,6 +158,7 @@ private: bool createContext(const QString &contextType); void initializeContext(QQuickCanvasContext *context, const QVariantMap &args = QVariantMap()); QRect tiledRect(const QRectF &window, const QSize &tileSize); + bool isPaintConnected(); }; QT_END_NAMESPACE diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index cf06dc228f..5259b62526 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -907,9 +907,13 @@ const QQuickKeysAttached::SigMap QQuickKeysAttached::sigMap[] = { { 0, 0 } }; -bool QQuickKeysAttachedPrivate::isConnected(const char *signalName) +bool QQuickKeysAttached::isConnected(const char *signalName) { - return isSignalConnected(signalIndex(signalName)); + Q_D(QQuickKeysAttached); + //### doing two string-based lookups isn't ideal + int signal_index = d->signalIndex(signalName); + int index = metaObject()->indexOfSignal(signalName); + return QQml_isSignalConnected(this, signal_index, index); } /*! @@ -1369,7 +1373,7 @@ void QQuickKeysAttached::keyPressed(QKeyEvent *event, bool post) QByteArray keySignal = keyToSignal(event->key()); if (!keySignal.isEmpty()) { keySignal += "(QQuickKeyEvent*)"; - if (d->isConnected(keySignal)) { + if (isConnected(keySignal)) { // If we specifically handle a key then default to accepted ke.setAccepted(true); int idx = QQuickKeysAttached::staticMetaObject.indexOfSignal(keySignal); diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index 89c09ed015..ed762d011a 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -710,8 +710,6 @@ public: , inIM(false), enabled(true), imeItem(0), item(0) {} - bool isConnected(const char *signalName); - //loop detection bool inPress:1; bool inRelease:1; @@ -827,6 +825,8 @@ private: return keySignal; } + bool isConnected(const char *signalName); + struct SigMap { int key; const char *sig; diff --git a/src/quick/items/qquickmousearea.cpp b/src/quick/items/qquickmousearea.cpp index 956ca09aac..9185556cc9 100644 --- a/src/quick/items/qquickmousearea.cpp +++ b/src/quick/items/qquickmousearea.cpp @@ -45,6 +45,8 @@ #include "qquickevents_p_p.h" #include "qquickdrag_p.h" +#include + #include #include #include @@ -218,29 +220,25 @@ void QQuickMouseAreaPrivate::saveEvent(QMouseEvent *event) bool QQuickMouseAreaPrivate::isPressAndHoldConnected() { Q_Q(QQuickMouseArea); - static int idx = QObjectPrivate::get(q)->signalIndex("pressAndHold(QQuickMouseEvent*)"); - return QObjectPrivate::get(q)->isSignalConnected(idx); + IS_SIGNAL_CONNECTED(q, "pressAndHold(QQuickMouseEvent*)"); } bool QQuickMouseAreaPrivate::isDoubleClickConnected() { Q_Q(QQuickMouseArea); - static int idx = QObjectPrivate::get(q)->signalIndex("doubleClicked(QQuickMouseEvent*)"); - return QObjectPrivate::get(q)->isSignalConnected(idx); + IS_SIGNAL_CONNECTED(q, "doubleClicked(QQuickMouseEvent*)"); } bool QQuickMouseAreaPrivate::isClickConnected() { Q_Q(QQuickMouseArea); - static int idx = QObjectPrivate::get(q)->signalIndex("clicked(QQuickMouseEvent*)"); - return QObjectPrivate::get(q)->isSignalConnected(idx); + IS_SIGNAL_CONNECTED(q, "clicked(QQuickMouseEvent*)"); } bool QQuickMouseAreaPrivate::isWheelConnected() { Q_Q(QQuickMouseArea); - static int idx = QObjectPrivate::get(q)->signalIndex("wheel(QQuickWheelEvent*)"); - return QObjectPrivate::get(q)->isSignalConnected(idx); + IS_SIGNAL_CONNECTED(q, "wheel(QQuickWheelEvent*)"); } void QQuickMouseAreaPrivate::propagate(QQuickMouseEvent* event, PropagateType t) diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp index cfedfbd890..2407ade988 100644 --- a/src/quick/items/qquicktext.cpp +++ b/src/quick/items/qquicktext.cpp @@ -594,8 +594,8 @@ void QQuickText::doLayout() bool QQuickTextPrivate::isLineLaidOutConnected() { - static int idx = this->signalIndex("lineLaidOut(QQuickTextLine*)"); - return this->isSignalConnected(idx); + Q_Q(QQuickText); + IS_SIGNAL_CONNECTED(q, "lineLaidOut(QQuickTextLine*)"); } void QQuickTextPrivate::setupCustomLineGeometry(QTextLine &line, qreal &height, int lineOffset) @@ -2406,8 +2406,8 @@ QString QQuickTextPrivate::anchorAt(const QPointF &mousePos) bool QQuickTextPrivate::isLinkActivatedConnected() { - static int idx = this->signalIndex("linkActivated(QString)"); - return this->isSignalConnected(idx); + Q_Q(QQuickText); + IS_SIGNAL_CONNECTED(q, "linkActivated(QString)"); } /*! \internal */ diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp index cea83969f3..5046b1afe0 100644 --- a/src/quick/items/qquickvisualdatamodel.cpp +++ b/src/quick/items/qquickvisualdatamodel.cpp @@ -1748,11 +1748,15 @@ void QQuickVisualDataGroupPrivate::setModel(QQuickVisualDataModel *m, Compositor group = g; } +static bool isChangedConnected(QObject *obj) +{ + IS_SIGNAL_CONNECTED(obj, "changed(QQmlV8Handle,QQmlV8Handle)"); +} + void QQuickVisualDataGroupPrivate::emitChanges(QV8Engine *engine) { Q_Q(QQuickVisualDataGroup); - static int idx = signalIndex("changed(QQmlV8Handle,QQmlV8Handle)"); - if (isSignalConnected(idx) && !changeSet.isEmpty()) { + if (isChangedConnected(q) && !changeSet.isEmpty()) { v8::HandleScope handleScope; v8::Context::Scope contextScope(engine->context()); v8::Local removed = QQuickVisualDataModelPrivate::buildChangeList(changeSet.removes()); -- cgit v1.2.3