5
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
50#include <QtCore/qtimeline.h>
51#include <QtCore/qpoint.h>
52#include <QtCore/qpointer.h>
60 if (!(step >= 0 && step <= 1)) {
61 qWarning(
"QGraphicsItemAnimation::%s: invalid step = %f", method, step);
86 {
return step < other.step; }
88 {
return step == other.step; }
110 if (source.isEmpty())
112 step = qMin<qreal>(qMax<qreal>(step, 0), 1);
115 return source.back().value;
117 qreal stepBefore = 0;
119 qreal valueBefore = source.front().step == 0 ? source.front().value : defaultValue;
120 qreal valueAfter = source.back().value;
123 for (
int i = 0; i < source.size() && step >= source[i].step; ++i) {
124 stepBefore = source[i].step;
125 valueBefore = source[i].value;
129 for (
int i = source.size() - 1; i >= 0 && step < source[i].step; --i) {
130 stepAfter = source[i].step;
131 valueAfter = source[i].value;
135 return valueBefore + (valueAfter - valueBefore) * ((step - stepBefore) / (stepAfter - stepBefore));
141 if (!check_step_valid(step, method))
144 const Pair pair = { step, value };
146 const QList<Pair>::iterator result =
std::lower_bound(binList->begin(), binList->end(), pair);
147 if (result == binList->end() || pair < *result)
148 binList->insert(result, pair);
150 result->value = value;
154
155
156QGraphicsItemAnimation::QGraphicsItemAnimation(QObject *parent)
157 : QObject(parent), d(
new QGraphicsItemAnimationPrivate)
163
164
165QGraphicsItemAnimation::~QGraphicsItemAnimation()
171
172
173
174
175QGraphicsItem *QGraphicsItemAnimation::item()
const
181
182
183
184
185void QGraphicsItemAnimation::setItem(QGraphicsItem *item)
188 d->startPos = d->item->pos();
192
193
194
195
196
197QTimeLine *QGraphicsItemAnimation::timeLine()
const
203
204
205
206
207
208void QGraphicsItemAnimation::setTimeLine(QTimeLine *timeLine)
210 if (d->timeLine == timeLine)
216 d->timeLine = timeLine;
217 connect(timeLine, SIGNAL(valueChanged(qreal)),
this, SLOT(setStep(qreal)));
221
222
223
224
225QPointF QGraphicsItemAnimation::posAt(qreal step)
const
227 check_step_valid(step,
"posAt");
228 return QPointF(d->linearValueForStep(step, d->xPosition, d->startPos.x()),
229 d->linearValueForStep(step, d->yPosition, d->startPos.y()));
233
234
235
236
237
238
239void QGraphicsItemAnimation::setPosAt(qreal step,
const QPointF &pos)
241 d->insertUniquePair(step, pos.x(), &d->xPosition,
"setPosAt");
242 d->insertUniquePair(step, pos.y(), &d->yPosition,
"setPosAt");
246
247
248
249
250QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::posList()
const
252 QList<std::pair<qreal, QPointF>> list;
253 const int xPosCount = d->xPosition.size();
254 list.reserve(xPosCount);
255 for (
int i = 0; i < xPosCount; ++i)
256 list.emplace_back(d->xPosition.at(i).step,
257 QPointF(d->xPosition.at(i).value, d->yPosition.at(i).value));
263
264
265
266
267QTransform QGraphicsItemAnimation::transformAt(qreal step)
const
269 check_step_valid(step,
"transformAt");
271 QTransform transform;
272 if (!d->rotation.isEmpty())
273 transform.rotate(rotationAt(step));
274 if (!d->verticalScale.isEmpty())
275 transform.scale(horizontalScaleAt(step), verticalScaleAt(step));
276 if (!d->verticalShear.isEmpty())
277 transform.shear(horizontalShearAt(step), verticalShearAt(step));
278 if (!d->xTranslation.isEmpty())
279 transform.translate(xTranslationAt(step), yTranslationAt(step));
284
285
286
287
288qreal QGraphicsItemAnimation::rotationAt(qreal step)
const
290 check_step_valid(step,
"rotationAt");
291 return d->linearValueForStep(step, d->rotation);
295
296
297
298
299void QGraphicsItemAnimation::setRotationAt(qreal step, qreal angle)
301 d->insertUniquePair(step, angle, &d->rotation,
"setRotationAt");
305
306
307
308
309QList<std::pair<qreal, qreal> > QGraphicsItemAnimation::rotationList()
const
311 QList<std::pair<qreal, qreal>> list;
312 const int numRotations = d->rotation.size();
313 list.reserve(numRotations);
314 for (
int i = 0; i < numRotations; ++i)
315 list.emplace_back(d->rotation.at(i).step, d->rotation.at(i).value);
321
322
323
324
325qreal QGraphicsItemAnimation::xTranslationAt(qreal step)
const
327 check_step_valid(step,
"xTranslationAt");
328 return d->linearValueForStep(step, d->xTranslation);
332
333
334
335
336qreal QGraphicsItemAnimation::yTranslationAt(qreal step)
const
338 check_step_valid(step,
"yTranslationAt");
339 return d->linearValueForStep(step, d->yTranslation);
343
344
345
346
347
348void QGraphicsItemAnimation::setTranslationAt(qreal step, qreal dx, qreal dy)
350 d->insertUniquePair(step, dx, &d->xTranslation,
"setTranslationAt");
351 d->insertUniquePair(step, dy, &d->yTranslation,
"setTranslationAt");
355
356
357
358
359QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::translationList()
const
361 QList<std::pair<qreal, QPointF>> list;
362 const int numTranslations = d->xTranslation.size();
363 list.reserve(numTranslations);
364 for (
int i = 0; i < numTranslations; ++i)
365 list.emplace_back(d->xTranslation.at(i).step,
366 QPointF(d->xTranslation.at(i).value, d->yTranslation.at(i).value));
372
373
374
375
376qreal QGraphicsItemAnimation::verticalScaleAt(qreal step)
const
378 check_step_valid(step,
"verticalScaleAt");
380 return d->linearValueForStep(step, d->verticalScale, 1);
384
385
386
387
388qreal QGraphicsItemAnimation::horizontalScaleAt(qreal step)
const
390 check_step_valid(step,
"horizontalScaleAt");
391 return d->linearValueForStep(step, d->horizontalScale, 1);
395
396
397
398
399
400void QGraphicsItemAnimation::setScaleAt(qreal step, qreal sx, qreal sy)
402 d->insertUniquePair(step, sx, &d->horizontalScale,
"setScaleAt");
403 d->insertUniquePair(step, sy, &d->verticalScale,
"setScaleAt");
407
408
409
410
411QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::scaleList()
const
413 QList<std::pair<qreal, QPointF>> list;
414 const int numScales = d->horizontalScale.size();
415 list.reserve(numScales);
416 for (
int i = 0; i < numScales; ++i)
417 list.emplace_back(d->horizontalScale.at(i).step,
418 QPointF(d->horizontalScale.at(i).value,
419 d->verticalScale.at(i).value));
425
426
427
428
429qreal QGraphicsItemAnimation::verticalShearAt(qreal step)
const
431 check_step_valid(step,
"verticalShearAt");
432 return d->linearValueForStep(step, d->verticalShear, 0);
436
437
438
439
440qreal QGraphicsItemAnimation::horizontalShearAt(qreal step)
const
442 check_step_valid(step,
"horizontalShearAt");
443 return d->linearValueForStep(step, d->horizontalShear, 0);
447
448
449
450
451
452void QGraphicsItemAnimation::setShearAt(qreal step, qreal sh, qreal sv)
454 d->insertUniquePair(step, sh, &d->horizontalShear,
"setShearAt");
455 d->insertUniquePair(step, sv, &d->verticalShear,
"setShearAt");
459
460
461
462
463QList<std::pair<qreal, QPointF> > QGraphicsItemAnimation::shearList()
const
465 QList<std::pair<qreal, QPointF>> list;
466 const int numShears = d->horizontalShear.size();
467 list.reserve(numShears);
468 for (
int i = 0; i < numShears; ++i)
469 list.emplace_back(d->horizontalShear.at(i).step,
470 QPointF(d->horizontalShear.at(i).value,
471 d->verticalShear.at(i).value));
477
478
479
480void QGraphicsItemAnimation::clear()
482 d->xPosition.clear();
483 d->yPosition.clear();
485 d->verticalScale.clear();
486 d->horizontalScale.clear();
487 d->verticalShear.clear();
488 d->horizontalShear.clear();
489 d->xTranslation.clear();
490 d->yTranslation.clear();
494
495
496
497
498
499void QGraphicsItemAnimation::setStep(qreal step)
501 if (!check_step_valid(step,
"setStep"))
504 beforeAnimationStep(step);
508 if (!d->xPosition.isEmpty() || !d->yPosition.isEmpty())
509 d->item->setPos(posAt(step));
510 if (!d->rotation.isEmpty()
511 || !d->verticalScale.isEmpty()
512 || !d->horizontalScale.isEmpty()
513 || !d->verticalShear.isEmpty()
514 || !d->horizontalShear.isEmpty()
515 || !d->xTranslation.isEmpty()
516 || !d->yTranslation.isEmpty()) {
517 d->item->setTransform(d->startTransform * transformAt(step));
521 afterAnimationStep(step);
525
526
527
528
529
530
531
532void QGraphicsItemAnimation::beforeAnimationStep(qreal step)
538
539
540
541
542
543
544
545void QGraphicsItemAnimation::afterAnimationStep(qreal step)
552#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