return el;
}
+ //----------------------------------------------------------------------------
+ ElementFactories Group::_child_factories;
+
//----------------------------------------------------------------------------
Group::Group( const CanvasWeakPtr& canvas,
const SGPropertyNode_ptr& node,
Element* parent ):
Element(canvas, node, parent_style, parent)
{
- _child_factories["group"] = &createElement<Group>;
- _child_factories["image"] = &createElement<Image>;
- _child_factories["map" ] = &createElement<Map >;
- _child_factories["path" ] = &createElement<Path >;
- _child_factories["text" ] = &createElement<Text >;
+ if( !isInit<Group>() )
+ {
+ _child_factories["group"] = &createElement<Group>;
+ _child_factories["image"] = &createElement<Image>;
+ _child_factories["map" ] = &createElement<Map >;
+ _child_factories["path" ] = &createElement<Path >;
+ _child_factories["text" ] = &createElement<Text >;
+ }
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
bool Group::setStyle(const SGPropertyNode* style)
{
+ // Don't propagate styles directly applicable to this group
+ if( Element::setStyle(style) )
+ return true;
+
if( style->getParent() != _node
&& _style.find(style->getNameString()) != _style.end() )
return false;
if( child->getParent() != _node )
return;
- ChildFactories::iterator child_factory =
+ ElementFactories::iterator child_factory =
_child_factories.find( child->getNameString() );
if( child_factory != _child_factories.end() )
{
_transform->addChild( element->getMatrixTransform() );
_children.push_back( ChildList::value_type(child, element) );
+ // ...and ensure correct ordering
+ handleZIndexChanged( --_children.end() );
+
return;
}
- _style[ child->getNameString() ] = child;
- setStyle(child);
+ if( !Element::setStyle(child) )
+ {
+ // Only add style if not applicable to group itself
+ _style[ child->getNameString() ] = child;
+ setStyle(child);
+ }
}
//----------------------------------------------------------------------------
{
if( node->getParent()->getParent() == _node
&& node->getNameString() == "z-index" )
- return handleZIndexChanged(node->getParent(), node->getIntValue());
+ return handleZIndexChanged( findChild(node->getParent()),
+ node->getIntValue() );
}
//----------------------------------------------------------------------------
- void Group::handleZIndexChanged(SGPropertyNode* node, int z_index)
+ void Group::handleZIndexChanged(ChildList::iterator child, int z_index)
{
- ChildList::iterator child = findChild(node);
if( child == _children.end() )
return;