diff options
Diffstat (limited to 'src/charts/piechart/qpieslice.cpp')
-rw-r--r-- | src/charts/piechart/qpieslice.cpp | 794 |
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" |