From 886026b75e2248570854077d5aabf97d8d4140b5 2012-08-24 13:06:22 From: Marek Rosa Date: 2012-08-24 13:06:22 Subject: [PATCH] Donut support simplified. Examples updated --- diff --git a/demos/piechartcustomization/mainwidget.cpp b/demos/piechartcustomization/mainwidget.cpp index 89d8bee..ad8375d 100644 --- a/demos/piechartcustomization/mainwidget.cpp +++ b/demos/piechartcustomization/mainwidget.cpp @@ -36,7 +36,7 @@ QTCOMMERCIALCHART_USE_NAMESPACE MainWidget::MainWidget(QWidget* parent) :QWidget(parent), - m_slice(0) + m_slice(0) { // create chart QChart *chart = new QChart; @@ -115,13 +115,11 @@ MainWidget::MainWidget(QWidget* parent) m_endAngle->setValue(m_series->pieEndAngle()); m_endAngle->setSingleStep(1); - m_isDonut = new QCheckBox(); - - m_donutInnerSize = new QDoubleSpinBox(); - m_donutInnerSize->setMinimum(0.0); - m_donutInnerSize->setMaximum(1.0); - m_donutInnerSize->setSingleStep(0.1); - m_donutInnerSize->setValue(m_series->donutInnerSize()); + m_holeSize = new QDoubleSpinBox(); + m_holeSize->setMinimum(0.0); + m_holeSize->setMaximum(1.0); + m_holeSize->setSingleStep(0.1); + m_holeSize->setValue(m_series->holeSize()); QPushButton *appendSlice = new QPushButton("Append slice"); QPushButton *insertSlice = new QPushButton("Insert slice"); @@ -133,8 +131,7 @@ MainWidget::MainWidget(QWidget* parent) seriesSettingsLayout->addRow("Size factor", m_sizeFactor); seriesSettingsLayout->addRow("Start angle", m_startAngle); seriesSettingsLayout->addRow("End angle", m_endAngle); - seriesSettingsLayout->addRow("Is donut", m_isDonut); - seriesSettingsLayout->addRow("Donut inner size", m_donutInnerSize); + seriesSettingsLayout->addRow("Hole size", m_holeSize); seriesSettingsLayout->addRow(appendSlice); seriesSettingsLayout->addRow(insertSlice); seriesSettingsLayout->addRow(removeSlice); @@ -146,8 +143,7 @@ MainWidget::MainWidget(QWidget* parent) connect(m_sizeFactor, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); connect(m_startAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); connect(m_endAngle, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); - connect(m_isDonut, SIGNAL(toggled(bool)), this, SLOT(updateSerieSettings())); - connect(m_donutInnerSize, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); + connect(m_holeSize, SIGNAL(valueChanged(double)), this, SLOT(updateSerieSettings())); connect(appendSlice, SIGNAL(clicked()), this, SLOT(appendSlice())); connect(insertSlice, SIGNAL(clicked()), this, SLOT(insertSlice())); connect(removeSlice, SIGNAL(clicked()), this, SLOT(removeSlice())); @@ -249,10 +245,10 @@ void MainWidget::updateSerieSettings() m_series->setHorizontalPosition(m_hPosition->value()); m_series->setVerticalPosition(m_vPosition->value()); m_series->setPieSize(m_sizeFactor->value()); + m_holeSize->setMaximum(m_sizeFactor->value()); m_series->setPieStartAngle(m_startAngle->value()); m_series->setPieEndAngle(m_endAngle->value()); - m_series->setDonut(m_isDonut->isChecked()); - m_series->setDonutInnerSize(m_donutInnerSize->value()); + m_series->setHoleSize(m_holeSize->value()); } void MainWidget::updateSliceSettings() diff --git a/demos/piechartcustomization/mainwidget.h b/demos/piechartcustomization/mainwidget.h index 4f82b0c..6ac4995 100644 --- a/demos/piechartcustomization/mainwidget.h +++ b/demos/piechartcustomization/mainwidget.h @@ -72,8 +72,7 @@ private: QDoubleSpinBox* m_sizeFactor; QDoubleSpinBox* m_startAngle; QDoubleSpinBox* m_endAngle; - QCheckBox* m_isDonut; - QDoubleSpinBox* m_donutInnerSize; + QDoubleSpinBox* m_holeSize; QLineEdit* m_sliceName; QDoubleSpinBox* m_sliceValue; diff --git a/examples/donut/widget.cpp b/examples/donut/widget.cpp index f030219..c7a720e 100644 --- a/examples/donut/widget.cpp +++ b/examples/donut/widget.cpp @@ -1,5 +1,7 @@ #include "widget.h" #include +#include +#include #include #include #include @@ -17,19 +19,20 @@ Widget::Widget(QWidget *parent) //! [1] QChartView *chartView = new QChartView; chartView->setRenderHint(QPainter::Antialiasing); - chartView->chart()->setAnimationOptions(QChart::AllAnimations); + QChart *chart = chartView->chart(); + chart->setAnimationOptions(QChart::AllAnimations); + chart->legend()->setVisible(false); //! [1] //! [2] qreal minSize = 0.1; qreal maxSize = 0.9; - int donutsCount = 5; + int donutCount = 5; //! [2] //! [3] - for (int i = 0; i < donutsCount; i++) { + for (int i = 0; i < donutCount; i++) { QPieSeries *donut = new QPieSeries; - donut->setDonut(); int sliceCount = 3 + qrand() % 3; for (int j = 0; j < sliceCount; j++) { qreal value = 100 + qrand() % 100; @@ -39,8 +42,8 @@ Widget::Widget(QWidget *parent) slice->setLabelPosition(QPieSlice::LabelInsideTangential); connect(slice, SIGNAL(hovered(bool)), this, SLOT(explodeSlice(bool))); donut->append(slice); - donut->setDonutInnerSize(minSize + i * (maxSize - minSize) / donutsCount); - donut->setPieSize(minSize + (i + 1) * (maxSize - minSize) / donutsCount); + donut->setHoleSize(minSize + i * (maxSize - minSize) / donutCount); + donut->setPieSize(minSize + (i + 1) * (maxSize - minSize) / donutCount); } m_donuts.append(donut); chartView->chart()->addSeries(donut); diff --git a/examples/donutbreakdown/widget.cpp b/examples/donutbreakdown/widget.cpp index 33ba411..d433bec 100644 --- a/examples/donutbreakdown/widget.cpp +++ b/examples/donutbreakdown/widget.cpp @@ -1,9 +1,10 @@ #include "widget.h" #include - #include #include #include +#include +#include #include QTCOMMERCIALCHART_USE_NAMESPACE @@ -18,7 +19,9 @@ Widget::Widget(QWidget *parent) //! [1] QChartView *chartView = new QChartView; chartView->setRenderHint(QPainter::Antialiasing); - chartView->chart()->setAnimationOptions(QChart::AllAnimations); + QChart *chart = chartView->chart(); + chart->setAnimationOptions(QChart::AllAnimations); + chart->legend()->setVisible(false); //! [1] //! [2] @@ -35,8 +38,7 @@ Widget::Widget(QWidget *parent) // create a new detailed data for the slice QPieSeries *donut = new QPieSeries; - donut->setDonut(); - donut->setDonutInnerSize(mainData->pieSize()); + donut->setHoleSize(mainData->pieSize()); donut->setPieSize(mainData->pieSize() + 0.15); // when mainData slice is redrawn make sure the detailed data slices are aligned with it diff --git a/src/animations/pieanimation.cpp b/src/animations/pieanimation.cpp index 0cc5bfe..515c33e 100644 --- a/src/animations/pieanimation.cpp +++ b/src/animations/pieanimation.cpp @@ -61,8 +61,8 @@ ChartAnimation* PieAnimation::addSlice(PieSliceItem *sliceItem, const PieSliceDa startValue.m_startAngle = sliceData.m_startAngle + (sliceData.m_angleSpan / 2); startValue.m_angleSpan = 0; - if (sliceData.m_donut) - startValue.m_radius = sliceData.m_innerRadius; + if (sliceData.m_holeRadius > 0) + startValue.m_radius = sliceData.m_holeRadius; animation->setValue(startValue, sliceData); animation->setDuration(ChartAnimationDuration); @@ -78,8 +78,8 @@ ChartAnimation* PieAnimation::removeSlice(PieSliceItem *sliceItem) animation->stop(); PieSliceData endValue = animation->currentSliceValue(); - if (endValue.m_donut) - endValue.m_radius = endValue.m_innerRadius; + if (endValue.m_holeRadius > 0) + endValue.m_radius = endValue.m_holeRadius; else endValue.m_radius = 0; endValue.m_startAngle = endValue.m_startAngle + endValue.m_angleSpan; diff --git a/src/animations/piesliceanimation.cpp b/src/animations/piesliceanimation.cpp index 9cf0bb9..415df2f 100644 --- a/src/animations/piesliceanimation.cpp +++ b/src/animations/piesliceanimation.cpp @@ -110,7 +110,7 @@ QVariant PieSliceAnimation::interpolated(const QVariant &start, const QVariant & result.m_angleSpan = linearPos(startValue.m_angleSpan, endValue.m_angleSpan, progress); result.m_slicePen = linearPos(startValue.m_slicePen, endValue.m_slicePen, progress); result.m_sliceBrush = linearPos(startValue.m_sliceBrush, endValue.m_sliceBrush, progress); - result.m_innerRadius = linearPos(startValue.m_innerRadius, endValue.m_innerRadius, progress); + result.m_holeRadius = linearPos(startValue.m_holeRadius, endValue.m_holeRadius, progress); return qVariantFromValue(result); } diff --git a/src/piechart/piechartitem.cpp b/src/piechart/piechartitem.cpp index 19cb81b..0d70d4c 100644 --- a/src/piechart/piechartitem.cpp +++ b/src/piechart/piechartitem.cpp @@ -122,10 +122,10 @@ void PieChartItem::updateLayout() if (m_rect.width() < m_rect.height()) m_pieRadius = m_rect.width() / 2; - m_donutInnerRadius = m_pieRadius; + m_holeSize = m_pieRadius; // apply size factor m_pieRadius *= m_series->pieSize(); - m_donutInnerRadius *= m_series->donutInnerSize(); + m_holeSize *= m_series->holeSize(); // set layouts for existing slice items foreach (QPieSlice* slice, m_series->slices()) { @@ -233,8 +233,7 @@ PieSliceData PieChartItem::updateSliceGeometry(QPieSlice *slice) PieSliceData &sliceData = QPieSlicePrivate::fromSlice(slice)->m_data; sliceData.m_center = PieSliceItem::sliceCenter(m_pieCenter, m_pieRadius, slice); sliceData.m_radius = m_pieRadius; - sliceData.m_donut = m_series->donut(); - sliceData.m_innerRadius = m_donutInnerRadius; + sliceData.m_holeRadius = m_holeSize; return sliceData; } diff --git a/src/piechart/piechartitem_p.h b/src/piechart/piechartitem_p.h index 7ec19cf..89b9f6d 100644 --- a/src/piechart/piechartitem_p.h +++ b/src/piechart/piechartitem_p.h @@ -78,7 +78,7 @@ private: QRectF m_rect; QPointF m_pieCenter; qreal m_pieRadius; - qreal m_donutInnerRadius; + qreal m_holeSize; PieAnimation* m_animation; }; diff --git a/src/piechart/pieslicedata_p.h b/src/piechart/pieslicedata_p.h index 45ecefa..41929de 100644 --- a/src/piechart/pieslicedata_p.h +++ b/src/piechart/pieslicedata_p.h @@ -83,8 +83,7 @@ public: m_startAngle = 0; m_angleSpan = 0; - m_donut = false; - m_innerRadius = 0; + m_holeRadius = 0; } bool operator!=(const PieSliceData &other) const @@ -139,8 +138,7 @@ public: qreal m_startAngle; qreal m_angleSpan; - bool m_donut; - qreal m_innerRadius; + qreal m_holeRadius; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/piechart/piesliceitem.cpp b/src/piechart/piesliceitem.cpp index 304f5e6..0fc31a5 100644 --- a/src/piechart/piesliceitem.cpp +++ b/src/piechart/piesliceitem.cpp @@ -172,8 +172,8 @@ void PieSliceItem::updateGeometry() case QPieSlice::LabelInsideTangential: case QPieSlice::LabelInsideNormal:{ QPointF textCenter; - if (m_data.m_donut) - textCenter = m_data.m_center + offset(centerAngle, m_data.m_innerRadius + (m_data.m_radius - m_data.m_innerRadius) / 2); + if (m_data.m_holeRadius > 0) + textCenter = m_data.m_center + offset(centerAngle, m_data.m_holeRadius + (m_data.m_radius - m_data.m_holeRadius) / 2); else textCenter = m_data.m_center + offset(centerAngle, m_data.m_radius / 2); m_labelTextRect.moveCenter(textCenter); @@ -208,8 +208,8 @@ QPainterPath PieSliceItem::slicePath(QPointF center, qreal radius, qreal startAn // slice path QPainterPath path; - if (m_data.m_donut) { - QRectF insideRect(center.x() - m_data.m_innerRadius, center.y()-m_data.m_innerRadius, m_data.m_innerRadius*2, m_data.m_innerRadius*2); + if (m_data.m_holeRadius > 0) { + QRectF insideRect(center.x() - m_data.m_holeRadius, center.y()-m_data.m_holeRadius, m_data.m_holeRadius*2, m_data.m_holeRadius*2); path.arcMoveTo(rect, -startAngle + 90); path.arcTo(rect, -startAngle + 90, -angleSpan); path.arcTo(insideRect, -startAngle + 90 - angleSpan, angleSpan); diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index d7f60bb..e3bc024 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -132,7 +132,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE \o 1.0 is the maximum size that can fit the chart. \endlist - When setting this property the donutInnerSize property is adjusted if necessary, to ensure that the inner size is not greater than the outer size. + When setting this property the holeSize property is adjusted if necessary, to ensure that the hole size is not greater than the outer size. Default value is 0.7. */ @@ -153,35 +153,35 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE */ /*! - \property QPieSeries::donutInnerSize - \brief Defines the donut inner size. + \property QPieSeries::holeSize + \brief Defines the donut hole size. The value is a relative value to the chart rectangle where: \list - \o 0.0 is the minimum size (pie not drawn). + \o 0.0 is the minimum size (full pie drawn, without any hole inside). \o 1.0 is the maximum size that can fit the chart. (donut has no width) \endlist The value is never greater then size property. - Default value is 0.5. + Default value is 0.0. */ /*! - \qmlproperty real PieSeries::donutInnerSize + \qmlproperty real PieSeries::holeSize - Defines the donut inner size. + Defines the donut hole size. The value is a relative value to the chart rectangle where: \list - \o 0.0 is the minimum size (donut is a pie). + \o 0.0 is the minimum size (full pie drawn, without any hole inside). \o 1.0 is the maximum size that can fit the chart. (donut has no width) \endlist When setting this property the size property is adjusted if necessary, to ensure that the inner size is not greater than the outer size. - Default value is 0.5. + Default value is 0.0. */ /*! @@ -235,18 +235,6 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE */ /*! - \property QPieSeries::donut - - Defines whether the series should be drawn as a donut -*/ - -/*! - \qmlproperty int PieSeries::donut - - Defines whether the series should be drawn as a donut -*/ - -/*! \fn void QPieSeries::countChanged() Emitted when the slice count has changed. \sa count @@ -594,30 +582,17 @@ qreal QPieSeries::sum() const return d->m_sum; } -void QPieSeries::setDonut(bool donut) -{ - Q_D(QPieSeries); - d->m_donutChart = donut; - d->updateDerivativeData(); -} - -bool QPieSeries::donut() const -{ - Q_D(const QPieSeries); - return d->m_donutChart; -} - -void QPieSeries::setDonutInnerSize(qreal innerSize) +void QPieSeries::setHoleSize(qreal holeSize) { Q_D(QPieSeries); - innerSize = qBound((qreal)0.0, innerSize, (qreal)1.0); - d->setSizes(innerSize, qMax(d->m_pieRelativeSize, innerSize)); + holeSize = qBound((qreal)0.0, holeSize, (qreal)1.0); + d->setSizes(holeSize, qMax(d->m_pieRelativeSize, holeSize)); } -qreal QPieSeries::donutInnerSize() const +qreal QPieSeries::holeSize() const { Q_D(const QPieSeries); - return d->m_donutRelativeInnerSize; + return d->m_holeRelativeSize; } void QPieSeries::setHorizontalPosition(qreal relativePosition) @@ -666,7 +641,7 @@ void QPieSeries::setPieSize(qreal relativeSize) { Q_D(QPieSeries); relativeSize = qBound((qreal)0.0, relativeSize, (qreal)1.0); - d->setSizes(qMin(d->m_donutRelativeInnerSize, relativeSize), relativeSize); + d->setSizes(qMin(d->m_holeRelativeSize, relativeSize), relativeSize); } @@ -766,8 +741,8 @@ QPieSeriesPrivate::QPieSeriesPrivate(QPieSeries *parent) : m_pieStartAngle(0), m_pieEndAngle(360), m_sum(0), - m_donutChart(false), - m_donutRelativeInnerSize(0.5) +// m_donutChart(false), + m_holeRelativeSize(0.0) { } @@ -811,8 +786,8 @@ void QPieSeriesPrivate::setSizes(qreal innerSize, qreal outerSize) { bool changed = false; - if (!qFuzzyIsNull(m_donutRelativeInnerSize - innerSize)) { - m_donutRelativeInnerSize = innerSize; + if (!qFuzzyIsNull(m_holeRelativeSize - innerSize)) { + m_holeRelativeSize = innerSize; changed = true; } diff --git a/src/piechart/qpieseries.h b/src/piechart/qpieseries.h index b3806ec..f053fa3 100644 --- a/src/piechart/qpieseries.h +++ b/src/piechart/qpieseries.h @@ -38,8 +38,8 @@ class QTCOMMERCIALCHART_EXPORT QPieSeries : public QAbstractSeries Q_PROPERTY(qreal endAngle READ pieEndAngle WRITE setPieEndAngle) Q_PROPERTY(int count READ count NOTIFY countChanged) Q_PROPERTY(qreal sum READ sum NOTIFY sumChanged) - Q_PROPERTY(qreal donutInnerSize READ donutInnerSize WRITE setDonutInnerSize) - Q_PROPERTY(bool donut READ donut WRITE setDonut) + Q_PROPERTY(qreal holeSize READ holeSize WRITE setHoleSize) +// Q_PROPERTY(bool donut READ donut WRITE setDonut) public: explicit QPieSeries(QObject *parent = 0); @@ -65,11 +65,8 @@ public: qreal sum() const; - void setDonut(bool donut = true); - bool donut() const; - - void setDonutInnerSize(qreal innerSize); - qreal donutInnerSize() const; + void setHoleSize(qreal holeSize); + qreal holeSize() const; void setHorizontalPosition(qreal relativePosition); qreal horizontalPosition() const; diff --git a/src/piechart/qpieseries_p.h b/src/piechart/qpieseries_p.h index eb2316a..163d335 100644 --- a/src/piechart/qpieseries_p.h +++ b/src/piechart/qpieseries_p.h @@ -76,8 +76,7 @@ private: qreal m_pieStartAngle; qreal m_pieEndAngle; qreal m_sum; - bool m_donutChart; - qreal m_donutRelativeInnerSize; + qreal m_holeRelativeSize; private: friend class QLegendPrivate; diff --git a/tests/auto/qpieseries/tst_qpieseries.cpp b/tests/auto/qpieseries/tst_qpieseries.cpp index e90328a..03d23b1 100644 --- a/tests/auto/qpieseries/tst_qpieseries.cpp +++ b/tests/auto/qpieseries/tst_qpieseries.cpp @@ -129,21 +129,19 @@ void tst_qpieseries::properties() m_series->setPieSize(0.7); QCOMPARE(m_series->pieSize(), 0.7); - m_series->setDonut(); - QVERIFY(m_series->donut()); - m_series->setDonutInnerSize(-1.0); - QCOMPARE(m_series->donutInnerSize(), 0.0); - m_series->setDonutInnerSize(0.5); - QCOMPARE(m_series->donutInnerSize(), 0.5); + m_series->setHoleSize(-1.0); + QCOMPARE(m_series->holeSize(), 0.0); + m_series->setHoleSize(0.5); + QCOMPARE(m_series->holeSize(), 0.5); - m_series->setDonutInnerSize(0.8); - QCOMPARE(m_series->donutInnerSize(), 0.8); + m_series->setHoleSize(0.8); + QCOMPARE(m_series->holeSize(), 0.8); QCOMPARE(m_series->pieSize(), 0.8); m_series->setPieSize(0.4); QCOMPARE(m_series->pieSize(), 0.4); - QCOMPARE(m_series->donutInnerSize(), 0.4); + QCOMPARE(m_series->holeSize(), 0.4); m_series->setPieStartAngle(0); m_series->setPieStartAngle(-180);