Restructured classes to better fit with style of the rest of the OSG.
This commit is contained in:
@@ -7,115 +7,116 @@
|
||||
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<name *>(this->clone(co)); \
|
||||
obj->setName(newName); \
|
||||
return obj; \
|
||||
}
|
||||
name * cloneAs(\
|
||||
const std::string& newName, \
|
||||
const osg::CopyOp& co = osg::CopyOp::DEEP_COPY_ALL \
|
||||
) const { \
|
||||
name * obj = dynamic_cast<name *>(this->clone(co)); \
|
||||
obj->setName(newName); \
|
||||
return obj; \
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
class UIObjectParent {
|
||||
public:
|
||||
typedef T object_type;
|
||||
typedef osg::observer_ptr<object_type> ptr_type;
|
||||
typedef std::vector<ptr_type> Vector;
|
||||
typedef typename Vector::iterator Iterator;
|
||||
typedef typename Vector::const_iterator ConstIterator;
|
||||
class UIObjectParent
|
||||
{
|
||||
public:
|
||||
typedef T object_type;
|
||||
typedef osg::observer_ptr<object_type> ptr_type;
|
||||
typedef std::vector<ptr_type> Vector;
|
||||
typedef typename Vector::iterator Iterator;
|
||||
typedef typename Vector::const_iterator ConstIterator;
|
||||
|
||||
protected:
|
||||
Vector _objects;
|
||||
Iterator begin() {
|
||||
return _objects.begin();
|
||||
}
|
||||
|
||||
public:
|
||||
Iterator begin() {
|
||||
return _objects.begin();
|
||||
}
|
||||
ConstIterator begin() const {
|
||||
return _objects.begin();
|
||||
}
|
||||
|
||||
ConstIterator begin() const {
|
||||
return _objects.begin();
|
||||
}
|
||||
Iterator end() {
|
||||
return _objects.end();
|
||||
}
|
||||
|
||||
Iterator end() {
|
||||
return _objects.end();
|
||||
}
|
||||
ConstIterator end() const {
|
||||
return _objects.end();
|
||||
}
|
||||
|
||||
ConstIterator end() const {
|
||||
return _objects.end();
|
||||
}
|
||||
typename Vector::size_type size() const {
|
||||
return _objects.size();
|
||||
}
|
||||
|
||||
typename Vector::size_type size() const {
|
||||
return _objects.size();
|
||||
}
|
||||
object_type* getByName(const std::string& name) {
|
||||
return _getByName(name);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
const object_type* getByName(const std::string& name) const {
|
||||
return _getByName(name);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
object_type* getByIndex(unsigned int index) {
|
||||
return _getByIndex(index);
|
||||
}
|
||||
|
||||
object_type* _getByIndex(unsigned int index) const {
|
||||
for(ConstIterator i = begin(); i != end(); i++) {
|
||||
if(i->valid() && i->get()->getIndex() == index) return i->get();
|
||||
}
|
||||
const object_type* getByIndex(unsigned int index) const {
|
||||
return _getByIndex(index);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
unsigned int getNumObjects() const {
|
||||
return _objects.size();
|
||||
}
|
||||
|
||||
public:
|
||||
object_type* getByName(const std::string& name) {
|
||||
return _getByName(name);
|
||||
}
|
||||
Vector& getObjects() {
|
||||
return _objects;
|
||||
}
|
||||
|
||||
const object_type* getByName(const std::string& name) const {
|
||||
return _getByName(name);
|
||||
}
|
||||
const Vector& getObjects() const {
|
||||
return _objects;
|
||||
}
|
||||
|
||||
object_type* getByIndex(unsigned int index) {
|
||||
return _getByIndex(index);
|
||||
}
|
||||
protected:
|
||||
|
||||
const object_type* getByIndex(unsigned int index) const {
|
||||
return _getByIndex(index);
|
||||
}
|
||||
bool _remove(object_type* obj) {
|
||||
Iterator i = std::find(begin(), end(), obj);
|
||||
|
||||
unsigned int getNumObjects() const {
|
||||
return _objects.size();
|
||||
}
|
||||
if(i == end()) return false;
|
||||
|
||||
Vector& getObjects() {
|
||||
return _objects;
|
||||
}
|
||||
_objects.erase(i);
|
||||
|
||||
const Vector& getObjects() const {
|
||||
return _objects;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected:
|
||||
bool _remove(object_type* obj) {
|
||||
Iterator i = std::find(begin(), end(), obj);
|
||||
bool _removeByName(const std::string& name) {
|
||||
for(Iterator i = begin(); i != end(); i++) if(i->get()->getName() == name) {
|
||||
_objects.erase(i);
|
||||
|
||||
if(i == end()) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
_objects.erase(i);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
Vector _objects;
|
||||
|
||||
bool _removeByName(const std::string& name) {
|
||||
for(Iterator i = begin(); i != end(); i++) if(i->get()->getName() == name) {
|
||||
_objects.erase(i);
|
||||
private:
|
||||
|
||||
return true;
|
||||
}
|
||||
// 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;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user