diff --git a/demos/chartthemes/themewidget.cpp b/demos/chartthemes/themewidget.cpp index 90ef4cb..6f38953 100644 --- a/demos/chartthemes/themewidget.cpp +++ b/demos/chartthemes/themewidget.cpp @@ -265,7 +265,8 @@ QChart* ThemeWidget::createPieChart() const } qreal hPos = (pieSize / 2) + (i / (qreal) m_dataTable.count()); series->setPieSize(pieSize); - series->setPiePosition(hPos, 0.5); + series->setHorizontalPosition(hPos); + series->setVerticalPosition(0.5); chart->addSeries(series); } diff --git a/demos/piechartcustomization/mainwidget.cpp b/demos/piechartcustomization/mainwidget.cpp index 6994c6d..7b80dc0 100644 --- a/demos/piechartcustomization/mainwidget.cpp +++ b/demos/piechartcustomization/mainwidget.cpp @@ -85,13 +85,13 @@ MainWidget::MainWidget(QWidget* parent) m_hPosition->setMinimum(0.0); m_hPosition->setMaximum(1.0); m_hPosition->setSingleStep(0.1); - m_hPosition->setValue(m_series->pieHorizontalPosition()); + m_hPosition->setValue(m_series->horizontalPosition()); m_vPosition = new QDoubleSpinBox(); m_vPosition->setMinimum(0.0); m_vPosition->setMaximum(1.0); m_vPosition->setSingleStep(0.1); - m_vPosition->setValue(m_series->pieVerticalPosition()); + m_vPosition->setValue(m_series->verticalPosition()); m_sizeFactor = new QDoubleSpinBox(); m_sizeFactor->setMinimum(0.0); @@ -215,7 +215,8 @@ void MainWidget::updateChartSettings() void MainWidget::updateSerieSettings() { - m_series->setPiePosition(m_hPosition->value(), m_vPosition->value()); + m_series->setHorizontalPosition(m_hPosition->value()); + m_series->setVerticalPosition(m_vPosition->value()); m_series->setPieSize(m_sizeFactor->value()); m_series->setPieStartAngle(m_startAngle->value()); m_series->setPieEndAngle(m_endAngle->value()); diff --git a/qmlplugin/declarativepieseries.cpp b/qmlplugin/declarativepieseries.cpp index 0ba247a..493b56e 100644 --- a/qmlplugin/declarativepieseries.cpp +++ b/qmlplugin/declarativepieseries.cpp @@ -40,7 +40,6 @@ void DeclarativePieSeries::componentComplete() if (declarativeChart) { QChart *chart = qobject_cast(declarativeChart->m_chart); Q_ASSERT(chart); - qDebug() << "parent for pie:" << chart; chart->addSeries(this); } } diff --git a/src/piechart/piechartitem.cpp b/src/piechart/piechartitem.cpp index 2f27b99..c8bbfff 100644 --- a/src/piechart/piechartitem.cpp +++ b/src/piechart/piechartitem.cpp @@ -133,8 +133,8 @@ void PieChartItem::handleGeometryChanged(const QRectF& rect) void PieChartItem::calculatePieLayout() { // find pie center coordinates - m_pieCenter.setX(m_rect.left() + (m_rect.width() * m_series->pieHorizontalPosition())); - m_pieCenter.setY(m_rect.top() + (m_rect.height() * m_series->pieVerticalPosition())); + m_pieCenter.setX(m_rect.left() + (m_rect.width() * m_series->horizontalPosition())); + m_pieCenter.setY(m_rect.top() + (m_rect.height() * m_series->verticalPosition())); // find maximum radius for pie m_pieRadius = m_rect.height() / 2; diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index 96f014e..6fa244a 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -184,6 +184,32 @@ void QPieSeriesPrivate::modelDataRemoved(QModelIndex parent, int start, int end) q->remove(m_slices.at(start)); } +bool QPieSeriesPrivate::setRealValue(qreal &value, qreal newValue, qreal max, qreal min) +{ + // Remove rounding errors + qreal roundedValue = newValue; + if (qFuzzyIsNull(min) && qFuzzyIsNull(newValue)) + roundedValue = 0.0; + else if (qFuzzyCompare(newValue, max)) + roundedValue = max; + else if (qFuzzyCompare(newValue, min)) + roundedValue = min; + + // Check if the position is valid after removing the rounding errors + if (roundedValue < min || roundedValue > max) { + qWarning("QPieSeries: Illegal value"); + return false; + } + + if (!qFuzzyIsNull(value - roundedValue)) { + value = roundedValue; + return true; + } + + // The change was so small it is considered a rounding error + return false; +} + /*! @@ -380,32 +406,31 @@ QList QPieSeries::slices() const } /*! - Sets the center position of the pie by \a relativeHorizontalPosition and \a relativeVerticalPosition. - - The factors are relative to the chart rectangle where: + Sets the horizontal center position of the pie to \relativePosition. If \relativePosition is + set to 0.0 the pie is drawn on the left side of the chart and if it's set to 1.0 the pie is + drawn on right side of the chart. The default value 0.5 puts the pie in the middle. - \a relativeHorizontalPosition 0.0 means the absolute left. - \a relativeHorizontalPosition 1.0 means the absolute right. - \a relativeVerticalPosition 0.0 means the absolute top. - \a relativeVerticalPosition 1.0 means the absolute bottom. + \sa setHorizontalPosition(), setPieSize() +*/ +void QPieSeries::setHorizontalPosition(qreal relativePosition) +{ + Q_D(QPieSeries); + if (d->setRealValue(d->m_pieRelativeHorPos, relativePosition, 1.0)) + emit piePositionChanged(); +} - By default both values are 0.5 which puts the pie in the middle of the chart rectangle. +/*! + Sets the vertical center position of the pie to \relativePosition. If \relativePosition is + set to 0.0 the pie is drawn on the top of the chart and if it's set to 1.0 the pie is drawn + on bottom of the chart. The default value 0.5 puts the pie in the middle. - \sa pieHorizontalPosition(), pieVerticalPosition(), setPieSize() + \sa setVerticalPosition(), setPieSize() */ -void QPieSeries::setPiePosition(qreal relativeHorizontalPosition, qreal relativeVerticalPosition) +void QPieSeries::setVerticalPosition(qreal relativePosition) { Q_D(QPieSeries); - if (relativeHorizontalPosition < 0.0 || relativeHorizontalPosition > 1.0 || - relativeVerticalPosition < 0.0 || relativeVerticalPosition > 1.0) - return; - - if (!qFuzzyIsNull(d->m_pieRelativeHorPos - relativeHorizontalPosition) || - !qFuzzyIsNull(d->m_pieRelativeVerPos - relativeVerticalPosition)) { - d->m_pieRelativeHorPos = relativeHorizontalPosition; - d->m_pieRelativeVerPos = relativeVerticalPosition; + if (d->setRealValue(d->m_pieRelativeVerPos, relativePosition, 1.0)) emit piePositionChanged(); - } } /*! @@ -418,9 +443,9 @@ void QPieSeries::setPiePosition(qreal relativeHorizontalPosition, qreal relative By default it is 0.5 which puts the pie in the horizontal middle of the chart rectangle. - \sa setPiePosition(), pieVerticalPosition(), setPieSize() + \sa verticalPosition(), setPieSize() */ -qreal QPieSeries::pieHorizontalPosition() const +qreal QPieSeries::horizontalPosition() const { Q_D(const QPieSeries); return d->m_pieRelativeHorPos; @@ -436,9 +461,9 @@ qreal QPieSeries::pieHorizontalPosition() const By default it is 0.5 which puts the pie in the vertical middle of the chart rectangle. - \sa setPiePosition(), pieHorizontalPosition(), setPieSize() + \sa horizontalPosition(), setPieSize() */ -qreal QPieSeries::pieVerticalPosition() const +qreal QPieSeries::verticalPosition() const { Q_D(const QPieSeries); return d->m_pieRelativeVerPos; @@ -456,13 +481,8 @@ qreal QPieSeries::pieVerticalPosition() const void QPieSeries::setPieSize(qreal relativeSize) { Q_D(QPieSeries); - if (relativeSize < 0.0 || relativeSize > 1.0) - return; - - if (!qFuzzyIsNull(d->m_pieRelativeSize- relativeSize)) { - d->m_pieRelativeSize = relativeSize; + if (d->setRealValue(d->m_pieRelativeSize, relativeSize, 1.0)) emit pieSizeChanged(); - } } /*! @@ -493,14 +513,8 @@ qreal QPieSeries::pieSize() const void QPieSeries::setPieStartAngle(qreal angle) { Q_D(QPieSeries); - - if (angle < 0 || angle > 360 || angle > d->m_pieEndAngle) - return; - - if (!qFuzzyIsNull(angle - d->m_pieStartAngle)) { - d->m_pieStartAngle = angle; + if (d->setRealValue(d->m_pieStartAngle, angle, d->m_pieEndAngle)) d->updateDerivativeData(); - } } /*! @@ -529,13 +543,8 @@ void QPieSeries::setPieEndAngle(qreal angle) { Q_D(QPieSeries); - if (angle < 0 || angle > 360 || angle < d->m_pieStartAngle) - return; - - if (!qFuzzyIsNull(angle - d->m_pieEndAngle)) { - d->m_pieEndAngle = angle; + if (d->setRealValue(d->m_pieEndAngle, angle, 360.0, d->m_pieStartAngle)) d->updateDerivativeData(); - } } /*! diff --git a/src/piechart/qpieseries.h b/src/piechart/qpieseries.h index d26d224..cb5b058 100644 --- a/src/piechart/qpieseries.h +++ b/src/piechart/qpieseries.h @@ -30,6 +30,11 @@ class QPieSlice; class QTCOMMERCIALCHART_EXPORT QPieSeries : public QSeries { Q_OBJECT + Q_PROPERTY(qreal horizontalPosition READ horizontalPosition WRITE setHorizontalPosition) + Q_PROPERTY(qreal verticalPosition READ verticalPosition WRITE setVerticalPosition) + Q_PROPERTY(qreal size READ pieSize WRITE setPieSize) + Q_PROPERTY(qreal startAngle READ pieStartAngle WRITE setPieStartAngle) + Q_PROPERTY(qreal endAngle READ pieEndAngle WRITE setPieEndAngle) public: QPieSeries(QObject *parent = 0); @@ -57,9 +62,10 @@ public: qreal total() const; // pie customization - void setPiePosition(qreal relativeHorizontalPosition, qreal relativeVerticalPosition); - qreal pieHorizontalPosition() const; - qreal pieVerticalPosition() const; + void setHorizontalPosition(qreal relativePosition); + qreal horizontalPosition() const; + void setVerticalPosition(qreal relativePosition); + qreal verticalPosition() const; void setPieSize(qreal relativeSize); qreal pieSize() const; void setPieStartAngle(qreal startAngle); diff --git a/src/piechart/qpieseriesprivate_p.h b/src/piechart/qpieseriesprivate_p.h index 67180b1..422d4fa 100644 --- a/src/piechart/qpieseriesprivate_p.h +++ b/src/piechart/qpieseriesprivate_p.h @@ -46,6 +46,7 @@ public Q_SLOTS: void modelUpdated(QModelIndex topLeft, QModelIndex bottomRight); void modelDataAdded(QModelIndex parent, int start, int end); void modelDataRemoved(QModelIndex parent, int start, int end); + bool setRealValue(qreal &value, qreal newValue, qreal max, qreal min = 0.0); public: QPieSeries * const q_ptr; diff --git a/src/qseries.cpp b/src/qseries.cpp index 2d37690..4ae6792 100644 --- a/src/qseries.cpp +++ b/src/qseries.cpp @@ -82,6 +82,5 @@ \brief Returns the name of the series. */ -QTCOMMERCIALCHART_BEGIN_NAMESPACE +QTCOMMERCIALCHART_USE_NAMESPACE #include "moc_qseries.cpp" -QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/qseries.h b/src/qseries.h index b968e34..b45902b 100644 --- a/src/qseries.h +++ b/src/qseries.h @@ -33,6 +33,8 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class QTCOMMERCIALCHART_EXPORT QSeries : public QObject { Q_OBJECT + Q_PROPERTY(QString name READ name WRITE setName) + public: enum QSeriesType { SeriesTypeLine, diff --git a/test/qmlchart/qml/qmlchart/main.qml b/test/qmlchart/qml/qmlchart/main.qml index c475fa2..0c89c37 100644 --- a/test/qmlchart/qml/qmlchart/main.qml +++ b/test/qmlchart/qml/qmlchart/main.qml @@ -58,16 +58,20 @@ Rectangle { BarSeries { barCategories: [ "2008", "2009", "2010", "2011", "2012" ] + // TBD: data } PieSeries { + horizontalPosition: 0.2 + verticalPosition: 0.3 + size: 0.4 + endAngle: 0.52 * 360 // The share of "others" is 52% slices: [ PieSlice { label: "Volkswagen"; value: 13.5 }, PieSlice { label: "Toyota"; value: 10.9 }, PieSlice { label: "Ford"; value: 8.6 }, PieSlice { label: "Skoda"; value: 8.2 }, - PieSlice { label: "Volvo"; value: 6.8 }, - PieSlice { label: "Others"; value: 52.0 } + PieSlice { label: "Volvo"; value: 6.8 } ] } } @@ -82,6 +86,7 @@ Rectangle { theme: Chart.ChartThemeBrownSand LineSeries { + name: "Line" points: [ XyPoint { x: 0.0; y: 0.0 }, XyPoint { x: 1.1; y: 2.1 }, @@ -91,6 +96,7 @@ Rectangle { } SplineSeries { + name: "Spline" points: [ XyPoint { x: 0.0; y: 0.3 }, XyPoint { x: 1.1; y: 3.2 }, @@ -99,6 +105,7 @@ Rectangle { } AreaSeries { + name: "Area" points: [ XyPoint { x: 0.0; y: 1.1 }, XyPoint { x: 2.5; y: 3.6 }, @@ -112,6 +119,7 @@ Rectangle { } ScatterSeries { + name: "Scatter1" points: [ XyPoint { x: 1.5; y: 1.5 }, XyPoint { x: 1.5; y: 1.6 }, @@ -119,6 +127,7 @@ Rectangle { ] } ScatterSeries { + name: "Scatter2" points: [ XyPoint { x: 2.0; y: 2.0 }, XyPoint { x: 2.0; y: 2.1 }, @@ -126,6 +135,7 @@ Rectangle { ] } ScatterSeries { + name: "Scatter3" points: [ XyPoint { x: 2.6; y: 2.6 }, XyPoint { x: 2.6; y: 2.7 },