aboutsummaryrefslogtreecommitdiff
path: root/src/screenslidetimer.cpp
blob: 2bfd0cd57591ef841ede76059908070364f47694 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
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