From 14f04878d1f8c29106f87c2310be9bac67ffbd39 Mon Sep 17 00:00:00 2001 From: Thomas Geymayer Date: Tue, 11 Jun 2013 22:09:57 +0200 Subject: [PATCH] CanvasGroup: allow derived classes to provide more/other child factories --- simgear/canvas/elements/CanvasElement.hxx | 20 ++++++++++++ simgear/canvas/elements/CanvasGroup.cxx | 37 ++++++++++------------- simgear/canvas/elements/CanvasGroup.hxx | 6 ++++ 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/simgear/canvas/elements/CanvasElement.hxx b/simgear/canvas/elements/CanvasElement.hxx index 693aec88..deb57f67 100644 --- a/simgear/canvas/elements/CanvasElement.hxx +++ b/simgear/canvas/elements/CanvasElement.hxx @@ -137,6 +137,26 @@ namespace canvas */ virtual osg::BoundingBox getTransformedBounds(const osg::Matrix& m) const; + /** + * Create an canvas Element + * + * @tparam Derived Type of element (needs to derive from Element) + */ + template + static + typename boost::enable_if< + boost::is_base_of, + ElementPtr + >::type create( const CanvasWeakPtr& canvas, + const SGPropertyNode_ptr& node, + const Style& style, + Element* parent ) + { + ElementPtr el( new Derived(canvas, node, style, parent) ); + el->setSelf(el); + return el; + } + protected: enum Attributes diff --git a/simgear/canvas/elements/CanvasGroup.cxx b/simgear/canvas/elements/CanvasGroup.cxx index e0ad87e0..ff0cdd5f 100644 --- a/simgear/canvas/elements/CanvasGroup.cxx +++ b/simgear/canvas/elements/CanvasGroup.cxx @@ -32,27 +32,13 @@ namespace simgear { namespace canvas { - /** - * Create an canvas Element of type T - */ - template - ElementPtr createElement( const CanvasWeakPtr& canvas, - const SGPropertyNode_ptr& node, - const Style& style, - Element* parent ) - { - ElementPtr el( new T(canvas, node, style, parent) ); - el->setSelf(el); - return el; - } - /** * Add canvas Element type to factory map */ - template + template void add(ElementFactories& factories) { - factories[T::TYPE_NAME] = &createElement; + factories[ElementType::TYPE_NAME] = &Element::create; } //---------------------------------------------------------------------------- @@ -231,17 +217,26 @@ namespace canvas return bb; } + //---------------------------------------------------------------------------- + ElementFactory Group::getChildFactory(const std::string& type) const + { + ElementFactories::iterator child_factory = _child_factories.find(type); + if( child_factory != _child_factories.end() ) + return child_factory->second; + + return ElementFactory(); + } + //---------------------------------------------------------------------------- void Group::childAdded(SGPropertyNode* child) { if( child->getParent() != _node ) return; - ElementFactories::iterator child_factory = - _child_factories.find( child->getNameString() ); - if( child_factory != _child_factories.end() ) + ElementFactory child_factory = getChildFactory( child->getNameString() ); + if( child_factory ) { - ElementPtr element = child_factory->second(_canvas, child, _style, this); + ElementPtr element = child_factory(_canvas, child, _style, this); // Add to osg scene graph... _transform->addChild( element->getMatrixTransform() ); @@ -266,7 +261,7 @@ namespace canvas if( node->getParent() != _node ) return; - if( _child_factories.find(node->getNameString()) != _child_factories.end() ) + if( getChildFactory(node->getNameString()) ) { ElementPtr child = getChild(node); if( !child ) diff --git a/simgear/canvas/elements/CanvasGroup.hxx b/simgear/canvas/elements/CanvasGroup.hxx index f3ba781e..81c6e639 100644 --- a/simgear/canvas/elements/CanvasGroup.hxx +++ b/simgear/canvas/elements/CanvasGroup.hxx @@ -100,6 +100,12 @@ namespace canvas static ElementFactories _child_factories; + /** + * 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); -- 2.39.5