chart2/source/view/charttypes/PieChart.cxx |   37 +++++++++++++++++++++--------
 chart2/source/view/charttypes/PieChart.hxx |    1 
 2 files changed, 28 insertions(+), 10 deletions(-)

New commits:
commit 8da681e5ef48606716219b2a4919ee90bf7a0d6b
Author:     Kurt Nordback <kurt.nordb...@protonmail.com>
AuthorDate: Tue Sep 26 15:23:52 2023 -0600
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Feb 15 20:26:24 2024 +0100

    tdf#50934: Some rejiggering of of-pie code, plus implementing subpie chart
    
    Change-Id: I91fca31db0eb0bfb673e77f1369abe110fe405b7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160724
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/chart2/source/view/charttypes/PieChart.cxx 
b/chart2/source/view/charttypes/PieChart.cxx
index 49cf48de3f05..201e226119ab 100644
--- a/chart2/source/view/charttypes/PieChart.cxx
+++ b/chart2/source/view/charttypes/PieChart.cxx
@@ -243,6 +243,7 @@ bool PieChart::shouldSnapRectToUsedArea()
 }
 
 rtl::Reference<SvxShape> PieChart::createDataPoint(
+    const SubPieType e_subType,
     const rtl::Reference<SvxShapeGroupAnyD>& xTarget,
     const uno::Reference<beans::XPropertySet>& xObjectProperties,
     const ShapeParam& rParam,
@@ -286,12 +287,28 @@ rtl::Reference<SvxShape> PieChart::createDataPoint(
             drawing::Position3D aNewOrigin = 
m_aPosHelper.transformUnitCircleToScene(fAngle, fRadius, rParam.mfLogicZ);
             aOffset = aNewOrigin - aOrigin;
         }
-    } else if (m_eSubType != PieChartSubType_NONE) {
-        // Draw the main pie for bar-of-pie/pie-of-pie smaller and to the left
-        drawing::Position3D aOrigin = 
m_aPosHelper.transformUnitCircleToScene(0, 0, rParam.mfLogicZ);
-        drawing::Position3D aNewOrigin = 
m_aPosHelper.transformUnitCircleToScene(180, 1.0, rParam.mfLogicZ);
-        aOffset = aNewOrigin - aOrigin;
-        fExplodedOuterRadius *= 2.0/3;
+    } else {
+        drawing::Position3D aOrigin, aNewOrigin;
+        switch (e_subType) {
+            case SubPieType::LEFT:
+                // Draw the main pie for bar-of-pie/pie-of-pie smaller and to 
the left
+                aOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0, 
rParam.mfLogicZ);
+                aNewOrigin = m_aPosHelper.transformUnitCircleToScene(180, 
0.75, rParam.mfLogicZ);
+                aOffset = aNewOrigin - aOrigin;
+                fExplodedOuterRadius *= 2.0/3;
+                break;
+            case SubPieType::RIGHT:
+                // Draw the sub-pie for pie-of-pie much smaller and to the 
right
+                aOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0, 
rParam.mfLogicZ);
+                aNewOrigin = m_aPosHelper.transformUnitCircleToScene(0, 0.75, 
rParam.mfLogicZ);
+                aOffset = aNewOrigin - aOrigin;
+                fExplodedOuterRadius *= 1.0/3;
+                break;
+            case SubPieType::NONE:
+            default:
+                // no change
+                break;
+        }
     }
 
 
@@ -847,10 +864,11 @@ void PieChart::createShapes()
             createOneRing(SubPieType::NONE, fSlotX, aParam, xSeriesTarget, 
xTextTarget, pSeries, n3DRelativeHeight);
             break;
         case PieChartSubType_BAR:
-            createOneRing(SubPieType::LEFT, fSlotX, aParam, xSeriesTarget, 
xTextTarget, pSeries, n3DRelativeHeight);
+            createOneRing(SubPieType::LEFT, 0, aParam, xSeriesTarget, 
xTextTarget, pSeries, n3DRelativeHeight);
             break;
         case PieChartSubType_PIE:
-            createOneRing(SubPieType::LEFT, fSlotX, aParam, xSeriesTarget, 
xTextTarget, pSeries, n3DRelativeHeight);
+            createOneRing(SubPieType::LEFT, 0, aParam, xSeriesTarget, 
xTextTarget, pSeries, n3DRelativeHeight);
+            createOneRing(SubPieType::RIGHT, 0, aParam, xSeriesTarget, 
xTextTarget, pSeries, n3DRelativeHeight);
             break;
         default:
             assert(false); // this shouldn't happen
@@ -949,8 +967,7 @@ void PieChart::createOneRing([[maybe_unused]]enum 
SubPieType eType,
             // Do concentric explosion if it's a donut chart with more than 
one series
             const bool bConcentricExplosion = m_bUseRings && 
(m_aZSlots.front().size() > 1);
             rtl::Reference<SvxShape> xPointShape =
-                createDataPoint(
-                    xSeriesGroupShape_Shapes, xPointProperties, aParam, 
nPointCount,
+                createDataPoint(eType, xSeriesGroupShape_Shapes, 
xPointProperties, aParam, nPointCount,
                     bConcentricExplosion);
 
             ///point color:
diff --git a/chart2/source/view/charttypes/PieChart.hxx 
b/chart2/source/view/charttypes/PieChart.hxx
index 5c04ee05cf86..0517c87d67cd 100644
--- a/chart2/source/view/charttypes/PieChart.hxx
+++ b/chart2/source/view/charttypes/PieChart.hxx
@@ -84,6 +84,7 @@ public:
 private: //methods
     rtl::Reference<SvxShape>
         createDataPoint(
+            enum SubPieType eType,
             const rtl::Reference<SvxShapeGroupAnyD>& xTarget,
             const css::uno::Reference<css::beans::XPropertySet>& 
xObjectProperties,
             const ShapeParam& rParam,

Reply via email to