/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ // -*-c++-*- osgWidget - Code by: Jeremy Moles (cubicool) 2007-2008 // $Id: UIObjectParent 55 2008-05-12 19:14:42Z cubicool $ #ifndef OSGWIDGET_UI_OBJECT_PARENT #define OSGWIDGET_UI_OBEJCT_PARENT namespace osgWidget { #define META_UIObject(name) \ name * cloneAs(\ const std::string& newName, \ const osg::CopyOp& co = osg::CopyOp::DEEP_COPY_ALL \ ) const { \ name * obj = dynamic_cast(this->clone(co)); \ obj->setName(newName); \ return obj; \ } template class UIObjectParent { public: typedef T object_type; typedef osg::observer_ptr ptr_type; typedef std::vector Vector; typedef typename Vector::iterator Iterator; typedef typename Vector::const_iterator ConstIterator; Iterator begin() { return _objects.begin(); } ConstIterator begin() const { return _objects.begin(); } Iterator end() { return _objects.end(); } ConstIterator end() const { return _objects.end(); } typename Vector::size_type size() const { return _objects.size(); } object_type* getByName(const std::string& name) { return _getByName(name); } const object_type* getByName(const std::string& name) const { return _getByName(name); } object_type* getByIndex(unsigned int index) { return _getByIndex(index); } const object_type* getByIndex(unsigned int index) const { return _getByIndex(index); } unsigned int getNumObjects() const { return _objects.size(); } Vector& getObjects() { return _objects; } const Vector& getObjects() const { return _objects; } protected: bool _remove(object_type* obj) { Iterator i = std::find(begin(), end(), obj); if(i == end()) return false; _objects.erase(i); return true; } bool _removeByName(const std::string& name) { for(Iterator i = begin(); i != end(); i++) if(i->get()->getName() == name) { _objects.erase(i); return true; } return false; } Vector _objects; private: // I had to add this to avoid ambiguity errors with MSVC. Garbage. object_type* _getByName(const std::string& name) const { for(ConstIterator i = begin(); i != end(); i++) { if(i->valid() && i->get()->getName() == name) return i->get(); } return 0; } object_type* _getByIndex(unsigned int index) const { for(ConstIterator i = begin(); i != end(); i++) { if(i->valid() && i->get()->getIndex() == index) return i->get(); } return 0; } }; } #endif