diff options
Diffstat (limited to 'src/animations/xyanimation.cpp')
-rw-r--r-- | src/animations/xyanimation.cpp | 80 |
1 files changed, 53 insertions, 27 deletions
diff --git a/src/animations/xyanimation.cpp b/src/animations/xyanimation.cpp index 104f84a6..2b9ada51 100644 --- a/src/animations/xyanimation.cpp +++ b/src/animations/xyanimation.cpp @@ -29,8 +29,10 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE XYAnimation::XYAnimation(XYChart *item):ChartAnimation(item), m_item(item), m_dirty(false), - m_type(MoveDownAnimation) + m_type(NewAnimation) { + setDuration(ChartAnimationDuration); + setEasingCurve(QEasingCurve::OutQuart); } XYAnimation::~XYAnimation() @@ -39,38 +41,48 @@ XYAnimation::~XYAnimation() void XYAnimation::setAnimationType(Animation type) { - if (state() != QAbstractAnimation::Stopped) stop(); + if (state() != QAbstractAnimation::Stopped) stop(); m_type=type; } -void XYAnimation::setValues(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints, int index) +void XYAnimation::setValues(const QVector<QPointF> &oldPoints, const QVector<QPointF> &newPoints, int index) { - if (state() != QAbstractAnimation::Stopped) stop(); + if (state() != QAbstractAnimation::Stopped) stop(); - int x = oldPoints.count(); - int y = newPoints.count(); - - if (x != y && abs(x - y) != 1) { - m_oldPoints = newPoints; - oldPoints.resize(newPoints.size()); - setKeyValueAt(0.0, qVariantFromValue(oldPoints)); - setKeyValueAt(1.0, qVariantFromValue(newPoints)); - m_dirty = false; + if (m_item->isDirty()) { + m_oldPoints = oldPoints; + m_newPoints = newPoints; + m_dirty=false; } else { - if (m_dirty) { + if(m_dirty) { + m_newPoints = newPoints; m_oldPoints = oldPoints; - m_dirty = false; + m_dirty=false; + } + } + + int x = m_oldPoints.count(); + int y = m_newPoints.count(); + + if (abs(x - y) == 1) { + if (y < x){ + if(!newPoints.isEmpty()) m_newPoints.insert(index,newPoints[index]); + m_index=index;if(newPoints.isEmpty()) + m_dirty=true; + } + if (y > x){ + m_oldPoints.insert(index, x > 0 ? m_oldPoints[index-1] : newPoints[index]);//add } - oldPoints = newPoints; - if (y < x) - m_oldPoints.remove(index); //remove - if (y > x) - m_oldPoints.insert(index, x > 0 ? m_oldPoints[index-1] : newPoints[index]); //add - setKeyValueAt(0.0, qVariantFromValue(m_oldPoints)); - setKeyValueAt(1.0, qVariantFromValue(newPoints)); - Q_ASSERT(m_oldPoints.count() == newPoints.count()); + }else{ + m_newPoints=newPoints; + m_dirty=false; + m_oldPoints.resize(m_newPoints.size()); } + + setKeyValueAt(0.0, qVariantFromValue(m_oldPoints)); + setKeyValueAt(1.0, qVariantFromValue(m_newPoints)); + } QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, qreal progress ) const @@ -81,8 +93,10 @@ QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, q switch (m_type) { - case MoveDownAnimation: { - + case ReplacePointAnimation: + case AddPointAnimation: + case RemovePointAnimation: + { if (startVector.count() != endVector.count()) break; @@ -94,7 +108,7 @@ QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, q } break; - case LineDrawAnimation: { + case NewAnimation: { for(int i = 0; i < endVector.count() * qBound(qreal(0), progress, qreal(1)); i++) result << endVector[i]; } @@ -110,11 +124,23 @@ QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, q void XYAnimation::updateCurrentValue (const QVariant &value) { if(state()!=QAbstractAnimation::Stopped){ //workaround - m_dirty = true; QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value); m_item->setGeometryPoints(vector); m_item->updateGeometry(); + m_item->setDirty(true); } } +void XYAnimation::updateState( QAbstractAnimation::State newState, QAbstractAnimation::State oldState ) +{ + if(oldState == QAbstractAnimation::Running && newState == QAbstractAnimation::Stopped) + { + if(m_item->isDirty() && m_type==RemovePointAnimation){ + if(!m_newPoints.isEmpty()) m_newPoints.remove(m_index); + m_item->setGeometryPoints(m_newPoints); + } + } +} + +#include "moc_chartanimation_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE |