TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musictransitionanimationlabel.cpp
Go to the documentation of this file.
2 #include "ttktime.h"
3 
5 
6 #include <QPainter>
7 #include <QPropertyAnimation>
8 
10  : QLabel(parent),
11  m_type(Module::FadeEffect),
12  m_isAnimating(false),
13  m_currentValue(0),
14  m_animationEnabled(true),
15  m_imageRender(nullptr)
16 {
18 
19  m_animation = new QPropertyAnimation(this, {});
20  m_animation->setDuration(200);
21  m_animation->setEasingCurve(QEasingCurve::Linear);
22  m_animation->setStartValue(0);
23  m_animation->setEndValue(101);
24 
25  connect(m_animation, SIGNAL(valueChanged(QVariant)), SLOT(valueChanged(QVariant)));
26  connect(m_animation, SIGNAL(finished()), SLOT(animationFinished()));
27 }
28 
30 {
31  delete m_animation;
32  delete m_imageRender;
33 }
34 
36 {
37  return m_renderPixmap;
38 }
39 
41 {
42  stop();
43  m_isAnimating = true;
44  m_animation->start();
45 }
46 
48 {
49  if(isRunning())
50  {
51  m_animation->stop();
53  }
54 }
55 
57 {
58  return m_animation->state() == QPropertyAnimation::Running;
59 }
60 
62 {
63  if(pix.isNull())
64  {
65  return;
66  }
67 
68  const QPixmap &pixmap = QtLablePixmap(this);
69  if(!m_animationEnabled || pixmap.isNull())
70  {
71  m_renderPixmap = pix;
72  QLabel::setPixmap(pix);
73  return;
74  }
75 
76  stop();
77 
78  m_previousPixmap = pixmap;
79  m_currentPixmap = pix;
80  m_isAnimating = true;
82 
83  switch(m_type)
84  {
85  case Module::FadeEffect:
86  {
87  m_animation->setDuration(500);
88  break;
89  }
91  {
92  m_animation->setDuration(500);
93  break;
94  }
95  case Module::CubeEffect:
96  {
97  delete m_imageRender;
99  m_imageRender->input(rect());
100  m_animation->setDuration(1000);
101  break;
102  }
103  case Module::WaterEffect:
104  {
105  delete m_imageRender;
106  m_imageRender = new QAlgorithm::WaterWave(m_currentPixmap.toImage(), height() / 6);
107  m_imageRender->input(rect());
108  m_animation->setDuration(1000);
109  break;
110  }
112  {
113  m_animation->setDuration(250);
114  break;
115  }
117  {
118  m_animation->setDuration(250);
119  break;
120  }
121  default: break;
122  }
123 
124  m_animation->start();
125 }
126 
128 {
129  m_currentValue = value.toFloat();
130  update();
131 }
132 
134 {
135  m_currentValue = 0;
136  m_isAnimating = false;
138 
139  QLabel::setPixmap(m_renderPixmap);
140 }
141 
143 {
144  if(m_isAnimating)
145  {
146  QPainter painter(this);
147  painter.setRenderHint(QPainter::SmoothPixmapTransform);
148 
149  switch(m_type)
150  {
151  case Module::FadeEffect:
152  {
153  painter.drawPixmap(rect(), m_previousPixmap);
154 
155  QPixmap pix(size());
156  pix.fill(Qt::transparent);
157  QPainter painter(&pix);
158  painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
159  painter.fillRect(rect(), QColor(0xFF, 0xFF, 0xFF, 2.55 * m_currentValue));
160  painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
161  painter.drawPixmap(rect(), m_currentPixmap);
162  m_renderPixmap = pix;
163  break;
164  }
166  {
167  QPixmap pix(m_previousPixmap);
168  QPainter painter(&pix);
169  painter.setRenderHint(QPainter::SmoothPixmapTransform);
170  painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
171  constexpr int number = 10;
172  const int perHeight = height() / number;
173  for(int i = 0; i < number; ++i)
174  {
175  const QRect rect(0, perHeight * i, width(), perHeight * m_currentValue / 100.0);
176  painter.drawPixmap(rect, m_currentPixmap.copy(rect));
177  }
178  m_renderPixmap = pix;
179  break;
180  }
181  case Module::CubeEffect:
182  {
183  painter.drawPixmap(rect(), m_previousPixmap);
185  break;
186  }
187  case Module::WaterEffect:
188  {
189  painter.drawPixmap(rect(), m_previousPixmap);
191  break;
192  }
194  {
195  QPixmap pix(m_previousPixmap);
196  QPainter painter(&pix);
197  painter.setRenderHint(QPainter::SmoothPixmapTransform);
198  painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
199  const QRect rect(0, 0, width() * m_currentValue / 100.0, height());
200  painter.drawPixmap(rect, m_currentPixmap.copy(rect));
201  m_renderPixmap = pix;
202  break;
203  }
205  {
206  QPixmap pix(m_previousPixmap);
207  QPainter painter(&pix);
208  painter.setRenderHint(QPainter::SmoothPixmapTransform);
209  painter.setCompositionMode(QPainter::CompositionMode_SourceIn);
210  const QRect rect(0, 0, width(), height() * m_currentValue / 100.0);
211  painter.drawPixmap(rect, m_currentPixmap.copy(rect));
212  m_renderPixmap = pix;
213  break;
214  }
215  default: break;
216  }
217 
218  painter.drawPixmap(rect(), m_renderPixmap);
219  }
220  else
221  {
222  QLabel::paintEvent(event);
223  }
224 }
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:231
const QPixmap & renderPixmap() const noexcept
The class of the water wave.
Definition: imagewrapper.h:111
voidpf void uLong size
Definition: ioapi.h:136
TTK_MODULE_EXPORT void initRandom()
Definition: ttktime.cpp:7
virtual void paintEvent(QPaintEvent *event) overridefinal
TTK_MODULE_EXPORT int random(int value=RAND_MAX)
Definition: ttktime.cpp:14
virtual void input(const QRect &region)
The class of the cube wave.
Definition: imagewrapper.h:88
MusicTransitionAnimationLabel(QWidget *parent=nullptr)
#define const
Definition: zconf.h:233
virtual QPixmap render(const QPixmap &pixmap, int value)=0
#define QtLablePixmap(p)
Lable pixmap.
Definition: ttkqtcompat.h:136