From 2adcd4f24eca2fa529c42fc1165319bcc4ea179e Mon Sep 17 00:00:00 2001 From: Victor Tran Date: Thu, 12 Jul 2018 18:12:14 +1000 Subject: Initial commit --- installer/fadestackedwidget.cpp | 57 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 installer/fadestackedwidget.cpp (limited to 'installer/fadestackedwidget.cpp') diff --git a/installer/fadestackedwidget.cpp b/installer/fadestackedwidget.cpp new file mode 100644 index 0000000..e925c99 --- /dev/null +++ b/installer/fadestackedwidget.cpp @@ -0,0 +1,57 @@ +#include "fadestackedwidget.h" + +FadeStackedWidget::FadeStackedWidget(QWidget *parent) : QStackedWidget(parent) +{ + +} + +void FadeStackedWidget::setCurrentIndex(int index) { + //Do some checks before setting the current index. + if (currentIndex() != index) { + doSetCurrentIndex(index); + } +} + +void FadeStackedWidget::doSetCurrentIndex(int index) { + QWidget* currentWidget = widget(currentIndex()); + QWidget* nextWidget = widget(index); + if (nextWidget == nullptr) { + QStackedWidget::setCurrentIndex(index); + } else { + if (doingNewAnimation) { + anim->stop(); + anim->deleteLater(); + } + + doingNewAnimation = true; + QGraphicsOpacityEffect* currentOpacity = new QGraphicsOpacityEffect(); + QGraphicsOpacityEffect* nextOpacity = new QGraphicsOpacityEffect(); + currentWidget->setGraphicsEffect(currentOpacity); + nextWidget->setGraphicsEffect(nextOpacity); + + anim = new QVariantAnimation(); + anim->setStartValue((float) 1); + anim->setEndValue((float) 0); + anim->setDuration(500); + anim->setEasingCurve(QEasingCurve::InCubic); + connect(anim, &QVariantAnimation::finished, [=] { + if (anim->direction() == QVariantAnimation::Forward) { + anim->setDirection(QVariantAnimation::Backward); + QStackedWidget::setCurrentIndex(index); + anim->start(); + } else { + doingNewAnimation = false; + anim->deleteLater(); + anim = nullptr; + } + }); + connect(anim, &QVariantAnimation::valueChanged, [=](QVariant value) { + if (anim->direction() == QVariantAnimation::Forward) { + currentOpacity->setOpacity(value.toFloat()); + } else { + nextOpacity->setOpacity(value.toFloat()); + } + }); + anim->start(); + } +} -- cgit v1.2.3