From 4447e4e83da10f4dcce95311c8f421b6a061646e 2012-08-21 07:29:49 From: Jani Honkonen Date: 2012-08-21 07:29:49 Subject: [PATCH] Implemented QPieSeries::take() --- diff --git a/src/piechart/qpieseries.cpp b/src/piechart/qpieseries.cpp index 699c183..d7f60bb 100644 --- a/src/piechart/qpieseries.cpp +++ b/src/piechart/qpieseries.cpp @@ -511,6 +511,31 @@ bool QPieSeries::remove(QPieSlice* slice) } /*! + Takes a single \a slice from the series. Does not destroy the slice object. + + NOTE: The series remains as the slice's parent object. You must set the + parent object to take full ownership. + + Returns true if take was successfull. +*/ +bool QPieSeries::take(QPieSlice* slice) +{ + Q_D(QPieSeries); + + if (!d->m_slices.removeOne(slice)) + return false; + + QPieSlicePrivate::fromSlice(slice)->m_series = 0; + + d->updateDerivativeData(); + + emit removed(QList() << slice); + emit countChanged(); + + return true; +} + +/*! Clears all slices from the series. */ void QPieSeries::clear() diff --git a/src/piechart/qpieseries.h b/src/piechart/qpieseries.h index a144e24..b3806ec 100644 --- a/src/piechart/qpieseries.h +++ b/src/piechart/qpieseries.h @@ -55,6 +55,7 @@ public: bool insert(int index, QPieSlice* slice); bool remove(QPieSlice* slice); + bool take(QPieSlice* slice); void clear(); QList slices() const; diff --git a/tests/auto/qpieseries/tst_qpieseries.cpp b/tests/auto/qpieseries/tst_qpieseries.cpp index 9e8df0f..e90328a 100644 --- a/tests/auto/qpieseries/tst_qpieseries.cpp +++ b/tests/auto/qpieseries/tst_qpieseries.cpp @@ -50,6 +50,8 @@ private slots: void insertAnimated(); void remove(); void removeAnimated(); + void take(); + void takeAnimated(); void calculatedValues(); void clickedSignal(); void hoverSignal(); @@ -348,6 +350,40 @@ void tst_qpieseries::removeAnimated() remove(); } +void tst_qpieseries::take() +{ + m_view->chart()->addSeries(m_series); + QSignalSpy removedSpy(m_series, SIGNAL(removed(QList))); + + // add some slices + QPieSlice *slice1 = m_series->append("slice 1", 1); + QPieSlice *slice2 = m_series->append("slice 2", 2); + m_series->append("slice 3", 3); + QSignalSpy spy1(slice1, SIGNAL(destroyed())); + QCOMPARE(m_series->count(), 3); + + // null pointer remove + QVERIFY(!m_series->take(0)); + + // take first + QVERIFY(m_series->take(slice1)); + TRY_COMPARE(spy1.count(), 0); + QVERIFY(slice1->parent() == m_series); // series is still the parent object + QVERIFY(!m_series->take(slice1)); + QCOMPARE(m_series->count(), 2); + QCOMPARE(m_series->slices().at(0)->label(), slice2->label()); + QCOMPARE(removedSpy.count(), 1); + QList removed = qvariant_cast >(removedSpy.at(0).at(0)); + QCOMPARE(removed.count(), 1); + QCOMPARE(removed.first(), slice1); +} + +void tst_qpieseries::takeAnimated() +{ + m_view->chart()->setAnimationOptions(QChart::AllAnimations); + take(); +} + void tst_qpieseries::calculatedValues() { m_view->chart()->addSeries(m_series); @@ -573,6 +609,9 @@ void tst_qpieseries::sliceSeries() slice = new QPieSlice(); m_series->insert(0, slice); QCOMPARE(slice->series(), m_series); + + m_series->take(slice); + QCOMPARE(slice->series(), (QPieSeries*) 0); } void tst_qpieseries::destruction()