summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@digia.com>2012-05-28 16:04:37 +0300
committerMichal Klocek <michal.klocek@digia.com>2012-05-29 10:10:45 +0300
commitb11722f8058842260f9b7e1e72418768d24ff91b (patch)
tree79907367dfb81c0c4c40fa7fd1873b862860cd34
parent8cad7c5eba8c408925cdd7743b1bef72c1a9c998 (diff)
adds QLineAnimation fixes
-rw-r--r--src/animations/splineanimation.cpp2
-rw-r--r--src/animations/splineanimation_p.h2
-rw-r--r--src/animations/xyanimation.cpp81
-rw-r--r--src/animations/xyanimation_p.h3
-rw-r--r--src/splinechart/splinechartitem.cpp6
-rw-r--r--src/xychart/xychart.cpp23
-rw-r--r--src/xychart/xychart_p.h2
7 files changed, 55 insertions, 64 deletions
diff --git a/src/animations/splineanimation.cpp b/src/animations/splineanimation.cpp
index 51fce1ac..8229744f 100644
--- a/src/animations/splineanimation.cpp
+++ b/src/animations/splineanimation.cpp
@@ -37,7 +37,7 @@ SplineAnimation::~SplineAnimation()
{
}
-void SplineAnimation::setValues(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints, QVector<QPointF> &oldControlPoints, QVector<QPointF> &newControlPoints, int index)
+void SplineAnimation::setup(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints, QVector<QPointF> &oldControlPoints, QVector<QPointF> &newControlPoints, int index)
{
int x = oldPoints.count();
int y = newPoints.count();
diff --git a/src/animations/splineanimation_p.h b/src/animations/splineanimation_p.h
index 6f1d8da1..6ca2f422 100644
--- a/src/animations/splineanimation_p.h
+++ b/src/animations/splineanimation_p.h
@@ -34,7 +34,7 @@ class SplineAnimation : public XYAnimation
public:
SplineAnimation(SplineChartItem *item);
~SplineAnimation();
- void setValues(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints, QVector<QPointF> &oldContorlPoints, QVector<QPointF> &newControlPoints, int index);
+ void setup(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints, QVector<QPointF> &oldContorlPoints, QVector<QPointF> &newControlPoints, int index = -1);
protected:
QVariant interpolated(const QVariant &start, const QVariant &end, qreal progress) const;
diff --git a/src/animations/xyanimation.cpp b/src/animations/xyanimation.cpp
index 2b9ada51..e93e6fb7 100644
--- a/src/animations/xyanimation.cpp
+++ b/src/animations/xyanimation.cpp
@@ -39,50 +39,53 @@ XYAnimation::~XYAnimation()
{
}
-void XYAnimation::setAnimationType(Animation type)
+void XYAnimation::setup(const QVector<QPointF> &oldPoints, const QVector<QPointF> &newPoints, int index)
{
- if (state() != QAbstractAnimation::Stopped) stop();
- m_type=type;
-}
+ m_type = NewAnimation;
-void XYAnimation::setValues(const QVector<QPointF> &oldPoints, const QVector<QPointF> &newPoints, int index)
-{
- if (state() != QAbstractAnimation::Stopped) stop();
+ if (state() != QAbstractAnimation::Stopped){
+ stop();
+ m_dirty=false;
+ }
- if (m_item->isDirty()) {
- m_oldPoints = oldPoints;
- m_newPoints = newPoints;
- m_dirty=false;
- }
- else {
- if(m_dirty) {
- m_newPoints = newPoints;
- m_oldPoints = oldPoints;
- m_dirty=false;
- }
- }
+ if(!m_dirty){
+ m_dirty = true;
+ m_oldPoints = oldPoints;
+ }
- int x = m_oldPoints.count();
- int y = m_newPoints.count();
+ m_newPoints = newPoints;
- 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
- }
- }else{
- m_newPoints=newPoints;
- m_dirty=false;
- m_oldPoints.resize(m_newPoints.size());
- }
+ int x = m_oldPoints.count();
+ int y = m_newPoints.count();
+
+ if(x - y == 1 && index >= 0 && !newPoints.isEmpty()){
+ //remove point
+ m_newPoints.insert(index, index >= 1 ? m_newPoints[index-1] : newPoints[index]);
+ m_index=index;
+ m_type = RemovePointAnimation;
+ }
+
+ if(x - y == -1 && index >= 0){
+ //add point
+ m_oldPoints.insert(index, x > 0 && index > 1 ? m_oldPoints[index-1] : newPoints[index]);
+ m_index=index;
+ m_type = AddPointAnimation;
+ }
+
+ x = m_oldPoints.count();
+ y = m_newPoints.count();
+
+ if(x != y)
+ {
+ m_type = NewAnimation;
+ }
+ else if(m_type == NewAnimation)
+ {
+ m_type = ReplacePointAnimation;
+ }
setKeyValueAt(0.0, qVariantFromValue(m_oldPoints));
setKeyValueAt(1.0, qVariantFromValue(m_newPoints));
-
}
QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, qreal progress ) const
@@ -97,8 +100,9 @@ QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, q
case AddPointAnimation:
case RemovePointAnimation:
{
- if (startVector.count() != endVector.count())
+ if (startVector.count() != endVector.count()){
break;
+ }
for(int i = 0; i < startVector.count(); i++) {
qreal x = startVector[i].x() + ((endVector[i].x() - startVector[i].x()) * progress);
@@ -124,10 +128,13 @@ QVariant XYAnimation::interpolated(const QVariant &start, const QVariant &end, q
void XYAnimation::updateCurrentValue (const QVariant &value)
{
if(state()!=QAbstractAnimation::Stopped){ //workaround
+
QVector<QPointF> vector = qVariantValue<QVector<QPointF> >(value);
m_item->setGeometryPoints(vector);
m_item->updateGeometry();
m_item->setDirty(true);
+ m_dirty=false;
+
}
}
diff --git a/src/animations/xyanimation_p.h b/src/animations/xyanimation_p.h
index 50b3478a..5c887402 100644
--- a/src/animations/xyanimation_p.h
+++ b/src/animations/xyanimation_p.h
@@ -34,8 +34,7 @@ public:
enum Animation { AddPointAnimation, RemovePointAnimation, ReplacePointAnimation, NewAnimation };
XYAnimation(XYChart *item);
~XYAnimation();
- void setValues(const QVector<QPointF> &oldPoints, const QVector<QPointF> &newPoints,int index);
- void setAnimationType(Animation type);
+ void setup(const QVector<QPointF> &oldPoints, const QVector<QPointF> &newPoints,int index = -1);
Animation animationType() const { return m_type; };
protected:
diff --git a/src/splinechart/splinechartitem.cpp b/src/splinechart/splinechartitem.cpp
index 019fe466..ca6183c0 100644
--- a/src/splinechart/splinechartitem.cpp
+++ b/src/splinechart/splinechartitem.cpp
@@ -86,7 +86,9 @@ void SplineChartItem::updateChart(QVector<QPointF> &oldPoints, QVector<QPointF>
}
if (m_animation) {
- m_animation->setValues(oldPoints,newPoints,m_controlPoints,controlPoints,index);
+ m_animation->setup(oldPoints,newPoints,m_controlPoints,controlPoints,index);
+ setGeometryPoints(newPoints);
+ setDirty(false);
presenter()->startAnimation(m_animation);
}
else {
@@ -107,7 +109,9 @@ void SplineChartItem::updateGeometry()
const QVector<QPointF> &controlPoints = controlGeometryPoints();
if ((points.size()<2) || (controlPoints.size()<2)) {
+ prepareGeometryChange();
m_path = QPainterPath();
+ m_rect = QRect();
return;
}
diff --git a/src/xychart/xychart.cpp b/src/xychart/xychart.cpp
index 1cd7a523..5a5d61f4 100644
--- a/src/xychart/xychart.cpp
+++ b/src/xychart/xychart.cpp
@@ -117,8 +117,9 @@ QPointF XYChart::calculateDomainPoint(const QPointF &point) const
void XYChart::updateChart(QVector<QPointF> &oldPoints, QVector<QPointF> &newPoints,int index)
{
+
if (m_animation) {
- m_animation->setValues(oldPoints, newPoints, index);
+ m_animation->setup(oldPoints, newPoints, index);
setGeometryPoints(newPoints);
setDirty(false);
presenter()->startAnimation(m_animation);
@@ -138,10 +139,6 @@ void XYChart::handlePointAdded(int index)
QVector<QPointF> points;
- if(m_animation) {
- m_animation->setAnimationType(XYAnimation::AddPointAnimation);
- }
-
if(m_dirty) {
points = calculateGeometryPoints();
} else {
@@ -160,10 +157,6 @@ void XYChart::handlePointRemoved(int index)
QVector<QPointF> points;
- if(m_animation) {
- m_animation->setAnimationType(XYAnimation::RemovePointAnimation);
- }
-
if(m_dirty) {
points = calculateGeometryPoints();
} else {
@@ -181,10 +174,6 @@ void XYChart::handlePointReplaced(int index)
QVector<QPointF> points;
- if(m_animation) {
- m_animation->setAnimationType(XYAnimation::ReplacePointAnimation);
- }
-
if(m_dirty) {
points = calculateGeometryPoints();
} else {
@@ -206,10 +195,6 @@ void XYChart::handleDomainChanged(qreal minX, qreal maxX, qreal minY, qreal maxY
QVector<QPointF> points = calculateGeometryPoints();
- if(m_animation) {
- m_animation->setAnimationType(XYAnimation::ReplacePointAnimation);
- }
-
updateChart(m_points,points);
}
@@ -224,10 +209,6 @@ void XYChart::handleGeometryChanged(const QRectF &rect)
QVector<QPointF> points = calculateGeometryPoints();
- if(m_animation) {
- m_animation->setAnimationType(XYAnimation::NewAnimation);
- }
-
updateChart(m_points,points);
}
diff --git a/src/xychart/xychart_p.h b/src/xychart/xychart_p.h
index 14717dbf..d61bcbfb 100644
--- a/src/xychart/xychart_p.h
+++ b/src/xychart/xychart_p.h
@@ -65,7 +65,7 @@ Q_SIGNALS:
void clicked(const QPointF& point);
protected:
- virtual void updateChart(QVector<QPointF> &oldPoints,QVector<QPointF> &newPoints,int index = 0);
+ virtual void updateChart(QVector<QPointF> &oldPoints,QVector<QPointF> &newPoints,int index = -1);
QPointF calculateGeometryPoint(const QPointF &point) const;
QPointF calculateGeometryPoint(int index) const;
QPointF calculateDomainPoint(const QPointF &point) const;