diff --git a/src/libs/extensionsystem/pluginmanager.cpp b/src/libs/extensionsystem/pluginmanager.cpp index 338d1578eaa..a9550ffa63f 100644 --- a/src/libs/extensionsystem/pluginmanager.cpp +++ b/src/libs/extensionsystem/pluginmanager.cpp @@ -220,7 +220,21 @@ enum { debugLeaks = 0 }; This function uses \c qobject_cast to determine the type of an object. If there are more than one object of the given type in - the object pool, this function will choose an arbitrary one of them. + the object pool, this function will arbitrarily choose one of them. + + \sa addObject() +*/ + +/*! + \fn T *PluginManager::getObject(Predicate predicate) + + Retrieves the object of a given type from the object pool that matches + the \a predicate. + + This function uses \c qobject_cast to determine the type of an object. + The predicate must be a function taking T * and returning a bool. + If there is more than one object matching the type and predicate, + this function will arbitrarily choose one of them. \sa addObject() */ @@ -235,6 +249,20 @@ enum { debugLeaks = 0 }; \sa addObject() */ +/*! + \fn QList PluginManager::getObjects(Predicate predicate) + + Retrieves all objects of a given type from the object pool that + match the \a predicate. + + This function uses \c qobject_cast to determine the type of an object. + The predicate should be a unary function taking a T* parameter and + returning a bool. + + \sa addObject() +*/ + + using namespace ExtensionSystem; using namespace ExtensionSystem::Internal; diff --git a/src/libs/extensionsystem/pluginmanager.h b/src/libs/extensionsystem/pluginmanager.h index 312fc50b719..31f129980bb 100644 --- a/src/libs/extensionsystem/pluginmanager.h +++ b/src/libs/extensionsystem/pluginmanager.h @@ -75,6 +75,19 @@ public: } return results; } + template + static QList getObjects(Predicate predicate) + { + QReadLocker lock(listLock()); + QList results; + QList all = allObjects(); + foreach (QObject *obj, all) { + T *result = qobject_cast(obj); + if (result && predicate(result)) + results += result; + } + return results; + } template static T *getObject() { QReadLocker lock(listLock()); @@ -85,6 +98,17 @@ public: } return 0; } + template static T *getObject(Predicate predicate) + { + QReadLocker lock(listLock()); + QList all = allObjects(); + foreach (QObject *obj, all) { + if (T *result = qobject_cast(obj)) + if (predicate(result)) + return result; + } + return 0; + } static QObject *getObjectByName(const QString &name); static QObject *getObjectByClassName(const QString &className); diff --git a/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp b/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp index e8169795e07..9e3ce28cdb3 100644 --- a/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp +++ b/tests/auto/extensionsystem/pluginmanager/tst_pluginmanager.cpp @@ -138,6 +138,9 @@ void tst_PluginManager::getObject() { MyClass2 *object2 = new MyClass2; MyClass11 *object11 = new MyClass11; + MyClass2 *object2b = new MyClass2; + const QString objectName = QLatin1String("OBJECTNAME"); + object2b->setObjectName(objectName); m_pm->addObject(object2); QCOMPARE(m_pm->getObject(), (MyClass11*)0); QCOMPARE(m_pm->getObject(), (MyClass1*)0); @@ -146,10 +149,17 @@ void tst_PluginManager::getObject() QCOMPARE(m_pm->getObject(), object11); QCOMPARE(m_pm->getObject(), qobject_cast(object11)); QCOMPARE(m_pm->getObject(), object2); + QCOMPARE(m_pm->getObjectByName(objectName), (QObject*)0); + m_pm->addObject(object2b); + QCOMPARE(m_pm->getObjectByName(objectName), object2b); + QCOMPARE(m_pm->getObject( + [&objectName](MyClass2 *obj) { return obj->objectName() == objectName;}), object2b); m_pm->removeObject(object2); m_pm->removeObject(object11); + m_pm->removeObject(object2b); delete object2; delete object11; + delete object2b; } void tst_PluginManager::getObjects() @@ -172,6 +182,12 @@ void tst_PluginManager::getObjects() QCOMPARE(m_pm->getObjects(), QList() << object11 << object1); QCOMPARE(m_pm->getObjects(), QList() << object2); QCOMPARE(m_pm->allObjects(), QList() << object2 << object11 << object1); + + QCOMPARE(m_pm->getObjects( + [](MyClass1 *o){ + return !qobject_cast(o);} ), + QList() << object1); + m_pm->removeObject(object2); m_pm->removeObject(object11); m_pm->removeObject(object1);