#include "lrpiechart.h" namespace LimeReport{ void PieChart::drawPercent(QPainter *painter, QRectF chartRect, qreal startAngle, qreal angle) { painter->save(); QPointF center(chartRect.left()+chartRect.width()/2,chartRect.top()+chartRect.height()/2); qreal percent = angle/3.6; #ifdef HAVE_QT4 qreal radAngle = (angle/2+startAngle)*(M_PI/180); #endif #ifdef HAVE_QT5 qreal radAngle = qDegreesToRadians(angle/2+startAngle); #endif qreal radius = painter->fontMetrics().width("99,9%"); qreal border = chartRect.height()*0.02; qreal length = (chartRect.height())/2-(radius/2+border); qreal x,y; x = length*qCos(radAngle); y = length*qSin(radAngle); QPointF endPoint(center.x()+x,center.y()-y); painter->setPen(Qt::white); QRectF textRect(endPoint.x()-(radius/2),endPoint.y()-(radius/2),radius,radius); qreal arcLength = 3.14 * length * angle / 180; if (arcLength >= radius) painter->drawText(textRect,Qt::AlignCenter,QString::number(percent,'f',1)+"%"); painter->restore(); } void PieChart::paintChart(QPainter *painter, QRectF chartRect) { painter->save(); QPen pen(Qt::white); pen.setWidthF(2); painter->setPen(pen); QBrush brush(Qt::transparent); painter->setBrush(brush); painter->setBackground(QBrush(Qt::NoBrush)); QRectF tmpRect = chartRect; if (chartRect.height()>chartRect.width()){ tmpRect.setHeight(chartRect.width()); tmpRect.adjust(0,(chartRect.bottom()-tmpRect.bottom())/2, 0,(chartRect.bottom()-tmpRect.bottom())/2); } else { tmpRect.setWidth(chartRect.height()); } chartRect = tmpRect; painter->drawRect(chartRect); if (!m_chartItem->series().isEmpty()&&!m_chartItem->series().at(0)->data()->values().isEmpty()){ SeriesItem* si = m_chartItem->series().at(0); qreal sum = 0; foreach(qreal value, si->data()->values()){ sum+=value; } qreal onePercent = sum / 100; qreal currentDegree = 0; for(int i=0; idata()->values().count(); ++i){ qreal value = si->data()->values().at(i); qreal sectorDegree = (value/onePercent)*3.6; painter->setBrush(si->data()->colors().at(i)); painter->drawPie(chartRect,currentDegree*16,sectorDegree*16); drawPercent(painter, chartRect, currentDegree, sectorDegree); currentDegree += sectorDegree; } } else if (m_chartItem->itemMode() == DesignMode){ painter->setBrush(color_map[0]); painter->drawPie(chartRect,0,260*16); drawPercent(painter, chartRect, 0, 260); painter->setBrush(color_map[1]); painter->drawPie(chartRect,260*16,40*16); drawPercent(painter, chartRect, 260, 40); painter->setBrush(color_map[2]); painter->drawPie(chartRect,300*16,60*16); drawPercent(painter, chartRect, 300, 60); } pen.setWidthF(1); pen.setColor(Qt::gray); painter->setPen(pen); painter->setBrush(Qt::NoBrush); painter->drawEllipse(chartRect); painter->restore(); } void PieChart::paintChartLegend(QPainter *painter, QRectF legendRect) { prepareLegendToPaint(legendRect, painter); int indicatorSize = painter->fontMetrics().height()/2; painter->setRenderHint(QPainter::Antialiasing,false); if (m_chartItem->drawLegendBorder()) painter->drawRect(legendRect); painter->setRenderHint(QPainter::Antialiasing,true); QRectF indicatorsRect = legendRect.adjusted(painter->fontMetrics().height()/2,painter->fontMetrics().height()/2,0,0); if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ qreal cw = 0; SeriesItem* si = m_chartItem->series().at(0); for (int i=0;idata()->labels().count();++i){ QString label = si->data()->labels().at(i); painter->setPen(Qt::black); painter->drawText(indicatorsRect.adjusted(indicatorSize+indicatorSize/2,cw,0,0),label); painter->setPen(si->data()->colors().at(i)); painter->setBrush(si->data()->colors().at(i)); painter->drawEllipse( indicatorsRect.adjusted( 0, cw+indicatorSize/2, -(indicatorsRect.width()-indicatorSize), -(indicatorsRect.height()-(cw+indicatorSize+indicatorSize/2)) ) ); cw += painter->fontMetrics().height(); } } else if (m_chartItem->itemMode() == DesignMode){ qreal cw = 0; for (int i=0;isetPen(Qt::black); painter->drawText(indicatorsRect.adjusted(indicatorSize+indicatorSize/2,cw,0,0),label); painter->setBrush(color_map[i]); painter->setPen(color_map[i]); painter->drawEllipse( indicatorsRect.adjusted( 0, cw+indicatorSize/2, -(indicatorsRect.width()-indicatorSize), -(indicatorsRect.height()-(cw+indicatorSize+indicatorSize/2)) ) ); cw += painter->fontMetrics().height(); } } } QSizeF PieChart::calcChartLegendSize(const QFont &font) { QFontMetrics fm(font); qreal cw = 0; qreal maxWidth = 0; if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ SeriesItem* si = m_chartItem->series().at(0); foreach(QString label, si->data()->labels()){ cw += fm.height(); if (maxWidth