76 qreal easingValue =
boundaryRule->easing.valueForProgress(progress);
77 qreal delta = qAbs(fromValue - toValue) * easingValue;
78 qreal value = (fromValue > toValue ? toValue + delta : toValue - delta);
79 qCDebug(lcBR) << t <<
"ms" << qRound(progress * 100) <<
"% easing" << easingValue <<
"->" << value;
80 QQmlPropertyPrivate::write(boundaryRule->property, value,
81 QQmlPropertyData::BypassInterceptor | QQmlPropertyData::DontRemoveBinding);
196void QQuickBoundaryRule::setMinimumOvershoot(qreal minimumOvershoot)
198 Q_D(QQuickBoundaryRule);
199 if (qFuzzyCompare(d->minimumOvershoot, minimumOvershoot))
201 d->minimumOvershoot = minimumOvershoot;
202 emit minimumOvershootChanged();
246void QQuickBoundaryRule::setMaximumOvershoot(qreal maximumOvershoot)
248 Q_D(QQuickBoundaryRule);
249 if (qFuzzyCompare(d->maximumOvershoot, maximumOvershoot))
251 d->maximumOvershoot = maximumOvershoot;
252 emit maximumOvershootChanged();
278void QQuickBoundaryRule::setOvershootScale(qreal overshootScale)
280 Q_D(QQuickBoundaryRule);
281 if (qFuzzyCompare(d->overshootScale, overshootScale))
283 d->overshootScale = overshootScale;
284 emit overshootScaleChanged();
359bool QQuickBoundaryRule::returnToBounds()
361 Q_D(QQuickBoundaryRule);
362 if (d->returnAnimationJob) {
363 qCDebug(lcBR) <<
"animation already in progress";
366 if (currentOvershoot() > 0) {
367 if (d->returnDuration > 0)
368 d->returnAnimationJob =
new QQuickBoundaryReturnJob(d, maximum());
371 }
else if (currentOvershoot() < 0) {
372 if (d->returnDuration > 0)
373 d->returnAnimationJob =
new QQuickBoundaryReturnJob(d, minimum());
379 if (d->returnAnimationJob) {
380 qCDebug(lcBR) << d->property.name() <<
"on" << d->property.object()
381 <<
": animating from" << d->returnAnimationJob->fromValue <<
"to" << d->returnAnimationJob->toValue;
382 d->returnAnimationJob->start();
385 qCDebug(lcBR) << d->property.name() <<
"on" << d->property.object() <<
": returned to" << d->property.read();
386 emit returnedToBounds();
462void QQuickBoundaryRule::write(
const QVariant &value)
464 bool conversionOk =
false;
465 qreal rValue = value.toReal(&conversionOk);
467 qWarning() <<
"BoundaryRule doesn't work with non-numeric values:" << value;
470 Q_D(QQuickBoundaryRule);
471 bool bypass = !d->enabled || !d->completed || QQmlEnginePrivate::designerMode();
473 QQmlPropertyPrivate::write(d->property, value,
474 QQmlPropertyData::BypassInterceptor | QQmlPropertyData::DontRemoveBinding);
478 d->targetValue = d->easedOvershoot(rValue);
479 QQmlPropertyPrivate::write(d->property, d->targetValue,
480 QQmlPropertyData::BypassInterceptor | QQmlPropertyData::DontRemoveBinding);
498 Q_Q(QQuickBoundaryRule);
499 if (value > maximum) {
500 qreal overshootWas = currentOvershoot;
501 currentOvershoot = value - maximum;
502 if (!qFuzzyCompare(overshootWas, currentOvershoot))
503 emit q->currentOvershootChanged();
504 overshootWas = peakOvershoot;
505 peakOvershoot = qMax(currentOvershoot, peakOvershoot);
506 if (!qFuzzyCompare(overshootWas, peakOvershoot))
507 emit q->peakOvershootChanged();
508 ret = maximum + maximumOvershoot * easing.valueForProgress(
509 (overshootFilter == QQuickBoundaryRule::OvershootFilter::Peak ? peakOvershoot : currentOvershoot)
510 * overshootScale / maximumOvershoot);
511 qCDebug(lcBR).nospace() << value <<
" overshoots maximum " << maximum <<
" by "
512 << currentOvershoot <<
" (peak " << peakOvershoot <<
"): eased to " << ret;
513 }
else if (value < minimum) {
514 qreal overshootWas = currentOvershoot;
515 currentOvershoot = value - minimum;
516 if (!qFuzzyCompare(overshootWas, currentOvershoot))
517 emit q->currentOvershootChanged();
518 overshootWas = peakOvershoot;
519 peakOvershoot = qMin(currentOvershoot, peakOvershoot);
520 if (!qFuzzyCompare(overshootWas, peakOvershoot))
521 emit q->peakOvershootChanged();
522 ret = minimum - minimumOvershoot * easing.valueForProgress(
523 -(overshootFilter == QQuickBoundaryRule::OvershootFilter::Peak ? peakOvershoot : currentOvershoot)
524 * overshootScale / minimumOvershoot);
525 qCDebug(lcBR).nospace() << value <<
" overshoots minimum " << minimum <<
" by "
526 << currentOvershoot <<
" (peak " << peakOvershoot <<
"): eased to " << ret;