File indexing completed on 2024-04-21 03:57:51

0001 /*
0002     SPDX-FileCopyrightText: 2013 Dominik Haumann <dhaumann@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "katefadeeffect.h"
0008 
0009 #include <QGraphicsOpacityEffect>
0010 #include <QTimeLine>
0011 #include <QWidget>
0012 
0013 KateFadeEffect::KateFadeEffect(QWidget *widget)
0014     : QObject(widget)
0015     , m_widget(widget)
0016     , m_effect(nullptr) // effect only exists during fading animation
0017 {
0018     m_timeLine = new QTimeLine(500, this);
0019     m_timeLine->setUpdateInterval(40);
0020 
0021     connect(m_timeLine, &QTimeLine::valueChanged, this, &KateFadeEffect::opacityChanged);
0022     connect(m_timeLine, &QTimeLine::finished, this, &KateFadeEffect::animationFinished);
0023 }
0024 
0025 bool KateFadeEffect::isHideAnimationRunning() const
0026 {
0027     return (m_timeLine->direction() == QTimeLine::Backward) && (m_timeLine->state() == QTimeLine::Running);
0028 }
0029 
0030 bool KateFadeEffect::isShowAnimationRunning() const
0031 {
0032     return (m_timeLine->direction() == QTimeLine::Forward) && (m_timeLine->state() == QTimeLine::Running);
0033 }
0034 
0035 void KateFadeEffect::fadeIn()
0036 {
0037     // stop time line if still running
0038     if (m_timeLine->state() == QTimeLine::Running) {
0039         QTimeLine::Direction direction = m_timeLine->direction();
0040         m_timeLine->stop();
0041         if (direction == QTimeLine::Backward) {
0042             // fadeOut animation interrupted
0043             Q_EMIT hideAnimationFinished();
0044         }
0045     }
0046 
0047     // assign new graphics effect, old one is deleted in setGraphicsEffect()
0048     m_effect = new QGraphicsOpacityEffect(this);
0049     m_effect->setOpacity(0.0);
0050     m_widget->setGraphicsEffect(m_effect);
0051 
0052     // show widget and start fade in animation
0053     m_widget->show();
0054     m_timeLine->setDirection(QTimeLine::Forward);
0055     m_timeLine->start();
0056 }
0057 
0058 void KateFadeEffect::fadeOut()
0059 {
0060     // stop time line if still running
0061     if (m_timeLine->state() == QTimeLine::Running) {
0062         QTimeLine::Direction direction = m_timeLine->direction();
0063         m_timeLine->stop();
0064         if (direction == QTimeLine::Forward) {
0065             // fadeIn animation interrupted
0066             Q_EMIT showAnimationFinished();
0067         }
0068     }
0069 
0070     // assign new graphics effect, old one is deleted in setGraphicsEffect()
0071     m_effect = new QGraphicsOpacityEffect(this);
0072     m_effect->setOpacity(1.0);
0073     m_widget->setGraphicsEffect(m_effect);
0074 
0075     // start fade out animation
0076     m_timeLine->setDirection(QTimeLine::Backward);
0077     m_timeLine->start();
0078 }
0079 
0080 void KateFadeEffect::opacityChanged(qreal value)
0081 {
0082     Q_ASSERT(m_effect);
0083     m_effect->setOpacity(value);
0084 }
0085 
0086 void KateFadeEffect::animationFinished()
0087 {
0088     // fading finished: remove graphics effect, deletes the effect as well
0089     m_widget->setGraphicsEffect(nullptr);
0090     Q_ASSERT(!m_effect);
0091 
0092     if (m_timeLine->direction() == QTimeLine::Backward) {
0093         m_widget->hide();
0094         Q_EMIT hideAnimationFinished();
0095     } else {
0096         Q_EMIT showAnimationFinished();
0097     }
0098 }
0099 
0100 #include "moc_katefadeeffect.cpp"