##// END OF EJS Templates
Add animations to pie. Works but has some visual issues when adding slices.
Add animations to pie. Works but has some visual issues when adding slices.

File last commit:

r618:249071e508d1
r618:249071e508d1
Show More
piesliceanimation.cpp
77 lines | 2.3 KiB | text/x-c | CppLexer
#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<PieSliceLayout>(currentValue());
}
QVariant PieSliceAnimation::interpolated(const QVariant &start, const QVariant &end, qreal progress) const
{
PieSliceLayout startValue = qVariantValue<PieSliceLayout>(start);
PieSliceLayout endValue = qVariantValue<PieSliceLayout>(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)
{
if (state() != QAbstractAnimation::Stopped) //workaround
m_item->setLayout(qVariantValue<PieSliceLayout>(value));
}
QTCOMMERCIALCHART_END_NAMESPACE