From 54034d98d5c4b89e91b5f7a8a6439b31c3a18ffc 2012-03-16 14:33:50 From: Jani Honkonen Date: 2012-03-16 14:33:50 Subject: [PATCH] Getting rid of slice pointer in PieSliceLayout. --- diff --git a/src/animations/chartanimator.cpp b/src/animations/chartanimator.cpp index 9a6cb99..d342065 100644 --- a/src/animations/chartanimator.cpp +++ b/src/animations/chartanimator.cpp @@ -224,7 +224,7 @@ void ChartAnimator::updateLayout(XYChartItem* item, QVector& oldPoints QTimer::singleShot(0,animation,SLOT(start())); } -void ChartAnimator::addAnimation(PieChartItem* item, QPieSlice *slice, PieSliceLayout &layout) +void ChartAnimator::addAnimation(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout) { PieAnimation* animation = static_cast(m_animations.value(item)); Q_ASSERT(animation); @@ -238,18 +238,18 @@ void ChartAnimator::removeAnimation(PieChartItem* item, QPieSlice *slice) animation->removeSlice(slice); } -void ChartAnimator::updateLayout(PieChartItem* item, QVector &layout) +void ChartAnimator::updateLayout(PieChartItem* item, const PieLayout &layout) { PieAnimation* animation = static_cast(m_animations.value(item)); Q_ASSERT(animation); animation->updateValues(layout); } -void ChartAnimator::updateLayout(PieChartItem* item, PieSliceLayout &layout) +void ChartAnimator::updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout) { PieAnimation* animation = static_cast(m_animations.value(item)); Q_ASSERT(animation); - animation->updateValue(layout); + animation->updateValue(slice, layout); } void ChartAnimator::setState(State state,const QPointF& point) diff --git a/src/animations/chartanimator_p.h b/src/animations/chartanimator_p.h index 9b48728..c478978 100644 --- a/src/animations/chartanimator_p.h +++ b/src/animations/chartanimator_p.h @@ -35,10 +35,10 @@ public: void updateLayout(SplineChartItem* item, QVector& oldPoints , QVector& newPoints, QVector& oldControlPoints, QVector& newContorlPoints,int index); void applyLayout(AxisItem* item, QVector& layout); - void addAnimation(PieChartItem* item, QPieSlice *slice, PieSliceLayout &layout); + void addAnimation(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout); void removeAnimation(PieChartItem* item, QPieSlice *slice); - void updateLayout(PieChartItem* item, QVector &layout); - void updateLayout(PieChartItem* item, PieSliceLayout &layout); + void updateLayout(PieChartItem* item, const PieLayout &layout); + void updateLayout(PieChartItem* item, QPieSlice *slice, const PieSliceLayout &layout); void setState(State state,const QPointF& point = QPointF()); diff --git a/src/animations/pieanimation.cpp b/src/animations/pieanimation.cpp index 73cab3a..fa04c43 100644 --- a/src/animations/pieanimation.cpp +++ b/src/animations/pieanimation.cpp @@ -16,15 +16,15 @@ PieAnimation::~PieAnimation() { } -void PieAnimation::updateValues(QVector& newValues) +void PieAnimation::updateValues(const PieLayout &newValues) { - foreach (PieSliceLayout endLayout, newValues) - updateValue(endLayout); + foreach (QPieSlice* s, newValues.keys()) + updateValue(s, newValues.value(s)); } -void PieAnimation::updateValue(PieSliceLayout& endLayout) +void PieAnimation::updateValue(QPieSlice *slice, const PieSliceLayout &endLayout) { - PieSliceAnimation *animation = m_animations.value(endLayout.m_data); + PieSliceAnimation *animation = m_animations.value(slice); Q_ASSERT(animation); animation->stop(); @@ -35,9 +35,9 @@ void PieAnimation::updateValue(PieSliceLayout& endLayout) QTimer::singleShot(0, animation, SLOT(start())); } -void PieAnimation::addSlice(QPieSlice *slice, PieSliceLayout endLayout) +void PieAnimation::addSlice(QPieSlice *slice, const PieSliceLayout &endLayout) { - PieSliceAnimation *animation = new PieSliceAnimation(m_item); + PieSliceAnimation *animation = new PieSliceAnimation(m_item, slice); m_animations.insert(slice, animation); PieSliceLayout startLayout = endLayout; diff --git a/src/animations/pieanimation_p.h b/src/animations/pieanimation_p.h index b840008..7277338 100644 --- a/src/animations/pieanimation_p.h +++ b/src/animations/pieanimation_p.h @@ -16,9 +16,9 @@ class PieAnimation : public ChartAnimation public: PieAnimation(PieChartItem *item); ~PieAnimation(); - void updateValues(QVector& newValues); - void updateValue(PieSliceLayout& newValue); - void addSlice(QPieSlice *slice, PieSliceLayout endLayout); + void updateValues(const PieLayout &newValues); + void updateValue(QPieSlice *slice, const PieSliceLayout &newValue); + void addSlice(QPieSlice *slice, const PieSliceLayout &endLayout); void removeSlice(QPieSlice *slice); public: // from QVariantAnimation diff --git a/src/animations/piesliceanimation.cpp b/src/animations/piesliceanimation.cpp index d5514f5..31982c8 100644 --- a/src/animations/piesliceanimation.cpp +++ b/src/animations/piesliceanimation.cpp @@ -18,9 +18,10 @@ QPointF linearPos(QPointF start, QPointF end, qreal pos) return QPointF(x, y); } -PieSliceAnimation::PieSliceAnimation(PieChartItem *item) +PieSliceAnimation::PieSliceAnimation(PieChartItem *item, QPieSlice *slice) :QVariantAnimation(item), - m_item(item) + m_item(item), + m_slice(slice) { } @@ -28,7 +29,7 @@ PieSliceAnimation::~PieSliceAnimation() { } -void PieSliceAnimation::setValue(PieSliceLayout& startValue, PieSliceLayout& endValue) +void PieSliceAnimation::setValue(const PieSliceLayout &startValue, const PieSliceLayout &endValue) { if (state() != QAbstractAnimation::Stopped) stop(); @@ -37,13 +38,11 @@ void PieSliceAnimation::setValue(PieSliceLayout& startValue, PieSliceLayout& end setKeyValueAt(1.0, qVariantFromValue(endValue)); } -void PieSliceAnimation::updateValue(PieSliceLayout& endValue) +void PieSliceAnimation::updateValue(const PieSliceLayout &endValue) { if (state() != QAbstractAnimation::Stopped) stop(); - //qDebug() << "PieSliceAnimation::updateValue()" << endValue.m_data->label() << currentSliceValue().m_startAngle << endValue.m_startAngle; - setKeyValueAt(0.0, qVariantFromValue(currentSliceValue())); setKeyValueAt(1.0, qVariantFromValue(endValue)); } @@ -72,7 +71,7 @@ void PieSliceAnimation::updateCurrentValue(const QVariant &value) { PieSliceLayout layout = qVariantValue(value); if (state() != QAbstractAnimation::Stopped) //workaround - m_item->setLayout(layout); + m_item->setLayout(m_slice, layout); } QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/animations/piesliceanimation_p.h b/src/animations/piesliceanimation_p.h index 5afff87..fdaba6a 100644 --- a/src/animations/piesliceanimation_p.h +++ b/src/animations/piesliceanimation_p.h @@ -7,14 +7,15 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE class PieChartItem; +class QPieSlice; class PieSliceAnimation : public QVariantAnimation { public: - PieSliceAnimation(PieChartItem *item); + PieSliceAnimation(PieChartItem *item, QPieSlice *slice); ~PieSliceAnimation(); - void setValue(PieSliceLayout& startValue, PieSliceLayout& endValue); - void updateValue(PieSliceLayout& endValue); + void setValue(const PieSliceLayout &startValue, const PieSliceLayout &endValue); + void updateValue(const PieSliceLayout &endValue); PieSliceLayout currentSliceValue(); protected: @@ -23,6 +24,7 @@ protected: private: PieChartItem *m_item; + QPieSlice *m_slice; }; QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/piechart/piechartitem.cpp b/src/piechart/piechartitem.cpp index 22e6eac..61cf050 100644 --- a/src/piechart/piechartitem.cpp +++ b/src/piechart/piechartitem.cpp @@ -60,7 +60,7 @@ void PieChartItem::handleSlicesAdded(QList slices) if (m_animator) m_animator->addAnimation(this, s, layout); else - setLayout(layout); + setLayout(s, layout); } } @@ -76,7 +76,7 @@ void PieChartItem::handleSlicesRemoved(QList slices) void PieChartItem::handlePieLayoutChanged() { - QVector layout = calculateLayout(); + PieLayout layout = calculateLayout(); applyLayout(layout); update(); } @@ -86,7 +86,7 @@ void PieChartItem::handleSliceChanged() QPieSlice* slice = qobject_cast(sender()); Q_ASSERT(m_slices.contains(slice)); PieSliceLayout layout = calculateSliceLayout(slice); - updateLayout(layout); + updateLayout(slice, layout); update(); } @@ -120,7 +120,6 @@ void PieChartItem::calculatePieLayout() PieSliceLayout PieChartItem::calculateSliceLayout(QPieSlice *slice) { PieSliceLayout sliceLayout; - sliceLayout.m_data = slice; sliceLayout.m_center = PieSlice::sliceCenter(m_pieCenter, m_pieRadius, slice); sliceLayout.m_radius = m_pieRadius; sliceLayout.m_startAngle = slice->startAngle(); @@ -128,18 +127,18 @@ PieSliceLayout PieChartItem::calculateSliceLayout(QPieSlice *slice) return sliceLayout; } -QVector PieChartItem::calculateLayout() +PieLayout PieChartItem::calculateLayout() { calculatePieLayout(); - QVector layout; + PieLayout layout; foreach (QPieSlice* s, m_series->slices()) { if (m_slices.contains(s)) // calculate layout only for those slices that are already visible - layout << calculateSliceLayout(s); + layout.insert(s, calculateSliceLayout(s)); } return layout; } -void PieChartItem::applyLayout(QVector &layout) +void PieChartItem::applyLayout(const PieLayout &layout) { if (m_animator) m_animator->updateLayout(this, layout); @@ -147,36 +146,36 @@ void PieChartItem::applyLayout(QVector &layout) setLayout(layout); } -void PieChartItem::updateLayout(PieSliceLayout &layout) +void PieChartItem::updateLayout(QPieSlice *slice, const PieSliceLayout &layout) { if (m_animator) - m_animator->updateLayout(this, layout); + m_animator->updateLayout(this, slice, layout); else - setLayout(layout); + setLayout(slice, layout); } -void PieChartItem::setLayout(QVector &layout) +void PieChartItem::setLayout(const PieLayout &layout) { - foreach (PieSliceLayout l, layout) { - PieSlice *slice = m_slices.value(l.m_data); - Q_ASSERT(slice); - slice->setLayout(l); - slice->updateData(l.m_data); - slice->updateGeometry(); - slice->update(); + foreach (QPieSlice *slice, layout.keys()) { + PieSlice *s = m_slices.value(slice); + Q_ASSERT(s); + s->setLayout(layout.value(slice)); + s->updateData(slice); + s->updateGeometry(); + s->update(); } } -void PieChartItem::setLayout(PieSliceLayout &layout) +void PieChartItem::setLayout(QPieSlice *slice, const PieSliceLayout &layout) { // find slice - PieSlice *slice = m_slices.value(layout.m_data); - Q_ASSERT(slice); - slice->setLayout(layout); - if (m_series->m_slices.contains(layout.m_data)) // Slice has been deleted if not found. Animations ongoing... - slice->updateData(layout.m_data); - slice->updateGeometry(); - slice->update(); + PieSlice *s = m_slices.value(slice); + Q_ASSERT(s); + s->setLayout(layout); + if (m_series->m_slices.contains(slice)) // Slice has been deleted if not found. Animations ongoing... + s->updateData(slice); + s->updateGeometry(); + s->update(); } void PieChartItem::destroySlice(QPieSlice *slice) diff --git a/src/piechart/piechartitem_p.h b/src/piechart/piechartitem_p.h index 7a3b4db..21252c9 100644 --- a/src/piechart/piechartitem_p.h +++ b/src/piechart/piechartitem_p.h @@ -9,6 +9,8 @@ class QGraphicsItem; QTCOMMERCIALCHART_BEGIN_NAMESPACE class QPieSlice; +typedef QHash PieLayout; + class PieChartItem : public QObject, public ChartItem { Q_OBJECT @@ -34,11 +36,11 @@ public Q_SLOTS: public: void calculatePieLayout(); PieSliceLayout calculateSliceLayout(QPieSlice *slice); - QVector calculateLayout(); - void applyLayout(QVector &layout); - void updateLayout(PieSliceLayout &layout); - void setLayout(QVector &layout); - void setLayout(PieSliceLayout &layout); + PieLayout calculateLayout(); + void applyLayout(const PieLayout &layout); + void updateLayout(QPieSlice *slice, const PieSliceLayout &layout); + void setLayout(const PieLayout &layout); + void setLayout(QPieSlice *slice, const PieSliceLayout &layout); void destroySlice(QPieSlice *slice); private: diff --git a/src/piechart/pieslice_p.h b/src/piechart/pieslice_p.h index bd08fdb..5de85aa 100644 --- a/src/piechart/pieslice_p.h +++ b/src/piechart/pieslice_p.h @@ -19,7 +19,6 @@ class QPieSlice; class PieSliceLayout { public: - QPieSlice* m_data; // TODO: get rid of this QPointF m_center; qreal m_radius; qreal m_startAngle;