Canvas::Group: Print warning message if using expired Group instead of crashing

This commit is contained in:
Thomas Geymayer 2013-07-12 17:48:21 +02:00
parent 5320d0ecaa
commit 01c45633b7

View File

@ -45,6 +45,13 @@ namespace canvas
ElementFactories Group::_child_factories; ElementFactories Group::_child_factories;
const std::string Group::TYPE_NAME = "group"; const std::string Group::TYPE_NAME = "group";
void warnTransformExpired(const char* member_name)
{
SG_LOG( SG_GENERAL,
SG_WARN,
"canvas::Group::" << member_name << ": Group has expired." );
}
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
Group::Group( const CanvasWeakPtr& canvas, Group::Group( const CanvasWeakPtr& canvas,
const SGPropertyNode_ptr& node, const SGPropertyNode_ptr& node,
@ -119,8 +126,13 @@ namespace canvas
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
ElementPtr Group::getElementById(const std::string& id) ElementPtr Group::getElementById(const std::string& id)
{ {
std::vector<GroupPtr> groups; if( !_transform.valid() )
{
warnTransformExpired("getElementById");
return ElementPtr();
}
std::vector<GroupPtr> groups;
for(size_t i = 0; i < _transform->getNumChildren(); ++i) for(size_t i = 0; i < _transform->getNumChildren(); ++i)
{ {
const ElementPtr& el = getChildByIndex(i); const ElementPtr& el = getChildByIndex(i);
@ -145,6 +157,8 @@ namespace canvas
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void Group::clearEventListener() void Group::clearEventListener()
{ {
if( _transform.valid() )
return warnTransformExpired("clearEventListener");
for(size_t i = 0; i < _transform->getNumChildren(); ++i) for(size_t i = 0; i < _transform->getNumChildren(); ++i)
getChildByIndex(i)->clearEventListener(); getChildByIndex(i)->clearEventListener();
@ -183,6 +197,12 @@ namespace canvas
bool handled = setStyleImpl(style, style_info); bool handled = setStyleImpl(style, style_info);
if( style_info->inheritable ) if( style_info->inheritable )
{ {
if( !_transform.valid() )
{
warnTransformExpired("setStyle");
return false;
}
for(size_t i = 0; i < _transform->getNumChildren(); ++i) for(size_t i = 0; i < _transform->getNumChildren(); ++i)
handled |= getChildByIndex(i)->setStyle(style, style_info); handled |= getChildByIndex(i)->setStyle(style, style_info);
} }
@ -194,6 +214,11 @@ namespace canvas
osg::BoundingBox Group::getTransformedBounds(const osg::Matrix& m) const osg::BoundingBox Group::getTransformedBounds(const osg::Matrix& m) const
{ {
osg::BoundingBox bb; osg::BoundingBox bb;
if( !_transform.valid() )
{
warnTransformExpired("getTransformedBounds");
return bb;
}
for(size_t i = 0; i < _transform->getNumChildren(); ++i) for(size_t i = 0; i < _transform->getNumChildren(); ++i)
{ {
@ -232,6 +257,9 @@ namespace canvas
ElementFactory child_factory = getChildFactory( child->getNameString() ); ElementFactory child_factory = getChildFactory( child->getNameString() );
if( child_factory ) if( child_factory )
{ {
if( !_transform.valid() )
return warnTransformExpired("childAdded");
ElementPtr element = child_factory(_canvas, child, _style, this); ElementPtr element = child_factory(_canvas, child, _style, this);
// Add to osg scene graph... // Add to osg scene graph...
@ -294,7 +322,7 @@ namespace canvas
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void Group::handleZIndexChanged(ElementPtr child, int z_index) void Group::handleZIndexChanged(ElementPtr child, int z_index)
{ {
if( !child ) if( !child || _transform.valid() )
return; return;
osg::ref_ptr<osg::MatrixTransform> tf = child->getMatrixTransform(); osg::ref_ptr<osg::MatrixTransform> tf = child->getMatrixTransform();
@ -355,6 +383,12 @@ namespace canvas
ElementPtr Group::findChild( const SGPropertyNode* node, ElementPtr Group::findChild( const SGPropertyNode* node,
const std::string& id ) const const std::string& id ) const
{ {
if( !_transform.valid() )
{
warnTransformExpired("findChild");
return ElementPtr();
}
for(size_t i = 0; i < _transform->getNumChildren(); ++i) for(size_t i = 0; i < _transform->getNumChildren(); ++i)
{ {
ElementPtr el = getChildByIndex(i); ElementPtr el = getChildByIndex(i);