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"