16#include "KDChartPieDiagram_p.h"
19#include "KDChartPainterSaver_p.h"
21#include "KDChartPolarCoordinatePlane_p.h"
24#include <KDABLibFakes>
28PieDiagram::Private::Private()
33PieDiagram::Private::~Private()
49void PieDiagram::init()
68 return d->labelDecorations;
73 d->isCollisionAvoidanceEnabled =
enabled;
78 return d->isCollisionAvoidanceEnabled;
91 if (
attrs.explode()) {
133void PieDiagram::calcSliceAngles()
153 d->startAngles[
iColumn] = currentValue;
161 d->startAngles.clear();
162 d->angleLens.clear();
166void PieDiagram::calcPieSize(
const QRectF &contentsRect)
228 d->reverseMapper.clear();
231 if (
d->startAngles.isEmpty()) {
244 d->forgetAlreadyPaintedDataValues();
245 d->labelPaintCache.clear();
248 if (
d->angleLens[
slice] != 0.0) {
255 d->paintDataValueTextsAndMarkers(
paintContext,
d->labelPaintCache,
false,
true,
257 if (
d->isCollisionAvoidanceEnabled) {
294void PieDiagram::shuffleLabels(
QRectF *textBoundingRect)
305 const int n =
lpc.paintReplay.size();
306 bool modified =
false;
307 qreal direction = 5.0;
314 for (
int i = 0;
i <
n;
i++) {
329 qDebug() <<
"collision involving" <<
j <<
"and" <<
i <<
" -- n =" <<
n;
332 lpc.paintReplay[
i].attrs.setTextAttributes(
ta);
349 for (
int i = 0;
i <
lpc.paintReplay.size();
i++) {
369 const qreal dotProduct = l1.
dx() * l2.
dx() + l1.
dy() * l2.
dy();
383 for (
int i = 0; i < 4; i++) {
393 int closestIndex = 0;
394 for (
int i = 0; i < 4; i++) {
396 if (
QLineF(p, center).length() <
QLineF(closest, center).length()) {
403 closeCorners[1] = closest;
407 QLineF edge1 =
QLineF(closeCorners[0], closeCorners[1]);
408 QLineF edge2 =
QLineF(closeCorners[1], closeCorners[2]);
409 QLineF connection1 =
QLineF((closeCorners[0] + closeCorners[1]) / 2.0, center);
410 QLineF connection2 =
QLineF((closeCorners[1] + closeCorners[2]) / 2.0, center);
420 ret.
setP2((start + center) / 2.0);
429void PieDiagram::paintInternal(
PaintContext *paintContext)
485 d->paintDataValueTextsAndMarkers(
paintContext,
d->labelPaintCache,
false,
false);
487 d->forgetAlreadyPaintedDataValues();
494 if (
pi.labelArea.elementCount() != 5) {
505 d->reverseMapper.addPolygon(
pi.index.row(),
pi.index.column(),
508 d->labelPaintCache.clear();
509 d->startAngles.clear();
510 d->angleLens.clear();
514#define trunc(x) (( int )(x))
517QRectF PieDiagram::explodedDrawPosition(
const QRectF &drawPosition, uint slice)
const
523 if (
attrs.explode()) {
543void PieDiagram::drawSlice(
QPainter *painter,
const QRectF &drawPosition, uint slice)
546 if (
d->angleLens[
slice] == 0.0) {
561void PieDiagram::drawSliceSurface(
QPainter *painter,
const QRectF &drawPosition, uint slice)
590 d->reverseMapper.addPolygon(index.row(), index.column(),
poly);
618 d->reverseMapper.addPolygon(index.row(), index.column(),
poly);
625void PieDiagram::addSliceLabel(LabelPaintCache *lpc,
const QRectF &drawPosition, uint slice)
680static bool doSpansOverlap(qreal s1Start, qreal s1End, qreal s2Start, qreal s2End)
682 if (s1Start < s2Start) {
683 return s1End >= s2Start;
685 return s1Start <= s2End;
689static bool doArcsOverlap(qreal a1Start, qreal a1End, qreal a2Start, qreal a2End)
691 Q_ASSERT(a1Start >= 0 && a1Start <= 360 && a1End >= 0 && a1End <= 360 && a2Start >= 0 && a2Start <= 360 && a2End >= 0 && a2End <= 360);
693 if (a1End < a1Start) {
696 if (a2End < a2Start) {
703 if (a1Start > a2Start) {
704 return doSpansOverlap(a1Start - 360.0, a1End - 360.0, a2Start, a2End);
706 return doSpansOverlap(a1Start + 360.0, a1End + 360.0, a2Start, a2End);
717void PieDiagram::draw3DEffect(
QPainter *painter,
const QRectF &drawPosition, uint slice)
743 while (startAngle >= 360)
747 Q_ASSERT(startAngle >= 0 && startAngle <= 360);
761 if (startAngle >= 270 || startAngle <= 90) {
779void PieDiagram::draw3dCutSurface(
QPainter *painter,
804void PieDiagram::draw3dOuterRim(
QPainter *painter,
814 startAngle =
qMax(startAngle,
qreal(180.0));
827 while (
degree >= startAngle) {
836 poly.prepend(pointOnEllipse(
rect, startAngle));
860uint PieDiagram::findSliceAt(qreal angle,
int colCount)
864 if (
d->startAngles[
i] <= angle &&
endseg >= angle) {
872 return findSliceAt(angle + 360,
colCount);
883uint PieDiagram::findLeftSlice(uint slice,
int colCount)
902uint PieDiagram::findRightSlice(uint slice,
int colCount)
915QPointF PieDiagram::pointOnEllipse(
const QRectF &boundingBox, qreal angle)
static bool doArcsOverlap(qreal a1Start, qreal a1End, qreal a2Start, qreal a2End)
static QLineF labelAttachmentLine(const QPointF ¢er, const QPointF &start, const QPainterPath &label)
static QPolygonF polygonFromPainterPath(const QPainterPath &pp)
static qreal normProjection(const QLineF &l1, const QLineF &l2)
static int wraparound(int i, int size)
static bool doSpansOverlap(qreal s1Start, qreal s1End, qreal s2Start, qreal s2End)
virtual bool checkInvariants(bool justReturnTheStatus=false) const
Base class for any diagram type.
PieAttributes pieAttributes() const
qreal granularity() const
bool autoRotateLabels() const
ThreeDPieAttributes threeDPieAttributes() const
const PolarCoordinatePlane * polarCoordinatePlane() const
Stores information about painting diagrams.
void setPainter(QPainter *painter)
A set of attributes controlling the appearance of pie charts.
PieDiagram defines a common pie diagram.
bool isLabelCollisionAvoidanceEnabled() const
Return whether overlapping labels will be moved to until they don't overlap anymore.
LabelDecorations labelDecorations() const
Return the decorations to be painted around data labels.
void setLabelDecorations(LabelDecorations decorations)
Set the decorations to be painted around data labels according to decorations.
qreal valueTotals() const override
void resizeEvent(QResizeEvent *) override
PieDiagram(QWidget *parent=nullptr, PolarCoordinatePlane *plane=nullptr)
void paint(PaintContext *paintContext) override
qreal numberOfGridRings() const override
virtual PieDiagram * clone() const
void paintEvent(QPaintEvent *) override
void resize(const QSizeF &area) override
@ LineFromSliceDecoration
A line is drawn from the pie slice to its label.
@ FrameDecoration
A rectangular frame is painted around the label text.
qreal numberOfValuesPerDataset() const override
void setLabelCollisionAvoidanceEnabled(bool enabled)
const QPair< QPointF, QPointF > calculateDataBoundaries() const override
qreal startPosition() const
Stores the absolute target points of a Position.
static const Position & Center
A set of text attributes.
void setPen(const QPen &pen)
A set of 3D pie attributes.
virtual int columnCount(const QModelIndex &parent) const const=0
QAbstractItemModel * model() const const
QModelIndex rootIndex() const const
const QColor & color() const const
QColor darker(int factor) const const
qreal length() const const
void setLength(qreal length)
void setP2(const QPointF &p2)
T qobject_cast(QObject *object)
void drawEllipse(const QRectF &rectangle)
void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule)
void setBrush(const QBrush &brush)
void setPen(const QColor &color)
void setRenderHint(QPainter::RenderHint hint, bool on)
QPainterPath::Element elementAt(int index) const const
int elementCount() const const
void translate(qreal dx, qreal dy)
void setColor(const QColor &color)
qreal bottom() const const
qreal right() const const
QSizeF size() const const
QTextStream & center(QTextStream &stream)
QTextStream & left(QTextStream &stream)
QTextStream & right(QTextStream &stream)
void append(const T &value)
QVector< T > & fill(const T &value, int size)
QRect contentsRect() const const