6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
51#include <QtCore/qtimeline.h>
52#include <QtCore/qpoint.h>
53#include <QtCore/qpointer.h>
61 if (!(step >= 0 && step <= 1)) {
62 qWarning(
"QGraphicsItemAnimation::%s: invalid step = %f", method, step);
87 {
return step < other.step; }
89 {
return step == other.step; }
111 if (source.isEmpty())
113 step = qMin<qreal>(qMax<qreal>(step, 0), 1);
116 return source.back().value;
118 qreal stepBefore = 0;
120 qreal valueBefore = source.front().step == 0 ? source.front().value : defaultValue;
121 qreal valueAfter = source.back().value;
124 for (
int i = 0; i < source.size() && step >= source[i].step; ++i) {
125 stepBefore = source[i].step;
126 valueBefore = source[i].value;
130 for (
int i = source.size() - 1; i >= 0 && step < source[i].step; --i) {
131 stepAfter = source[i].step;
132 valueAfter = source[i].value;
136 return valueBefore + (valueAfter - valueBefore) * ((step - stepBefore) / (stepAfter - stepBefore));
142 if (!check_step_valid(step, method))
145 const Pair pair = { step, value };
147 const QList<Pair>::iterator result =
std::lower_bound(binList->begin(), binList->end(), pair);
148 if (result == binList->end() || pair < *result)
149 binList->insert(result, pair);
151 result->value = value;
155
156
157QGraphicsItemAnimation::QGraphicsItemAnimation(QObject *parent)
158 : QObject(parent), d(
new QGraphicsItemAnimationPrivate)
164
165
166QGraphicsItemAnimation::~QGraphicsItemAnimation()
172
173
174
175
176QGraphicsItem *QGraphicsItemAnimation::item()
const
182
183
184
185
186void QGraphicsItemAnimation::setItem(QGraphicsItem *item)
189 d->startPos = d->item->pos();
193
194
195
196
197
198QTimeLine *QGraphicsItemAnimation::timeLine()
const
204
205
206
207
208
209void QGraphicsItemAnimation::setTimeLine(QTimeLine *timeLine)
211 if (d->timeLine == timeLine)
217 d->timeLine = timeLine;
218 connect(timeLine, SIGNAL(valueChanged(qreal)),
this, SLOT(setStep(qreal)));
222
223
224
225
226QPointF QGraphicsItemAnimation::posAt(qreal step)
const
228 check_step_valid(step,
"posAt");
229 return QPointF(d->linearValueForStep(step, d->xPosition, d->startPos.x()),
230 d->linearValueForStep(step, d->yPosition, d->startPos.y()));
234
235
236
237
238
239
240void QGraphicsItemAnimation::setPosAt(qreal step,
const QPointF &pos)
242 d->insertUniquePair(step, pos.x(), &d->xPosition,
"setPosAt");
243 d->insertUniquePair(step, pos.y(), &d->yPosition,
"setPosAt");
247
248
249
250
251QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::posList()
const
253 QList<std::pair<qreal, QPointF>> list;
254 const int xPosCount = d->xPosition.size();
255 list.reserve(xPosCount);
256 for (
int i = 0; i < xPosCount; ++i)
257 list.emplace_back(d->xPosition.at(i).step,
258 QPointF(d->xPosition.at(i).value, d->yPosition.at(i).value));
264
265
266
267
268QTransform QGraphicsItemAnimation::transformAt(qreal step)
const
270 check_step_valid(step,
"transformAt");
272 QTransform transform;
273 if (!d->rotation.isEmpty())
274 transform.rotate(rotationAt(step));
275 if (!d->verticalScale.isEmpty())
276 transform.scale(horizontalScaleAt(step), verticalScaleAt(step));
277 if (!d->verticalShear.isEmpty())
278 transform.shear(horizontalShearAt(step), verticalShearAt(step));
279 if (!d->xTranslation.isEmpty())
280 transform.translate(xTranslationAt(step), yTranslationAt(step));
285
286
287
288
289qreal QGraphicsItemAnimation::rotationAt(qreal step)
const
291 check_step_valid(step,
"rotationAt");
292 return d->linearValueForStep(step, d->rotation);
296
297
298
299
300void QGraphicsItemAnimation::setRotationAt(qreal step, qreal angle)
302 d->insertUniquePair(step, angle, &d->rotation,
"setRotationAt");
306
307
308
309
310QList<std::pair<qreal, qreal> > QGraphicsItemAnimation::rotationList()
const
312 QList<std::pair<qreal, qreal>> list;
313 const int numRotations = d->rotation.size();
314 list.reserve(numRotations);
315 for (
int i = 0; i < numRotations; ++i)
316 list.emplace_back(d->rotation.at(i).step, d->rotation.at(i).value);
322
323
324
325
326qreal QGraphicsItemAnimation::xTranslationAt(qreal step)
const
328 check_step_valid(step,
"xTranslationAt");
329 return d->linearValueForStep(step, d->xTranslation);
333
334
335
336
337qreal QGraphicsItemAnimation::yTranslationAt(qreal step)
const
339 check_step_valid(step,
"yTranslationAt");
340 return d->linearValueForStep(step, d->yTranslation);
344
345
346
347
348
349void QGraphicsItemAnimation::setTranslationAt(qreal step, qreal dx, qreal dy)
351 d->insertUniquePair(step, dx, &d->xTranslation,
"setTranslationAt");
352 d->insertUniquePair(step, dy, &d->yTranslation,
"setTranslationAt");
356
357
358
359
360QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::translationList()
const
362 QList<std::pair<qreal, QPointF>> list;
363 const int numTranslations = d->xTranslation.size();
364 list.reserve(numTranslations);
365 for (
int i = 0; i < numTranslations; ++i)
366 list.emplace_back(d->xTranslation.at(i).step,
367 QPointF(d->xTranslation.at(i).value, d->yTranslation.at(i).value));
373
374
375
376
377qreal QGraphicsItemAnimation::verticalScaleAt(qreal step)
const
379 check_step_valid(step,
"verticalScaleAt");
381 return d->linearValueForStep(step, d->verticalScale, 1);
385
386
387
388
389qreal QGraphicsItemAnimation::horizontalScaleAt(qreal step)
const
391 check_step_valid(step,
"horizontalScaleAt");
392 return d->linearValueForStep(step, d->horizontalScale, 1);
396
397
398
399
400
401void QGraphicsItemAnimation::setScaleAt(qreal step, qreal sx, qreal sy)
403 d->insertUniquePair(step, sx, &d->horizontalScale,
"setScaleAt");
404 d->insertUniquePair(step, sy, &d->verticalScale,
"setScaleAt");
408
409
410
411
412QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::scaleList()
const
414 QList<std::pair<qreal, QPointF>> list;
415 const int numScales = d->horizontalScale.size();
416 list.reserve(numScales);
417 for (
int i = 0; i < numScales; ++i)
418 list.emplace_back(d->horizontalScale.at(i).step,
419 QPointF(d->horizontalScale.at(i).value,
420 d->verticalScale.at(i).value));
426
427
428
429
430qreal QGraphicsItemAnimation::verticalShearAt(qreal step)
const
432 check_step_valid(step,
"verticalShearAt");
433 return d->linearValueForStep(step, d->verticalShear, 0);
437
438
439
440
441qreal QGraphicsItemAnimation::horizontalShearAt(qreal step)
const
443 check_step_valid(step,
"horizontalShearAt");
444 return d->linearValueForStep(step, d->horizontalShear, 0);
448
449
450
451
452
453void QGraphicsItemAnimation::setShearAt(qreal step, qreal sh, qreal sv)
455 d->insertUniquePair(step, sh, &d->horizontalShear,
"setShearAt");
456 d->insertUniquePair(step, sv, &d->verticalShear,
"setShearAt");
460
461
462
463
464QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::shearList()
const
466 QList<std::pair<qreal, QPointF>> list;
467 const int numShears = d->horizontalShear.size();
468 list.reserve(numShears);
469 for (
int i = 0; i < numShears; ++i)
470 list.emplace_back(d->horizontalShear.at(i).step,
471 QPointF(d->horizontalShear.at(i).value,
472 d->verticalShear.at(i).value));
478
479
480
481void QGraphicsItemAnimation::clear()
483 d->xPosition.clear();
484 d->yPosition.clear();
486 d->verticalScale.clear();
487 d->horizontalScale.clear();
488 d->verticalShear.clear();
489 d->horizontalShear.clear();
490 d->xTranslation.clear();
491 d->yTranslation.clear();
495
496
497
498
499
500void QGraphicsItemAnimation::setStep(qreal step)
502 if (!check_step_valid(step,
"setStep"))
505 beforeAnimationStep(step);
509 if (!d->xPosition.isEmpty() || !d->yPosition.isEmpty())
510 d->item->setPos(posAt(step));
511 if (!d->rotation.isEmpty()
512 || !d->verticalScale.isEmpty()
513 || !d->horizontalScale.isEmpty()
514 || !d->verticalShear.isEmpty()
515 || !d->horizontalShear.isEmpty()
516 || !d->xTranslation.isEmpty()
517 || !d->yTranslation.isEmpty()) {
518 d->item->setTransform(d->startTransform * transformAt(step));
522 afterAnimationStep(step);
526
527
528
529
530
531
532
533void QGraphicsItemAnimation::beforeAnimationStep(qreal step)
539
540
541
542
543
544
545
546void QGraphicsItemAnimation::afterAnimationStep(qreal step)
553#include "moc_qgraphicsitemanimation.cpp"
QPointer< QTimeLine > timeLine
void insertUniquePair(qreal step, qreal value, QList< Pair > *binList, const char *method)
QList< Pair > horizontalScale
QList< Pair > verticalShear
QList< Pair > horizontalShear
QList< Pair > yTranslation
QTransform startTransform
QList< Pair > verticalScale
qreal linearValueForStep(qreal step, const QList< Pair > &source, qreal defaultValue=0)
QGraphicsItemAnimationPrivate()
QList< Pair > xTranslation
QGraphicsItemAnimation * q
\inmodule QtCore\reentrant
static QT_BEGIN_NAMESPACE bool check_step_valid(qreal step, const char *method)
Q_DECLARE_TYPEINFO(QGraphicsItemAnimationPrivate::Pair, Q_PRIMITIVE_TYPE)
bool operator==(const Pair &other) const
bool operator<(const Pair &other) const