#include "piesliceanimation_p.h" #include "piechartitem_p.h" #include "qpieslice.h" Q_DECLARE_METATYPE(QtCommercialChart::PieSliceLayout) QTCOMMERCIALCHART_BEGIN_NAMESPACE qreal linearPos(qreal start, qreal end, qreal pos) { return start + ((end - start) * pos); } QPointF linearPos(QPointF start, QPointF end, qreal pos) { qreal x = linearPos(start.x(), end.x(), pos); qreal y = linearPos(start.y(), end.y(), pos); return QPointF(x, y); } PieSliceAnimation::PieSliceAnimation(PieChartItem *item) :QVariantAnimation(item), m_item(item) { } PieSliceAnimation::~PieSliceAnimation() { } void PieSliceAnimation::setValue(PieSliceLayout& startValue, PieSliceLayout& endValue) { if (state() != QAbstractAnimation::Stopped) stop(); setKeyValueAt(0.0, qVariantFromValue(startValue)); setKeyValueAt(1.0, qVariantFromValue(endValue)); } void PieSliceAnimation::updateValue(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)); } PieSliceLayout PieSliceAnimation::currentSliceValue() { return qVariantValue(currentValue()); } QVariant PieSliceAnimation::interpolated(const QVariant &start, const QVariant &end, qreal progress) const { PieSliceLayout startValue = qVariantValue(start); PieSliceLayout endValue = qVariantValue(end); PieSliceLayout result; result = endValue; result.m_center = linearPos(startValue.m_center, endValue.m_center, progress); result.m_radius = linearPos(startValue.m_radius, endValue.m_radius, progress); result.m_startAngle = linearPos(startValue.m_startAngle, endValue.m_startAngle, progress); result.m_angleSpan = linearPos(startValue.m_angleSpan, endValue.m_angleSpan, progress); return qVariantFromValue(result); } void PieSliceAnimation::updateCurrentValue(const QVariant &value) { PieSliceLayout layout = qVariantValue(value); if (state() != QAbstractAnimation::Stopped) //workaround m_item->setLayout(layout); } QTCOMMERCIALCHART_END_NAMESPACE