##// END OF EJS Templates
Values and Intervals axes ranges are now initialized only if they haven't been preset earlier
Values and Intervals axes ranges are now initialized only if they haven't been preset earlier

File last commit:

r1697:b1c06caff815
r1703:d83729eb88d8
Show More
piesliceitem.cpp
250 lines | 8.1 KiB | text/x-c | CppLexer
Jani Honkonen
Add license headers
r794 /****************************************************************************
**
** Copyright (C) 2012 Digia Plc
** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 #include "piesliceitem_p.h"
Jani Honkonen
Rename piepresenter -> piechartitem
r568 #include "piechartitem_p.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
Z order for pie
r490 #include "chartpresenter_p.h"
Tero Ahola
Integrated draft version of pie series
r51 #include <QPainter>
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
Fixed a bug with pie slice clip rect
r1297 #include <QDebug>
Tero Ahola
Integrated draft version of pie series
r51
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 QPointF offset(qreal angle, qreal length)
{
Jani Honkonen
pieslice: fix slice labels turning the wrong way...
r1327 qreal dx = qSin(angle*(M_PI/180)) * length;
qreal dy = qCos(angle*(M_PI/180)) * length;
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 return QPointF(dx, -dy);
}
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 PieSliceItem::PieSliceItem(QGraphicsItem* parent)
Jani Honkonen
Emit hover leave signal from PieSliceItem when it gets destroyed....
r1083 :QGraphicsObject(parent),
Marek Rosa
Added initial donut chart support to Pie series
r1670 m_hovered(false)
Tero Ahola
Integrated draft version of pie series
r51 {
setAcceptHoverEvents(true);
Jani Honkonen
Add mousebuttons to pie clicked signals
r707 setAcceptedMouseButtons(Qt::MouseButtonMask);
Tero Ahola
Z order for pie
r490 setZValue(ChartPresenter::PieSeriesZValue);
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 PieSliceItem::~PieSliceItem()
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Emit hover leave signal from PieSliceItem when it gets destroyed....
r1083 // If user is hovering over the slice and it gets destroyed we do
// not get a hover leave event. So we must emit the signal here.
if (m_hovered)
emit hovered(false);
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 QRectF PieSliceItem::boundingRect() const
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Refactoring pie series and animations.
r621 return m_boundingRect;
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 QPainterPath PieSliceItem::shape() const
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Introducing vertical and horizontal factors to control the position of the pie.
r454 // Don't include the label and label arm.
// This is used to detect a mouse clicks. We do not want clicks from label.
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 return m_slicePath;
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 void PieSliceItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/)
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 painter->save();
Tero Ahola
Declarative series classed now derived from QSeries childs
r789 painter->setClipRect(parentItem()->boundingRect());
Jani Honkonen
Adding PIMPL to pie
r669 painter->setPen(m_data.m_slicePen);
painter->setBrush(m_data.m_sliceBrush);
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 painter->drawPath(m_slicePath);
painter->restore();
Jani Honkonen
Fix setting custom color to pie. Now the pie knows if the color is set by the user.
r691 if (m_data.m_isLabelVisible) {
Tero Ahola
Fixed a bug with pie slice clip rect
r1297 painter->save();
Jani Honkonen
pie: add label position to slice
r1450
Tero Ahola
Use labelBrush instead of labelPen for text labels
r1307 // Pen for label arm not defined in the QPieSeries api, let's use brush's color instead
// Also, the drawText actually uses the pen color for the text color (unlike QGraphicsSimpleTextItem)
painter->setPen(m_data.m_labelBrush.color());
Jani Honkonen
pie: add label position to slice
r1450 painter->setBrush(m_data.m_labelBrush);
Jani Honkonen
Rename PieSliceLayout -> PieSliceData. A "layout" is a bad name for this.
r668 painter->setFont(m_data.m_labelFont);
Marek Rosa
Added insert, remove and other common methodds to QDonutGroup. Donut example added
r1693 if (m_data.m_donut) {
painter->translate(m_labelTextRect.center());
painter->rotate(m_data.m_startAngle + m_data.m_angleSpan / 2);
painter->drawText(-m_labelTextRect.width() / 2, -m_labelTextRect.height() / 2, m_labelTextRect.width(), m_labelTextRect.height(), Qt::AlignCenter, m_data.m_labelText);
Marek Rosa
Removed QDonutGroup class. Added Donut Drill down example
r1697 } else if (m_data.m_labelPosition == QPieSlice::LabelOutside) {
Jani Honkonen
pie: add label position to slice
r1450 painter->setClipRect(parentItem()->boundingRect());
painter->strokePath(m_labelArmPath, m_data.m_labelBrush.color());
Marek Rosa
Minor fix.
r1694 painter->drawText(m_labelTextRect, Qt::AlignCenter, m_data.m_labelText);
Jani Honkonen
pie: add label position to slice
r1450 } else { // QPieSlice::LabelInside
painter->setClipPath(m_slicePath);
Marek Rosa
Added insert, remove and other common methodds to QDonutGroup. Donut example added
r1693 painter->drawText(m_labelTextRect, Qt::AlignCenter, m_data.m_labelText);
Jani Honkonen
pie: add label position to slice
r1450 }
Tero Ahola
Fixed a bug with pie slice clip rect
r1297 painter->restore();
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 }
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 void PieSliceItem::hoverEnterEvent(QGraphicsSceneHoverEvent* /*event*/)
Tero Ahola
Integrated draft version of pie series
r51 {
Jani Honkonen
Emit hover leave signal from PieSliceItem when it gets destroyed....
r1083 m_hovered = true;
Jani Honkonen
API review changes for pie
r1009 emit hovered(true);
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 void PieSliceItem::hoverLeaveEvent(QGraphicsSceneHoverEvent* /*event*/)
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 {
Jani Honkonen
Emit hover leave signal from PieSliceItem when it gets destroyed....
r1083 m_hovered = false;
Jani Honkonen
API review changes for pie
r1009 emit hovered(false);
Tero Ahola
Integrated draft version of pie series
r51 }
Jani Honkonen
Add mousebuttons to pie clicked signals
r707 void PieSliceItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
Jani Honkonen
Pie chart refactoring
r142 {
Jani Honkonen
Add mousebuttons to pie clicked signals
r707 emit clicked(event->buttons());
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 }
Jani Honkonen
Refactor graphical side of pie to simplify the implementation.
r1074 void PieSliceItem::setLayout(const PieSliceData &sliceData)
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 {
Jani Honkonen
Rename PieSliceLayout -> PieSliceData. A "layout" is a bad name for this.
r668 m_data = sliceData;
Jani Honkonen
Refactor graphical side of pie to simplify the implementation.
r1074 updateGeometry();
update();
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 void PieSliceItem::updateGeometry()
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 {
Jani Honkonen
Rename PieSliceLayout -> PieSliceData. A "layout" is a bad name for this.
r668 if (m_data.m_radius <= 0)
Jani Honkonen
Make pie fit better inside its given rectangle. Label texts still go outside. Needs a bit more work...
r289 return;
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 prepareGeometryChange();
Jani Honkonen
pie: add label position to slice
r1450 // slice path
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 qreal centerAngle;
QPointF armStart;
Jani Honkonen
Rename PieSliceLayout -> PieSliceData. A "layout" is a bad name for this.
r668 m_slicePath = slicePath(m_data.m_center, m_data.m_radius, m_data.m_startAngle, m_data.m_angleSpan, &centerAngle, &armStart);
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157
Jani Honkonen
pie: add label position to slice
r1450 // text rect
QFontMetricsF fm(m_data.m_labelFont);
m_labelTextRect = QRectF(0, 0, fm.width(m_data.m_labelText), fm.height());
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157
Jani Honkonen
pie: add label position to slice
r1450 // label arm path
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 QPointF labelTextStart;
Jani Honkonen
Rename PieSliceLayout -> PieSliceData. A "layout" is a bad name for this.
r668 m_labelArmPath = labelArmPath(armStart, centerAngle, m_data.m_radius * m_data.m_labelArmLengthFactor, m_labelTextRect.width(), &labelTextStart);
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157
Jani Honkonen
pie: add label position to slice
r1450 // text position
Marek Rosa
Added insert, remove and other common methodds to QDonutGroup. Donut example added
r1693 if (m_data.m_donut) {
QPointF donutCenter = m_data.m_center + offset(centerAngle, m_data.m_innerRadius + (m_data.m_radius - m_data.m_innerRadius) / 2);
m_labelTextRect.moveCenter(donutCenter);
} else if (m_data.m_labelPosition == QPieSlice::LabelOutside) {
Jani Honkonen
pie: add label position to slice
r1450 m_labelTextRect.moveBottomLeft(labelTextStart);
Marek Rosa
Added insert, remove and other common methodds to QDonutGroup. Donut example added
r1693 } else {// QPieSlice::LabelInside
Jani Honkonen
pie: add label position to slice
r1450 QPointF sliceCenter = m_data.m_center + offset(centerAngle, m_data.m_radius / 2);
m_labelTextRect.moveCenter(sliceCenter);
}
Jani Honkonen
Refactoring piechart API (and internals)
r174
Jani Honkonen
pie: add label position to slice
r1450 // bounding rect
Jani Honkonen
PieSliceItem bounding rect fix
r718 if (m_data.m_isLabelVisible)
m_boundingRect = m_slicePath.boundingRect().united(m_labelArmPath.boundingRect()).united(m_labelTextRect);
else
m_boundingRect = m_slicePath.boundingRect();
Jani Honkonen
Refactor pie (again). QPieSlice's now emit signals and no id's anymore. Just pointers in the interface.
r203 }
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 QPointF PieSliceItem::sliceCenter(QPointF point, qreal radius, QPieSlice *slice)
Jani Honkonen
Refactoring the pie for animations (no actual animations yet)
r566 {
if (slice->isExploded()) {
Jani Honkonen
pie: added everything as a property in QPieSlice...
r1274 qreal centerAngle = slice->startAngle() + (slice->angleSpan()/2);
Jani Honkonen
Refactoring the pie for animations (no actual animations yet)
r566 qreal len = radius * slice->explodeDistanceFactor();
Jani Honkonen
pieslice: fix slice labels turning the wrong way...
r1327 point += offset(centerAngle, len);
Jani Honkonen
Refactoring the pie for animations (no actual animations yet)
r566 }
return point;
Jani Honkonen
Use signals from pieseries, visible hover and exploding slices
r157 }
Jani Honkonen
Prevent slice label pointing straight down (because it looks bad).
r972 QPainterPath PieSliceItem::slicePath(QPointF center, qreal radius, qreal startAngle, qreal angleSpan, qreal *centerAngle, QPointF* armStart)
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 {
// calculate center angle
*centerAngle = startAngle + (angleSpan/2);
// calculate slice rectangle
QRectF rect(center.x()-radius, center.y()-radius, radius*2, radius*2);
// slice path
QPainterPath path;
Marek Rosa
Added initial donut chart support to Pie series
r1670 if (m_data.m_donut) {
Marek Rosa
Added QDonutGroup class
r1671 QRectF insideRect(center.x() - m_data.m_innerRadius, center.y()-m_data.m_innerRadius, m_data.m_innerRadius*2, m_data.m_innerRadius*2);
Marek Rosa
Added initial donut chart support to Pie series
r1670 path.arcMoveTo(rect, -startAngle + 90);
path.arcTo(rect, -startAngle + 90, -angleSpan);
path.arcTo(insideRect, -startAngle + 90 - angleSpan, angleSpan);
path.closeSubpath();
} else {
path.moveTo(rect.center());
path.arcTo(rect, -startAngle + 90, -angleSpan);
path.closeSubpath();
}
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437
// calculate label arm start point
*armStart = center;
Jani Honkonen
Refactoring the pie for animations (no actual animations yet)
r566 *armStart += offset(*centerAngle, radius + PIESLICE_LABEL_GAP);
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437
return path;
}
Jani Honkonen
Prevent slice label pointing straight down (because it looks bad).
r972 QPainterPath PieSliceItem::labelArmPath(QPointF start, qreal angle, qreal length, qreal textWidth, QPointF *textStart)
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 {
Jani Honkonen
pieslice: fix slice labels turning the wrong way...
r1327 // Normalize the angle to 0-360 range
// NOTE: We are using int here on purpose. Depenging on platform and hardware
// qreal can be a double, float or something the user gives to the Qt configure
// (QT_COORD_TYPE). Compilers do not seem to support modulo for double or float
// but there are fmod() and fmodf() functions for that. So instead of some #ifdef
// that might break we just use int. Precision for this is just fine for our needs.
int normalized = angle * 10.0;
normalized = normalized % 3600;
if (normalized < 0)
normalized += 3600;
angle = (qreal) normalized / 10.0;
Jani Honkonen
Prevent slice label pointing straight down (because it looks bad).
r972 // prevent label arm pointing straight down because it will look bad
if (angle < 180 && angle > 170)
angle = 170;
if (angle > 180 && angle < 190)
angle = 190;
// line from slice to label
Jani Honkonen
pieslice: fix slice labels turning the wrong way...
r1327 QPointF parm1 = start + offset(angle, length);
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437
Jani Honkonen
Prevent slice label pointing straight down (because it looks bad).
r972 // line to underline the label
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 QPointF parm2 = parm1;
if (angle < 180) { // arm swings the other way on the left side
Marek Rosa
Added initial donut chart support to Pie series
r1670 parm2 += QPointF(textWidth, 0);
*textStart = parm1;
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 }
else {
Marek Rosa
Added initial donut chart support to Pie series
r1670 parm2 += QPointF(-textWidth,0);
*textStart = parm2;
Jani Honkonen
Added a pie chart customization example and refactoring the pie interface.
r437 }
QPainterPath path;
path.moveTo(start);
path.lineTo(parm1);
path.lineTo(parm2);
return path;
}
Jani Honkonen
rename PieSlice -> PieSliceItem
r673 #include "moc_piesliceitem_p.cpp"
Jani Honkonen
Refactoring piechart API (and internals)
r174
Tero Ahola
Integrated draft version of pie series
r51 QTCOMMERCIALCHART_END_NAMESPACE
Marek Rosa
Added insert, remove and other common methodds to QDonutGroup. Donut example added
r1693