piesliceanimation.cpp
107 lines
| 3.4 KiB
| text/x-c
|
CppLexer
Michal Klocek
|
r623 | #include "piesliceanimation_p.h" | ||
Jani Honkonen
|
r618 | #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); | ||||
} | ||||
Jani Honkonen
|
r659 | QPen linearPos(QPen start, QPen end, qreal pos) | ||
{ | ||||
QColor c; | ||||
c.setRedF(linearPos(start.color().redF(), end.color().redF(), pos)); | ||||
c.setGreenF(linearPos(start.color().greenF(), end.color().greenF(), pos)); | ||||
c.setBlueF(linearPos(start.color().blueF(), end.color().blueF(), pos)); | ||||
end.setColor(c); | ||||
return end; | ||||
} | ||||
QBrush linearPos(QBrush start, QBrush end, qreal pos) | ||||
{ | ||||
QColor c; | ||||
c.setRedF(linearPos(start.color().redF(), end.color().redF(), pos)); | ||||
c.setGreenF(linearPos(start.color().greenF(), end.color().greenF(), pos)); | ||||
c.setBlueF(linearPos(start.color().blueF(), end.color().blueF(), pos)); | ||||
end.setColor(c); | ||||
return end; | ||||
} | ||||
Jani Honkonen
|
r629 | PieSliceAnimation::PieSliceAnimation(PieChartItem *item, QPieSlice *slice) | ||
Jani Honkonen
|
r618 | :QVariantAnimation(item), | ||
Jani Honkonen
|
r629 | m_item(item), | ||
m_slice(slice) | ||||
Jani Honkonen
|
r618 | { | ||
} | ||||
PieSliceAnimation::~PieSliceAnimation() | ||||
{ | ||||
} | ||||
Jani Honkonen
|
r629 | void PieSliceAnimation::setValue(const PieSliceLayout &startValue, const PieSliceLayout &endValue) | ||
Jani Honkonen
|
r618 | { | ||
if (state() != QAbstractAnimation::Stopped) | ||||
stop(); | ||||
Jani Honkonen
|
r659 | m_currentValue = startValue; | ||
Jani Honkonen
|
r618 | setKeyValueAt(0.0, qVariantFromValue(startValue)); | ||
setKeyValueAt(1.0, qVariantFromValue(endValue)); | ||||
} | ||||
Jani Honkonen
|
r629 | void PieSliceAnimation::updateValue(const PieSliceLayout &endValue) | ||
Jani Honkonen
|
r618 | { | ||
if (state() != QAbstractAnimation::Stopped) | ||||
stop(); | ||||
Jani Honkonen
|
r659 | setKeyValueAt(0.0, qVariantFromValue(m_currentValue)); | ||
Jani Honkonen
|
r618 | setKeyValueAt(1.0, qVariantFromValue(endValue)); | ||
} | ||||
PieSliceLayout PieSliceAnimation::currentSliceValue() | ||||
{ | ||||
Jani Honkonen
|
r659 | // NOTE: | ||
// We must use an internal current value because QVariantAnimation::currentValue() is updated | ||||
// before the animation is actually started. So if we get 2 updateValue() calls in a row the currentValue() | ||||
// will have the end value set from the first call and the second call will interpolate that instead of | ||||
// the original current value as it was before the first call. | ||||
return m_currentValue; | ||||
Jani Honkonen
|
r618 | } | ||
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); | ||||
Jani Honkonen
|
r659 | result.m_pen = linearPos(startValue.m_pen, endValue.m_pen, progress); | ||
result.m_brush = linearPos(startValue.m_brush, endValue.m_brush, progress); | ||||
Jani Honkonen
|
r618 | |||
return qVariantFromValue(result); | ||||
} | ||||
void PieSliceAnimation::updateCurrentValue(const QVariant &value) | ||||
{ | ||||
Jani Honkonen
|
r659 | if (state() != QAbstractAnimation::Stopped) { //workaround | ||
m_currentValue = qVariantValue<PieSliceLayout>(value); | ||||
m_item->setLayout(m_slice, m_currentValue); | ||||
} | ||||
Jani Honkonen
|
r618 | } | ||
QTCOMMERCIALCHART_END_NAMESPACE | ||||