##// END OF EJS Templates
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.

File last commit:

r203:7350e0387b3f
r203:7350e0387b3f
Show More
pieslice.cpp
143 lines | 3.4 KiB | text/x-c | CppLexer
Tero Ahola
Integrated draft version of pie series
r51 #include "pieslice.h"
Jani Honkonen
Refactoring piechart API (and internals)
r174 #include "pieslicelabel.h"
Jani Honkonen
Moved pie stuff to own .pri file and rename stuff
r146 #include "piepresenter.h"
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 #include "qpieseries.h"
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 #include "qpieslice.h"
Tero Ahola
Integrated draft version of pie series
r51 #include <QPainter>
#include <QDebug>
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 #include <qmath.h>
Jani Honkonen
Make pie work better with chartwidgettest
r163 #include <QGraphicsSceneEvent>
Jani Honkonen
Refactoring piechart API (and internals)
r174 #include <QTime>
Tero Ahola
Integrated draft version of pie series
r51
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 #define PI 3.14159265
#define EXPLODE_OFFSET 20
QPointF offset(qreal angle, qreal length)
{
qreal dx = qSin(angle*(PI/180)) * length;
qreal dy = qCos(angle*(PI/180)) * length;
return QPointF(dx, -dy);
}
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 PieSlice::PieSlice(QGraphicsItem* parent)
Jani Honkonen
Refactoring piechart API (and internals)
r174 :QGraphicsObject(parent),
m_slicelabel(new PieSliceLabel(this)),
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 m_angle(0),
m_span(0),
m_isExploded(false)
Tero Ahola
Integrated draft version of pie series
r51 {
setAcceptHoverEvents(true);
Jani Honkonen
Pie chart refactoring
r142 setAcceptedMouseButtons(Qt::LeftButton);
Tero Ahola
Integrated draft version of pie series
r51 }
PieSlice::~PieSlice()
{
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203
Tero Ahola
Integrated draft version of pie series
r51 }
QRectF PieSlice::boundingRect() const
{
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 return m_path.boundingRect();
Tero Ahola
Integrated draft version of pie series
r51 }
QPainterPath PieSlice::shape() const
{
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 return m_path;
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
Pie chart refactoring
r142 void PieSlice::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Refactoring piechart API (and internals)
r174 painter->setRenderHint(QPainter::Antialiasing);
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 painter->setPen(m_pen);
painter->setBrush(m_brush);
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 painter->drawPath(m_path);
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
Refactoring piechart API (and internals)
r174 void PieSlice::hoverEnterEvent(QGraphicsSceneHoverEvent* /*event*/)
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 emit hoverEnter();
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 }
Jani Honkonen
Make pie work better with chartwidgettest
r163 void PieSlice::hoverLeaveEvent(QGraphicsSceneHoverEvent* /*event*/)
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 {
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 emit hoverLeave();
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
Make pie work better with chartwidgettest
r163 void PieSlice::mousePressEvent(QGraphicsSceneMouseEvent* /*event*/)
Jani Honkonen
Pie chart refactoring
r142 {
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 emit clicked();
}
void PieSlice::setPieRect(QRectF rect)
{
m_pieRect = rect;
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 }
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 void PieSlice::updateGeometry()
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 {
prepareGeometryChange();
Jani Honkonen
Refactoring piechart API (and internals)
r174 // calculate center angle
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 qreal centerAngle = m_angle + (m_span/2);
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157
Jani Honkonen
Refactoring piechart API (and internals)
r174 // adjust rect for exploding
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 QRectF rect = m_pieRect;
Jani Honkonen
Refactoring piechart API (and internals)
r174 rect.adjust(EXPLODE_OFFSET, EXPLODE_OFFSET, -EXPLODE_OFFSET ,-EXPLODE_OFFSET);
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 if (m_isExploded) {
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 QPointF d = offset((centerAngle), EXPLODE_OFFSET);
rect.translate(d.x(), d.y());
}
Jani Honkonen
Refactoring piechart API (and internals)
r174 // update slice path
// TODO: draw the shape so that it might have a hole in the center
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 QPainterPath path;
path.moveTo(rect.center());
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 path.arcTo(rect, -m_angle + 90, -m_span);
path.closeSubpath();
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 m_path = path;
Jani Honkonen
Refactoring piechart API (and internals)
r174 // update label position
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 qreal radius = rect.height() / 2;
Jani Honkonen
Refactoring piechart API (and internals)
r174 QPointF edgeCenter = rect.center() + offset(centerAngle, radius + 5);
Jani Honkonen
Implementing slice label
r181
m_slicelabel->setArmStartPoint(edgeCenter);
m_slicelabel->setArmAngle(centerAngle);
m_slicelabel->updateGeometry();
Jani Honkonen
Refactoring piechart API (and internals)
r174
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 //qDebug() << "PieSlice::updateGeometry" << m_slicelabel->text() << boundingRect() << m_angle << m_span;
}
void PieSlice::handleSliceDataChanged()
{
QPieSlice *slice = qobject_cast<QPieSlice*>(sender());
Q_ASSERT(slice);
updateData(slice);
Jani Honkonen
Pie chart refactoring
r142 }
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 void PieSlice::updateData(const QPieSlice* sliceData)
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 {
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 // TODO: compare what has changes to avoid unneccesary geometry updates
Jani Honkonen
Refactoring piechart API (and internals)
r174
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 m_angle = sliceData->angle();
m_span = sliceData->span();
m_isExploded = sliceData->isExploded();
m_pen = sliceData->pen();
m_brush = sliceData->brush();
Jani Honkonen
Refactoring piechart API (and internals)
r174
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 updateGeometry();
Jani Honkonen
Refactoring piechart API (and internals)
r174 update();
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 m_slicelabel->setVisible(sliceData->isLabelVisible());
m_slicelabel->setText(sliceData->label());
m_slicelabel->setPen(sliceData->labelPen());
m_slicelabel->setFont(sliceData->labelFont());
m_slicelabel->setArmLength(sliceData->labelArmLenght());
Jani Honkonen
Implementing slice label
r181 m_slicelabel->updateGeometry(); // text size & font modifies the geometry
Jani Honkonen
Refactoring piechart API (and internals)
r174 m_slicelabel->update();
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 }
Jani Honkonen
Refactoring piechart API (and internals)
r174 #include "moc_pieslice.cpp"
Tero Ahola
Integrated draft version of pie series
r51 QTCOMMERCIALCHART_END_NAMESPACE