[Libreoffice-commits] core.git: chart2/source

Dennis Francis dennis.francis at collabora.co.uk
Mon Aug 28 08:46:46 UTC 2017


 chart2/source/view/charttypes/PieChart.cxx |   12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

New commits:
commit 8c8edfabdee656ac5a9a0b1106f90baf315f1dd4
Author: Dennis Francis <dennis.francis at collabora.co.uk>
Date:   Mon Aug 21 13:59:41 2017 +0530

    tdf#62363: When pie chart sector is too small do "Outside" placement
    
    ...of its label when "Best fit" label placement setting is used.
    
    Change-Id: Id201d922505de0e134286f4772abe282bb0722bc
    Reviewed-on: https://gerrit.libreoffice.org/41572
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/chart2/source/view/charttypes/PieChart.cxx b/chart2/source/view/charttypes/PieChart.cxx
index 35f1d84bc006..d5d9b6e97c98 100644
--- a/chart2/source/view/charttypes/PieChart.cxx
+++ b/chart2/source/view/charttypes/PieChart.cxx
@@ -280,14 +280,23 @@ void PieChart::createTextLabelShape(
     ///the label position is allowed; the `createTextLabelShape` treats the
     ///`AVOID_OVERLAP` as if it was of `CENTER` type;
 
+    double nVal = rSeries.getYValue(nPointIndex);
     //AVOID_OVERLAP is in fact "Best fit" in the UI.
     bool bMovementAllowed = ( nLabelPlacement == css::chart::DataLabelPlacement::AVOID_OVERLAP );
     if( bMovementAllowed )
+    {
         // Use center for "Best fit" for now. In the future we
         // may want to implement a real best fit algorithm.
         // But center is good enough, and close to what Excel
         // does.
-        nLabelPlacement = css::chart::DataLabelPlacement::CENTER;
+
+        // Place the label outside if the sector is too small
+        // The threshold is set to 2%, but can be improved by making it a function of
+        // label width and radius too ?
+        double fFrac = fabs( nVal / rParam.mfLogicYSum );
+        nLabelPlacement = ( fFrac <= 0.02 ) ? css::chart::DataLabelPlacement::OUTSIDE :
+            css::chart::DataLabelPlacement::CENTER;
+    }
 
     ///for `OUTSIDE` (`INSIDE`) label placements an offset of 150 (-150), in the
     ///radius direction, is added to the final screen position of the label
@@ -346,7 +355,6 @@ void PieChart::createTextLabelShape(
     sal_Int32 nTextMaximumFrameWidth = ceil(fTextMaximumFrameWidth);
 
     ///the text shape for the label is created
-    double nVal = rSeries.getYValue(nPointIndex);
     aPieLabelInfo.xTextShape = createDataLabel(
         xTextTarget, rSeries, nPointIndex, nVal, rParam.mfLogicYSum,
         aScreenPosition2D, eAlignment, 0, nTextMaximumFrameWidth);


More information about the Libreoffice-commits mailing list