public Element
{
public:
+ static const std::string TYPE_NAME;
+ static void staticInit();
+
typedef std::list< std::pair< const SGPropertyNode*,
ElementPtr
>
const std::string& id = "" );
ElementPtr getChild(const SGPropertyNode* node);
ElementPtr getChild(const std::string& id);
+ ElementPtr getOrCreateChild( const std::string& type,
+ const std::string& id );
+
+ template<class T>
+ boost::shared_ptr<T> createChild(const std::string& id = "")
+ {
+ return boost::dynamic_pointer_cast<T>( createChild(T::TYPE_NAME, id) );
+ }
+
+ template<class T>
+ boost::shared_ptr<T> getChild(const SGPropertyNode* node)
+ {
+ return boost::dynamic_pointer_cast<T>( getChild(node) );
+ }
+
+ template<class T>
+ boost::shared_ptr<T> getChild(const std::string& id)
+ {
+ return boost::dynamic_pointer_cast<T>( getChild(id) );
+ }
+
+ template<class T>
+ boost::shared_ptr<T> getOrCreateChild(const std::string& id)
+ {
+ return
+ boost::dynamic_pointer_cast<T>( getOrCreateChild(T::TYPE_NAME, id) );
+ }
/**
* Get first child with given id (breadth-first search)
virtual bool traverse(EventVisitor& visitor);
- virtual bool setStyle(const SGPropertyNode* child);
+ virtual bool setStyle( const SGPropertyNode* child,
+ const StyleInfo* style_info = 0 );
virtual osg::BoundingBox getTransformedBounds(const osg::Matrix& m) const;
protected:
static ElementFactories _child_factories;
- ChildList _children;
+
+ /**
+ * Overload in derived classes to allow for more/other types of elements
+ * to be managed.
+ */
+ virtual ElementFactory getChildFactory(const std::string& type) const;
virtual void childAdded(SGPropertyNode * child);
virtual void childRemoved(SGPropertyNode * child);
virtual void childChanged(SGPropertyNode * child);
- void handleZIndexChanged(ChildList::iterator child, int z_index = 0);
+ void handleZIndexChanged(ElementPtr child, int z_index = 0);
- ChildList::iterator findChild(const SGPropertyNode* node);
+ ElementPtr getChildByIndex(size_t index) const;
+ ElementPtr findChild( const SGPropertyNode* node,
+ const std::string& id ) const;
};
} // namespace canvas