diff options
author | Grzegorz Araminowicz <grzegorz.araminowicz@collabora.com> | 2019-05-28 13:36:59 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2019-06-03 09:48:49 +0200 |
commit | 8fce4133bd427351ac269c50e02e305d9eb34321 (patch) | |
tree | 7a7684187592c16c561e1c6e84470c4b650203fb /oox | |
parent | SmartArt: adjust text size to fit shapes (diff) | |
download | core-8fce4133bd427351ac269c50e02e305d9eb34321.tar.gz core-8fce4133bd427351ac269c50e02e305d9eb34321.zip |
SmartArt: sort shapes by Z order after layout algorithms
so that they are laid out in correct order
Change-Id: I82baa61311197880654d09f356decc666e6fa4c7
Reviewed-on: https://gerrit.libreoffice.org/73094
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/73255
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/drawingml/diagram/diagram.cxx | 42 | ||||
-rw-r--r-- | oox/source/drawingml/diagram/layoutatomvisitors.cxx | 32 |
2 files changed, 42 insertions, 32 deletions
diff --git a/oox/source/drawingml/diagram/diagram.cxx b/oox/source/drawingml/diagram/diagram.cxx index 8efefe139dbf..be49c85d40aa 100644 --- a/oox/source/drawingml/diagram/diagram.cxx +++ b/oox/source/drawingml/diagram/diagram.cxx @@ -134,6 +134,46 @@ static sal_Int32 calcDepth( const OUString& rNodeName, return 0; } +static void sortChildrenByZOrder(const ShapePtr& pShape) +{ + std::vector<ShapePtr>& rChildren = pShape->getChildren(); + + // Offset the children from their default z-order stacking, if necessary. + for (size_t i = 0; i < rChildren.size(); ++i) + rChildren[i]->setZOrder(i); + + for (size_t i = 0; i < rChildren.size(); ++i) + { + const ShapePtr& pChild = rChildren[i]; + sal_Int32 nZOrderOff = pChild->getZOrderOff(); + if (nZOrderOff <= 0) + continue; + + // Increase my ZOrder by nZOrderOff. + pChild->setZOrder(pChild->getZOrder() + nZOrderOff); + pChild->setZOrderOff(0); + + for (sal_Int32 j = 0; j < nZOrderOff; ++j) + { + size_t nIndex = i + j + 1; + if (nIndex >= rChildren.size()) + break; + + // Decrease the ZOrder of the next nZOrderOff elements by one. + const ShapePtr& pNext = rChildren[nIndex]; + pNext->setZOrder(pNext->getZOrder() - 1); + } + } + + // Now that the ZOrders are adjusted, sort the children. + std::sort(rChildren.begin(), rChildren.end(), + [](const ShapePtr& a, const ShapePtr& b) { return a->getZOrder() < b->getZOrder(); }); + + // Apply also for children. + for (auto& rChild : rChildren) + sortChildrenByZOrder(rChild); +} + void Diagram::build( ) { // build name-object maps @@ -317,6 +357,8 @@ void Diagram::addTo( const ShapePtr & pParentShape ) // layout shapes - now all shapes are created ShapeLayoutingVisitor aLayoutingVisitor; mpLayout->getNode()->accept(aLayoutingVisitor); + + sortChildrenByZOrder(pParentShape); } ShapePtr pBackground(new Shape("com.sun.star.drawing.CustomShape")); diff --git a/oox/source/drawingml/diagram/layoutatomvisitors.cxx b/oox/source/drawingml/diagram/layoutatomvisitors.cxx index a45317f9ffe4..602130b6b3e3 100644 --- a/oox/source/drawingml/diagram/layoutatomvisitors.cxx +++ b/oox/source/drawingml/diagram/layoutatomvisitors.cxx @@ -187,38 +187,6 @@ void ShapeCreationVisitor::visit(LayoutNode& rAtom) std::remove_if(pCurrParent->getChildren().begin(), pCurrParent->getChildren().end(), [] (const ShapePtr & aChild) { return aChild->getServiceName() == "com.sun.star.drawing.GroupShape" && aChild->getChildren().empty(); }), pCurrParent->getChildren().end()); - - // Offset the children from their default z-order stacking, if necessary. - std::vector<ShapePtr>& rChildren = pCurrParent->getChildren(); - for (size_t i = 0; i < rChildren.size(); ++i) - rChildren[i]->setZOrder(i); - - for (size_t i = 0; i < rChildren.size(); ++i) - { - const ShapePtr& pChild = rChildren[i]; - sal_Int32 nZOrderOff = pChild->getZOrderOff(); - if (nZOrderOff <= 0) - continue; - - // Increase my ZOrder by nZOrderOff. - pChild->setZOrder(pChild->getZOrder() + nZOrderOff); - pChild->setZOrderOff(0); - - for (sal_Int32 j = 0; j < nZOrderOff; ++j) - { - size_t nIndex = i + j + 1; - if (nIndex >= rChildren.size()) - break; - - // Decrease the ZOrder of the next nZOrderOff elements by one. - const ShapePtr& pNext = rChildren[nIndex]; - pNext->setZOrder(pNext->getZOrder() - 1); - } - } - - // Now that the ZOrders are adjusted, sort the children. - std::sort(rChildren.begin(), rChildren.end(), - [](const ShapePtr& a, const ShapePtr& b) { return a->getZOrder() < b->getZOrder(); }); } void ShapeCreationVisitor::visit(ShapeAtom& /*rAtom*/) |