summaryrefslogtreecommitdiffstats
path: root/src/charts/piechart/qpieslice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/charts/piechart/qpieslice.cpp')
-rw-r--r--src/charts/piechart/qpieslice.cpp794
1 files changed, 794 insertions, 0 deletions
diff --git a/src/charts/piechart/qpieslice.cpp b/src/charts/piechart/qpieslice.cpp
new file mode 100644
index 00000000..48227e26
--- /dev/null
+++ b/src/charts/piechart/qpieslice.cpp
@@ -0,0 +1,794 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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 Enterprise Charts Add-on.
+**
+** $QT_BEGIN_LICENSE$
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise 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$
+**
+****************************************************************************/
+
+#include "qpieslice.h"
+#include "qpieslice_p.h"
+
+QT_CHARTS_BEGIN_NAMESPACE
+
+/*!
+ \class QPieSlice
+ \inmodule Qt Charts
+ \brief Defines a slice in pie series.
+
+ This object defines the properties of a single slice in a QPieSeries.
+
+ In addition to the obvious value and label properties the user can also control
+ the visual appearance of a slice. By modifying the visual appearance also means that
+ the user is overriding the default appearance set by the theme.
+
+ Note that if the user has customized slices and theme is changed all customizations will be lost.
+
+ To enable user interaction with the pie some basic signals are provided about clicking and hovering.
+*/
+
+/*!
+ \qmltype PieSlice
+ \instantiates QPieSlice
+ \inqmlmodule QtCharts
+
+ \brief Defines a slice in pie series.
+
+ PieSlice defines the properties of a single slice in a PieSeries. The element should be used
+ as a child for a PieSeries. For example:
+ \snippet qmlpiechart/qml/qmlpiechart/main.qml 2
+
+ An alternative (dynamic) method for adding slices to a PieSeries is using PieSeries.append
+ method.
+ \snippet qmlpiechart/qml/qmlpiechart/main.qml 4
+
+ In that case you may want to use PieSeries.at or PieSeries.find to access the properties of
+ an individual PieSlice instance.
+ \snippet qmlpiechart/qml/qmlpiechart/main.qml 5
+ \sa PieSeries
+*/
+
+/*!
+ \enum QPieSlice::LabelPosition
+
+ This enum describes the position of the slice label.
+
+ \value LabelOutside Label is outside the slice with an arm.
+ \value LabelInsideHorizontal Label is centered inside the slice and laid out horizontally.
+ \value LabelInsideTangential Label is centered inside the slice and rotated to be parallel to the tangential of the slice's arc.
+ \value LabelInsideNormal Label is centered inside the slice rotated to be parallel to the normal of the slice's arc.
+ */
+
+/*!
+ \property QPieSlice::label
+ Label of the slice.
+ \sa labelVisible, labelBrush, labelFont, labelArmLengthFactor
+*/
+/*!
+ \qmlproperty string PieSlice::label
+ Label (text) of the slice.
+*/
+
+/*!
+ \fn void QPieSlice::labelChanged()
+ This signal emitted when the slice label has been changed.
+ \sa label
+*/
+/*!
+ \qmlsignal PieSlice::onLabelChanged()
+ This signal emitted when the slice label has been changed.
+ \sa label
+*/
+
+/*!
+ \property QPieSlice::value
+ Value of the slice.
+ Note that if users sets a negative value it is converted to a positive value.
+ \sa percentage(), QPieSeries::sum()
+*/
+/*!
+ \qmlproperty real PieSlice::value
+ Value of the slice. Note that if users sets a negative value it is converted to a positive value.
+*/
+
+/*!
+ \fn void QPieSlice::valueChanged()
+ This signal is emitted when the slice value changes.
+ \sa value
+*/
+/*!
+ \qmlsignal PieSlice::onValueChanged()
+ This signal is emitted when the slice value changes.
+ \sa value
+*/
+
+/*!
+ \property QPieSlice::labelVisible
+ Defines the visibility of slice label. By default the label is not visible.
+ \sa label, labelBrush, labelFont, labelArmLengthFactor
+*/
+/*!
+ \qmlproperty bool PieSlice::labelVisible
+ Defines the visibility of slice label. By default the label is not visible.
+*/
+
+/*!
+ \fn void QPieSlice::labelVisibleChanged()
+ This signal emitted when visibility of the slice label has changed.
+ \sa labelVisible
+*/
+/*!
+ \qmlsignal PieSlice::onLabelVisibleChanged()
+ This signal emitted when visibility of the slice label has changed.
+ \sa labelVisible
+*/
+
+/*!
+ \property QPieSlice::exploded
+ If set to true the slice is "exploded" away from the pie.
+ \sa explodeDistanceFactor
+*/
+/*!
+ \qmlproperty bool PieSlice::exploded
+ If set to true the slice is "exploded" away from the pie.
+ \sa explodeDistanceFactor
+*/
+
+/*!
+ \property QPieSlice::pen
+ Pen used to draw the slice border.
+*/
+
+/*!
+ \fn void QPieSlice::penChanged()
+ This signal is emitted when the pen of the slice has changed.
+ \sa pen
+*/
+
+/*!
+ \property QPieSlice::borderColor
+ Color used to draw the slice border.
+ This is a convenience property for modifying the slice pen.
+ \sa pen, borderWidth
+*/
+/*!
+ \qmlproperty color PieSlice::borderColor
+ Color used to draw the slice border (pen color).
+ \sa borderWidth
+*/
+
+/*!
+ \fn void QPieSlice::borderColorChanged()
+ This signal is emitted when slice border color changes.
+ \sa pen, borderColor
+*/
+/*!
+ \qmlsignal PieSlice::onBorderColorChanged()
+ This signal is emitted when slice border color changes.
+ \sa borderColor
+*/
+
+/*!
+ \property QPieSlice::borderWidth
+ Width of the slice border.
+ This is a convenience property for modifying the slice pen.
+ \sa pen, borderColor
+*/
+/*!
+ \qmlproperty int PieSlice::borderWidth
+ Width of the slice border.
+ This is a convenience property for modifying the slice pen.
+ \sa borderColor
+*/
+
+/*!
+ \fn void QPieSlice::borderWidthChanged()
+ This signal is emitted when slice border width changes.
+ \sa pen, borderWidth
+*/
+/*!
+ \qmlsignal PieSlice::onBorderWidthChanged()
+ This signal is emitted when slice border width changes.
+ \sa borderWidth
+*/
+
+/*!
+ \property QPieSlice::brush
+ Brush used to draw the slice.
+*/
+
+/*!
+ \fn void QPieSlice::brushChanged()
+ This signal is emitted when the brush of the slice has changed.
+ \sa brush
+*/
+
+/*!
+ \qmlproperty QString PieSlice::brushFilename
+ The name of the file used as a brush for the slice.
+*/
+
+/*!
+ \property QPieSlice::color
+ Fill (brush) color of the slice.
+ This is a convenience property for modifying the slice brush.
+ \sa brush
+*/
+/*!
+ \qmlproperty color PieSlice::color
+ Fill (brush) color of the slice.
+*/
+
+/*!
+ \fn void QPieSlice::colorChanged()
+ This signal is emitted when slice color changes.
+ \sa brush
+*/
+/*!
+ \qmlsignal PieSlice::onColorChanged()
+ This signal is emitted when slice color changes.
+*/
+
+/*!
+ \property QPieSlice::labelBrush
+ Brush used to draw label and label arm of the slice.
+ \sa label, labelVisible, labelFont, labelArmLengthFactor
+*/
+
+/*!
+ \fn void QPieSlice::labelBrushChanged()
+ This signal is emitted when the label brush of the slice has changed.
+ \sa labelBrush
+*/
+
+/*!
+ \property QPieSlice::labelColor
+ Color used to draw the slice label.
+ This is a convenience property for modifying the slice label brush.
+ \sa labelBrush
+*/
+/*!
+ \qmlproperty color PieSlice::labelColor
+ Color used to draw the slice label.
+*/
+
+/*!
+ \fn void QPieSlice::labelColorChanged()
+ This signal is emitted when slice label color changes.
+ \sa labelColor
+*/
+/*!
+ \qmlsignal PieSlice::onLabelColorChanged()
+ This signal is emitted when slice label color changes.
+ \sa labelColor
+*/
+
+/*!
+ \property QPieSlice::labelFont
+ Font used for drawing label text.
+ \sa label, labelVisible, labelArmLengthFactor
+*/
+
+/*!
+ \fn void QPieSlice::labelFontChanged()
+ This signal is emitted when the label font of the slice has changed.
+ \sa labelFont
+*/
+
+/*!
+ \qmlproperty Font PieSlice::labelFont
+
+ Defines the font used for slice label.
+
+ See the Qt documentation for more details of Font.
+
+ \sa labelVisible, labelPosition
+*/
+
+/*!
+ \property QPieSlice::labelPosition
+ Position of the slice label.
+ \sa label, labelVisible
+*/
+/*!
+ \qmlproperty LabelPosition PieSlice::labelPosition
+ Position of the slice label. One of PieSlice.LabelOutside, PieSlice.LabelInsideHorizontal,
+ PieSlice.LabelInsideTangential or PieSlice.LabelInsideNormal. By default the position is
+ PieSlice.LabelOutside.
+ \sa labelVisible
+*/
+
+/*!
+ \property QPieSlice::labelArmLengthFactor
+ Defines the length of the label arm.
+ The factor is relative to pie radius. For example:
+ 1.0 means the length is the same as the radius.
+ 0.5 means the length is half of the radius.
+ By default the arm length is 0.15
+ \sa label, labelVisible, labelBrush, labelFont
+*/
+/*!
+ \qmlproperty real PieSlice::labelArmLengthFactor
+ Defines the length of the label arm.
+ The factor is relative to pie radius. For example:
+ 1.0 means the length is the same as the radius.
+ 0.5 means the length is half of the radius.
+ By default the arm length is 0.15
+ \sa labelVisible
+*/
+
+/*!
+ \property QPieSlice::explodeDistanceFactor
+ When the slice is exploded this factor defines how far the slice is exploded away from the pie.
+ The factor is relative to pie radius. For example:
+ 1.0 means the distance is the same as the radius.
+ 0.5 means the distance is half of the radius.
+ By default the distance is is 0.15
+ \sa exploded
+*/
+/*!
+ \qmlproperty real PieSlice::explodeDistanceFactor
+ When the slice is exploded this factor defines how far the slice is exploded away from the pie.
+ The factor is relative to pie radius. For example:
+ 1.0 means the distance is the same as the radius.
+ 0.5 means the distance is half of the radius.
+ By default the distance is is 0.15
+ \sa exploded
+*/
+
+/*!
+ \property QPieSlice::percentage
+ Percentage of the slice compared to the sum of all slices in the series.
+ The actual value ranges from 0.0 to 1.0.
+ Updated automatically once the slice is added to the series.
+ \sa value, QPieSeries::sum
+*/
+/*!
+ \qmlproperty real PieSlice::percentage
+ Percentage of the slice compared to the sum of all slices in the series.
+ The actual value ranges from 0.0 to 1.0.
+ Updated automatically once the slice is added to the series.
+*/
+
+/*!
+ \fn void QPieSlice::percentageChanged()
+ This signal is emitted when the percentage of the slice has changed.
+ \sa percentage
+*/
+/*!
+ \qmlsignal void PieSlice::onPercentageChanged()
+ This signal is emitted when the percentage of the slice has changed.
+ \sa percentage
+*/
+
+/*!
+ \property QPieSlice::startAngle
+ Defines the starting angle of this slice in the series it belongs to.
+ Full pie is 360 degrees where 0 degrees is at 12 a'clock.
+ Updated automatically once the slice is added to the series.
+*/
+/*!
+ \qmlproperty real PieSlice::startAngle
+ Defines the starting angle of this slice in the series it belongs to.
+ Full pie is 360 degrees where 0 degrees is at 12 a'clock.
+ Updated automatically once the slice is added to the series.
+*/
+
+/*!
+ \fn void QPieSlice::startAngleChanged()
+ This signal is emitted when the starting angle f the slice has changed.
+ \sa startAngle
+*/
+/*!
+ \qmlsignal PieSlice::onStartAngleChanged()
+ This signal is emitted when the starting angle f the slice has changed.
+ \sa startAngle
+*/
+
+/*!
+ \property QPieSlice::angleSpan
+ Span of the slice in degrees.
+ Full pie is 360 degrees where 0 degrees is at 12 a'clock.
+ Updated automatically once the slice is added to the series.
+*/
+/*!
+ \qmlproperty real PieSlice::angleSpan
+ Span of the slice in degrees.
+ Full pie is 360 degrees where 0 degrees is at 12 a'clock.
+ Updated automatically once the slice is added to the series.
+*/
+
+/*!
+ \fn void QPieSlice::angleSpanChanged()
+ This signal is emitted when the angle span of the slice has changed.
+ \sa angleSpan
+*/
+/*!
+ \qmlsignal PieSlice::onAngleSpanChanged()
+ This signal is emitted when the angle span of the slice has changed.
+ \sa angleSpan
+*/
+
+/*!
+ \fn void QPieSlice::clicked()
+ This signal is emitted when user has clicked the slice.
+ \sa QPieSeries::clicked()
+*/
+/*!
+ \qmlsignal PieSlice::onClicked()
+ This signal is emitted when user has clicked the slice.
+*/
+
+/*!
+ \fn void QPieSlice::hovered(bool state)
+ This signal is emitted when user has hovered over or away from the slice.
+ \a state is true when user has hovered over the slice and false when hover has moved away from the slice.
+ \sa QPieSeries::hovered()
+*/
+/*!
+ \qmlsignal PieSlice::onHovered(bool state)
+ This signal is emitted when user has hovered over or away from the slice.
+ \a state is true when user has hovered over the slice and false when hover has moved away from the slice.
+*/
+
+/*!
+ Constructs an empty slice with a \a parent.
+ \sa QPieSeries::append(), QPieSeries::insert()
+*/
+QPieSlice::QPieSlice(QObject *parent)
+ : QObject(parent),
+ d_ptr(new QPieSlicePrivate(this))
+{
+
+}
+
+/*!
+ Constructs an empty slice with given \a value, \a label and a \a parent.
+ \sa QPieSeries::append(), QPieSeries::insert()
+*/
+QPieSlice::QPieSlice(QString label, qreal value, QObject *parent)
+ : QObject(parent),
+ d_ptr(new QPieSlicePrivate(this))
+{
+ setValue(value);
+ setLabel(label);
+}
+
+/*!
+ Destroys the slice.
+ User should not delete the slice if it has been added to the series.
+*/
+QPieSlice::~QPieSlice()
+{
+
+}
+
+void QPieSlice::setLabel(QString label)
+{
+ if (d_ptr->m_data.m_labelText != label) {
+ d_ptr->m_data.m_labelText = label;
+ emit labelChanged();
+ }
+}
+
+QString QPieSlice::label() const
+{
+ return d_ptr->m_data.m_labelText;
+}
+
+void QPieSlice::setValue(qreal value)
+{
+ value = qAbs(value); // negative values not allowed
+ if (!qFuzzyCompare(d_ptr->m_data.m_value, value)) {
+ d_ptr->m_data.m_value = value;
+ emit valueChanged();
+ }
+}
+
+qreal QPieSlice::value() const
+{
+ return d_ptr->m_data.m_value;
+}
+
+void QPieSlice::setLabelVisible(bool visible)
+{
+ if (d_ptr->m_data.m_isLabelVisible != visible) {
+ d_ptr->m_data.m_isLabelVisible = visible;
+ emit labelVisibleChanged();
+ }
+}
+
+bool QPieSlice::isLabelVisible() const
+{
+ return d_ptr->m_data.m_isLabelVisible;
+}
+
+void QPieSlice::setExploded(bool exploded)
+{
+ if (d_ptr->m_data.m_isExploded != exploded) {
+ d_ptr->m_data.m_isExploded = exploded;
+ emit d_ptr->explodedChanged();
+ }
+}
+
+QPieSlice::LabelPosition QPieSlice::labelPosition()
+{
+ return d_ptr->m_data.m_labelPosition;
+}
+
+void QPieSlice::setLabelPosition(LabelPosition position)
+{
+ if (d_ptr->m_data.m_labelPosition != position) {
+ d_ptr->m_data.m_labelPosition = position;
+ emit d_ptr->labelPositionChanged();
+ }
+}
+
+bool QPieSlice::isExploded() const
+{
+ return d_ptr->m_data.m_isExploded;
+}
+
+void QPieSlice::setPen(const QPen &pen)
+{
+ d_ptr->setPen(pen, false);
+}
+
+QPen QPieSlice::pen() const
+{
+ return d_ptr->m_data.m_slicePen;
+}
+
+QColor QPieSlice::borderColor()
+{
+ return pen().color();
+}
+
+void QPieSlice::setBorderColor(QColor color)
+{
+ QPen p = pen();
+ if (color != p.color()) {
+ p.setColor(color);
+ setPen(p);
+ }
+}
+
+int QPieSlice::borderWidth()
+{
+ return pen().width();
+}
+
+void QPieSlice::setBorderWidth(int width)
+{
+ QPen p = pen();
+ if (width != p.width()) {
+ p.setWidth(width);
+ setPen(p);
+ }
+}
+
+void QPieSlice::setBrush(const QBrush &brush)
+{
+ d_ptr->setBrush(brush, false);
+}
+
+QBrush QPieSlice::brush() const
+{
+ return d_ptr->m_data.m_sliceBrush;
+}
+
+QColor QPieSlice::color()
+{
+ return brush().color();
+}
+
+void QPieSlice::setColor(QColor color)
+{
+ QBrush b = brush();
+
+ if (b == QBrush())
+ b.setStyle(Qt::SolidPattern);
+ b.setColor(color);
+ setBrush(b);
+}
+
+void QPieSlice::setLabelBrush(const QBrush &brush)
+{
+ d_ptr->setLabelBrush(brush, false);
+}
+
+QBrush QPieSlice::labelBrush() const
+{
+ return d_ptr->m_data.m_labelBrush;
+}
+
+QColor QPieSlice::labelColor()
+{
+ return labelBrush().color();
+}
+
+void QPieSlice::setLabelColor(QColor color)
+{
+ QBrush b = labelBrush();
+ if (color != b.color()) {
+ b.setColor(color);
+ setLabelBrush(b);
+ }
+}
+
+void QPieSlice::setLabelFont(const QFont &font)
+{
+ d_ptr->setLabelFont(font, false);
+}
+
+QFont QPieSlice::labelFont() const
+{
+ return d_ptr->m_data.m_labelFont;
+}
+
+void QPieSlice::setLabelArmLengthFactor(qreal factor)
+{
+ if (!qFuzzyCompare(d_ptr->m_data.m_labelArmLengthFactor, factor)) {
+ d_ptr->m_data.m_labelArmLengthFactor = factor;
+ emit d_ptr->labelArmLengthFactorChanged();
+ }
+}
+
+qreal QPieSlice::labelArmLengthFactor() const
+{
+ return d_ptr->m_data.m_labelArmLengthFactor;
+}
+
+void QPieSlice::setExplodeDistanceFactor(qreal factor)
+{
+ if (!qFuzzyCompare(d_ptr->m_data.m_explodeDistanceFactor, factor)) {
+ d_ptr->m_data.m_explodeDistanceFactor = factor;
+ emit d_ptr->explodeDistanceFactorChanged();
+ }
+}
+
+qreal QPieSlice::explodeDistanceFactor() const
+{
+ return d_ptr->m_data.m_explodeDistanceFactor;
+}
+
+qreal QPieSlice::percentage() const
+{
+ return d_ptr->m_data.m_percentage;
+}
+
+qreal QPieSlice::startAngle() const
+{
+ return d_ptr->m_data.m_startAngle;
+}
+
+qreal QPieSlice::angleSpan() const
+{
+ return d_ptr->m_data.m_angleSpan;
+}
+
+/*!
+ Returns the series that this slice belongs to.
+
+ \sa QPieSeries::append()
+*/
+QPieSeries *QPieSlice::series() const
+{
+ return d_ptr->m_series;
+}
+
+QPieSlicePrivate::QPieSlicePrivate(QPieSlice *parent)
+ : QObject(parent),
+ q_ptr(parent),
+ m_series(0)
+{
+
+}
+
+QPieSlicePrivate::~QPieSlicePrivate()
+{
+
+}
+
+QPieSlicePrivate *QPieSlicePrivate::fromSlice(QPieSlice *slice)
+{
+ return slice->d_func();
+}
+
+void QPieSlicePrivate::setPen(const QPen &pen, bool themed)
+{
+ if (m_data.m_slicePen != pen) {
+
+ QPen oldPen = m_data.m_slicePen;
+
+ m_data.m_slicePen = pen;
+ m_data.m_slicePen.setThemed(themed);
+
+ emit q_ptr->penChanged();
+ if (oldPen.color() != pen.color())
+ emit q_ptr->borderColorChanged();
+ if (oldPen.width() != pen.width())
+ emit q_ptr->borderWidthChanged();
+ }
+}
+
+void QPieSlicePrivate::setBrush(const QBrush &brush, bool themed)
+{
+ if (m_data.m_sliceBrush != brush) {
+
+ QBrush oldBrush = m_data.m_sliceBrush;
+
+ m_data.m_sliceBrush = brush;
+ m_data.m_sliceBrush.setThemed(themed);
+
+ emit q_ptr->brushChanged();
+ if (oldBrush.color() != brush.color())
+ emit q_ptr->colorChanged();
+ }
+}
+
+void QPieSlicePrivate::setLabelBrush(const QBrush &brush, bool themed)
+{
+ if (m_data.m_labelBrush != brush) {
+
+ QBrush oldBrush = m_data.m_labelBrush;
+
+ m_data.m_labelBrush = brush;
+ m_data.m_labelBrush.setThemed(themed);
+
+ emit q_ptr->labelBrushChanged();
+ if (oldBrush.color() != brush.color())
+ emit q_ptr->labelColorChanged();
+ }
+}
+
+void QPieSlicePrivate::setLabelFont(const QFont &font, bool themed)
+{
+ if (m_data.m_labelFont != font) {
+ m_data.m_labelFont = font;
+ m_data.m_labelFont.setThemed(themed);
+ emit q_ptr->labelFontChanged();
+ }
+}
+
+void QPieSlicePrivate::setPercentage(qreal percentage)
+{
+ if (!qFuzzyCompare(m_data.m_percentage, percentage)) {
+ m_data.m_percentage = percentage;
+ emit q_ptr->percentageChanged();
+ }
+}
+
+void QPieSlicePrivate::setStartAngle(qreal angle)
+{
+ if (!qFuzzyCompare(m_data.m_startAngle, angle)) {
+ m_data.m_startAngle = angle;
+ emit q_ptr->startAngleChanged();
+ }
+}
+
+void QPieSlicePrivate::setAngleSpan(qreal span)
+{
+ if (!qFuzzyCompare(m_data.m_angleSpan, span)) {
+ m_data.m_angleSpan = span;
+ emit q_ptr->angleSpanChanged();
+ }
+}
+
+QT_CHARTS_END_NAMESPACE
+
+QT_CHARTS_USE_NAMESPACE
+#include "moc_qpieslice.cpp"
+#include "moc_qpieslice_p.cpp"