X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fcanvas%2Felements%2FCanvasGroup.cxx;h=9bfb8c2f26d3df44be309cc8815c591423dde953;hb=1f431323635de0dd86d60a0fc58efa9557983ef8;hp=176af793e2e9d1cf5ff1c254d7366bf4c993e03b;hpb=d06d94c7672b511ae989d3c85be1389682d3ed51;p=simgear.git diff --git a/simgear/canvas/elements/CanvasGroup.cxx b/simgear/canvas/elements/CanvasGroup.cxx index 176af793..9bfb8c2f 100644 --- a/simgear/canvas/elements/CanvasGroup.cxx +++ b/simgear/canvas/elements/CanvasGroup.cxx @@ -41,9 +41,14 @@ namespace canvas const Style& style, Element* parent ) { - return ElementPtr( new T(canvas, node, style, parent) ); + ElementPtr el( new T(canvas, node, style, parent) ); + el->setSelf(el); + return el; } + //---------------------------------------------------------------------------- + ElementFactories Group::_child_factories; + //---------------------------------------------------------------------------- Group::Group( const CanvasWeakPtr& canvas, const SGPropertyNode_ptr& node, @@ -51,11 +56,14 @@ namespace canvas Element* parent ): Element(canvas, node, parent_style, parent) { - _child_factories["group"] = &createElement; - _child_factories["image"] = &createElement; - _child_factories["map" ] = &createElement; - _child_factories["path" ] = &createElement; - _child_factories["text" ] = &createElement; + if( !isInit() ) + { + _child_factories["group"] = &createElement; + _child_factories["image"] = &createElement; + _child_factories["map" ] = &createElement; + _child_factories["path" ] = &createElement; + _child_factories["text" ] = &createElement; + } } //---------------------------------------------------------------------------- @@ -135,6 +143,10 @@ namespace canvas //---------------------------------------------------------------------------- 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; @@ -177,7 +189,7 @@ namespace canvas if( child->getParent() != _node ) return; - ChildFactories::iterator child_factory = + ElementFactories::iterator child_factory = _child_factories.find( child->getNameString() ); if( child_factory != _child_factories.end() ) { @@ -187,11 +199,18 @@ namespace canvas _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); + } } //---------------------------------------------------------------------------- @@ -229,13 +248,13 @@ namespace canvas { 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;