#ifndef SCENE_FIND_ITEMS #define SCENE_FIND_ITEMS #include #include #include // required, to have &Scene_item::name #include "Scene_config.h" class Scene_interface; namespace scene { namespace details { typedef QString (CGAL::Three::Scene_item ::*Scene_item_name_fn_ptr)() const; // Declaration only (defined in Scene.cpp) SCENE_EXPORT CGAL::Three::Scene_item* findItem(const CGAL::Three::Scene_interface* scene_interface, const QMetaObject& metaobj, QString name, Scene_item_name_fn_ptr fn); // Declaration only (defined in Scene.cpp) SCENE_EXPORT QList findItems(const CGAL::Three::Scene_interface* scene_interface, const QMetaObject& metaobj, QString name, Scene_item_name_fn_ptr fn); // fwd declaration template T findItem(const CGAL::Three::Scene_interface* scene, QString name, Scene_item_name_fn_ptr fn) { return static_cast(findItem(scene, reinterpret_cast(0)->staticMetaObject, name, fn)); } template QList findItems(const CGAL::Three::Scene_interface* scene, QString name, Scene_item_name_fn_ptr fn) { QList void_list = findItems(scene, reinterpret_cast(0)->staticMetaObject, name, fn); QList list; Q_FOREACH(CGAL::Three::Scene_item* ptr, void_list) { list << qobject_cast(ptr); } return list; } } // end namespace details // Searches /** Search the first item that can be cast to T (T must be a pointer type), and called "name". If "name" is omitted, all names are accepted. */ template T findItem(const CGAL::Three::Scene_interface* scene, QString item_name = QString()) { return details::findItem(scene, item_name, &CGAL::Three::Scene_item::name); } /** Returns all items that can be cast to T (T must be a pointer type), and called "name". If "name" is omitted, all names are accepted. */ template QList findItems(const CGAL::Three::Scene_interface* scene, QString item_name = QString()) { return details::findItems(scene, item_name, &CGAL::Three::Scene_item::name); } /** Search the first item that can be cast to T (T must be a pointer type), and that has objectName() equal to "name". If "name" is omitted, all names are accepted. */ template T findItemByObjectName(const CGAL::Three::Scene_interface* scene, QString obj_name = QString()) { return details::findItem(scene, obj_name, &QObject::objectName); } /** Returns all items that can be cast to T (T must be a pointer type), and have objectName() equal to "name". If "name" is omitted, all names are accepted. */ template QList findItemsByObjectName(const CGAL::Three::Scene_interface* scene, QString obj_name = QString()) { return details::findItems(scene, obj_name, &QObject::objectName); } // template // T scene_findItem(const Scene* scene, QString name, Scene_item_name_fn_ptr fn) { // return // static_cast(scene_findItem(scene, name, fn, // reinterpret_cast(0)->staticMetaObject())); // } // template // QList // scene_findItems(const Scene* scene, QString name, Scene_item_name_fn_ptr fn) { // QList void_list = // scene_findItems(scene, name, fn, // reinterpret_cast(0)->staticMetaObject()); // QList list; // Q_FOREACH(void* ptr, void_list) { // list << static_cast(ptr); // } // return list; // } // } // end scene namespace } // end namespace scene #endif