diff options
Diffstat (limited to 'src/screenslidetimer.cpp')
| -rw-r--r-- | src/screenslidetimer.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/screenslidetimer.cpp b/src/screenslidetimer.cpp new file mode 100644 index 00000000..2bfd0cd5 --- /dev/null +++ b/src/screenslidetimer.cpp @@ -0,0 +1,86 @@ +#include "screenslidetimer.h" + +#include <QDebug> + +namespace kal +{ +ScreenSlideTimer::ScreenSlideTimer(QObject *parent) + : QObject(parent) +{ + m_pause = new QTimer(this); + m_pause->setInterval(TRANSITION_BOOKEND_DELAY); + m_pause->setSingleShot(true); + + m_group = new QParallelAnimationGroup(this); + + connect(m_pause, &QTimer::timeout, this, &ScreenSlideTimer::startNextState); + connect(m_group, &QParallelAnimationGroup::finished, this, &ScreenSlideTimer::startNextState); +} + +ScreenSlideTimer::~ScreenSlideTimer() +{ + m_group->disconnect(this); + m_pause->disconnect(this); + stop(); +} + +void ScreenSlideTimer::addAnimation(QAbstractAnimation *animation) +{ + if (m_running) + { + qWarning() << "Cannot add animations while transition is in progress"; + return; + } + m_group->addAnimation(animation); +} + +void ScreenSlideTimer::start() +{ + if (m_running) + { + qWarning() << "Transition already in progress"; + return; + } + m_running = true; + startNextState(); +} + +void ScreenSlideTimer::stop() +{ + if (m_running) + { + m_running = false; + m_state = NoTransition; + m_group->stop(); + m_group->clear(); + m_pause->stop(); + } +} + +void ScreenSlideTimer::startNextState() +{ + switch (m_state) + { + case NoTransition: + m_state = PreTransition; + Q_EMIT started(); + m_pause->start(); + return; + + case PreTransition: + m_state = GroupTransition; + m_group->start(); + break; + + case GroupTransition: + m_state = PostTransition; + m_pause->start(); + break; + + case PostTransition: + stop(); + Q_EMIT finished(); + break; + } +} +} // namespace kal |
