TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicscreensaverwidget.cpp
Go to the documentation of this file.
5 #include "musicimageutils.h"
6 #include "musicwidgetutils.h"
7 #include "ttkdesktopscreen.h"
8 #include "ttkglobalinterface.h"
9 
10 #include "qsync/qsyncutils.h"
11 
12 #define SS_ITEM_SIZE QSize(165, 110)
13 
14 static constexpr int SS_COUNT = 10;
15 static constexpr int LINE_SPACING_SIZE = 160;
16 
17 static constexpr const char *SS_SCREEN_DIR = "Screen/";
18 static constexpr const char *SS_SCREENSAVER_URL = "ScreenSaver/";
19 static constexpr const char *SS_WALLPAPER_NAME = "wallpaper.png";
20 static constexpr const char *SS_WALLBAR_NAME = "wallbar.png";
21 static constexpr const char *SS_WALLNAIL_NAME = "thumbnail.png";
22 
24  : QLabel(parent),
25  m_index(-1),
26  m_parent(parent)
27 {
28  setFixedSize(SS_ITEM_SIZE + QSize(8, 8));
29  setAttribute(Qt::WA_TranslucentBackground);
30  setStyleSheet(TTK::UI::BackgroundStyle01);
31 
32  hide();
33 
34  m_enableButton = new QPushButton(this);
35  m_enableButton->setCursor(Qt::PointingHandCursor);
37  m_enableButton->setGeometry((width() - 38) / 2, (height() - 38) / 2, 38, 38);
38 #ifdef Q_OS_UNIX
39  m_enableButton->setFocusPolicy(Qt::NoFocus);
40 #endif
41  connect(m_enableButton, SIGNAL(clicked()), SLOT(switchButtonState()));
42 }
43 
44 void MusicScreenSaverHoverItem::setFilePath(const QString &path)
45 {
46  m_path = path;
47  const QPixmap pix(m_path);
48  m_parent->setPixmap(pix);
49  setPixmap(pix);
50 }
51 
52 void MusicScreenSaverHoverItem::setStatus(int index, bool status)
53 {
54  m_index = index;
55  if(!status)
56  {
58  }
59 }
60 
61 void MusicScreenSaverHoverItem::display(const QPoint &point)
62 {
63  move(point - rect().center());
64  show();
65 }
66 
68 {
69  if(m_enableButton->styleSheet() == TTK::UI::ScreenItemDisable)
70  {
71  const QPixmap pix(TTK::Image::grayScalePixmap(QPixmap(m_path), 70));
72  m_parent->setPixmap(pix);
73  setPixmap(pix);
75  Q_EMIT itemClicked(m_index, false);
76  }
77  else
78  {
79  const QPixmap pix(m_path);
80  m_parent->setPixmap(pix);
81  setPixmap(pix);
83  Q_EMIT itemClicked(m_index, true);
84  }
85 }
86 
88 {
89  QLabel::leaveEvent(event);
90  hide();
91 }
92 
94 {
95  QLabel::focusOutEvent(event);
96  hide();
97 }
98 
99 void MusicScreenSaverHoverItem::paintEvent(QPaintEvent *event)
100 {
101  QWidget::paintEvent(event);
102  QPainter painter(this);
103  painter.setRenderHint(QPainter::SmoothPixmapTransform);
104  TTK::setBorderShadow(this, &painter);
105 
106  const QPixmap &pixmap = QtLablePixmap(this);
107  painter.drawPixmap(QRect(QPoint(4, 4), SS_ITEM_SIZE), pixmap.scaled(SS_ITEM_SIZE));
108 }
109 
110 
111 
112 MusicScreenSaverListItem::MusicScreenSaverListItem(QObject *object, QWidget *parent)
113  : QLabel(parent)
114 {
115  setFixedSize(155, 100);
116 
118  m_hoverItem->setParent(parent);
119  connect(m_hoverItem, SIGNAL(itemClicked(int,bool)), object, SLOT(currentItemClicked(int,bool)));
120 }
121 
123 {
124  delete m_hoverItem;
125 }
126 
127 void MusicScreenSaverListItem::setFilePath(const QString &path)
128 {
129  m_hoverItem->setFilePath(path);
130 }
131 
132 void MusicScreenSaverListItem::setStatus(int index, bool status)
133 {
134  m_hoverItem->setStatus(index, status);
135 }
136 
138 {
139  if(v)
140  {
141  m_hoverItem->display(mapToParent(rect().center()));
142  }
143  else
144  {
145  m_hoverItem->hide();
146  }
147 }
148 
150 {
151  QLabel::enterEvent(event);
152  setHoverVisible(true);
153 }
154 
155 
156 
158  : QWidget(parent)
159 {
160  m_gridLayout = new QGridLayout(this);
161  m_gridLayout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
162  m_gridLayout->setContentsMargins(7, 7, 7, 7);
163  setLayout(m_gridLayout);
164 }
165 
167 {
168  qDeleteAll(m_items);
169 }
170 
171 void MusicScreenSaverListWidget::addCellItem(QObject *object, const QString &path, int index, bool status)
172 {
173  MusicScreenSaverListItem *item = new MusicScreenSaverListItem(object, this);
174  item->setFilePath(path);
175  item->setStatus(index, status);
176 
177  m_gridLayout->addWidget(item, m_items.count() / 4, m_items.count() % 4);
178  m_items << item;
179 }
180 
182 {
184  {
185  item->setHoverVisible(false);
186  m_gridLayout->removeWidget(item);
187  }
188 
189  const int lineNumber = width() / LINE_SPACING_SIZE;
190  for(int i = 0; i < m_items.count(); ++i)
191  {
192  m_gridLayout->addWidget(m_items[i], i / lineNumber, i % lineNumber);
193  }
194 }
195 
197 {
198  QWidget::resizeEvent(event);
199  resizeGeometry();
200 }
201 
202 
203 
205  : QWidget(parent),
206  m_currentState(false)
207 {
209 
210  QVBoxLayout *layout = new QVBoxLayout(this);
211  layout->setSpacing(0);
212  layout->setContentsMargins(0, 0, 0, 0);
213 
214  QWidget *mainWidget = new QWidget(this);
215  QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
216  mainLayout->setSpacing(0);
217  mainLayout->setContentsMargins(0, 0, 0, 0);
218  mainWidget->setLayout(mainLayout);
219  layout->addWidget(mainWidget);
220  setLayout(layout);
221  //
222  QWidget *topWidget = new QWidget(mainWidget);
223  topWidget->setFixedHeight(60);
224  QHBoxLayout *topWidgetLayout = new QHBoxLayout(topWidget);
225  topWidgetLayout->setContentsMargins(15, 10, 20, 10);
226 
227  QLabel *pLabel = new QLabel(tr("Screen Saver"), topWidget);
228  QFont pLabelFont = pLabel->font();
229  pLabelFont.setPixelSize(20);
230  pLabel->setFont(pLabelFont);
231  pLabel->setStyleSheet(TTK::UI::ColorStyle01);
232 
233  QLabel *iLabel = new QLabel(tr("Popular singers spend your leisure time with you"), topWidget);
234  QFont iLabelFont = iLabel->font();
235  iLabelFont.setPixelSize(15);
236  iLabel->setFont(iLabelFont);
237  iLabel->setStyleSheet(TTK::UI::ColorStyle03);
238 
239  QLabel *wLabel = new QLabel(tr("Wait"), topWidget);
240  QLabel *mLabel = new QLabel(tr("Min"), topWidget);
241 
242  m_inputEdit = new QLineEdit(topWidget);
243  m_inputEdit->setFixedWidth(50);
244  m_inputEdit->setEnabled(false);
245  m_inputEdit->setAlignment(Qt::AlignCenter);
246  m_inputEdit->setStyleSheet(TTK::UI::LineEditStyle01);
247 
248  m_caseButton = new QPushButton(topWidget);
249  m_caseButton->setFixedSize(44, 20);
250  m_caseButton->setCursor(Qt::PointingHandCursor);
251  m_caseButton->setStyleSheet(TTK::UI::ScreenSaverOff);
252 #ifdef Q_OS_UNIX
253  m_caseButton->setFocusPolicy(Qt::NoFocus);
254 #endif
255 
256  topWidgetLayout->addWidget(pLabel);
257  topWidgetLayout->addWidget(iLabel);
258  topWidgetLayout->addStretch(1);
259  topWidgetLayout->addWidget(wLabel);
260  topWidgetLayout->addWidget(m_inputEdit);
261  topWidgetLayout->addWidget(mLabel);
262  topWidgetLayout->addWidget(m_caseButton);
263  topWidget->setLayout(topWidgetLayout);
264  mainLayout->addWidget(topWidget);
265  //
266  QFrame *frame = new QFrame(mainWidget);
267  frame->setFixedHeight(1);
268  frame->setFrameShape(QFrame::HLine);
269  frame->setFrameShadow(QFrame::Plain);
270  frame->setStyleSheet(TTK::UI::ColorStyle05);
271  mainLayout->addWidget(frame);
272  //
273  QWidget *functionWidget = new QWidget(mainWidget);
274  QHBoxLayout *functionWidgetLayout = new QHBoxLayout(functionWidget);
275  functionWidgetLayout->setContentsMargins(10, 10, 10, 10);
276  functionWidget->setLayout(functionWidgetLayout);
277  mainLayout->addWidget(functionWidget);
278 
279  m_backgroundList = new MusicScreenSaverListWidget(functionWidget);
280  functionWidgetLayout->addWidget(m_backgroundList);
281 
282  connect(m_inputEdit, SIGNAL(textChanged(QString)), SLOT(inputDataChanged()));
283  connect(m_caseButton, SIGNAL(clicked()), SLOT(switchButtonState()));
284 
285  initialize();
286  applyParameter();
287 }
288 
290 {
292  const int value = G_SETTING_PTR->value(MusicSettingManager::OtherScreenSaverTime).toInt();
293 
294  m_inputEdit->setText(QString::number(value));
295  if(state != m_currentState)
296  {
298  }
299 }
300 
302 {
303  QVector<bool> statusVector;
304  statusVector.fill(true, SS_COUNT);
305 
306  const QString &value = G_SETTING_PTR->value(MusicSettingManager::OtherScreenSaverIndex).toString();
307  const QStringList items(value.split(";"));
308 
309  for(const QString &item : qAsConst(items))
310  {
311  const QStringList itemStatus(item.split(","));
312  if(itemStatus.count() == 2)
313  {
314  const int index = itemStatus[0].toInt();
315  const bool status = itemStatus[1].toInt();
316  statusVector[index] = status;
317  }
318  }
319  return statusVector;
320 }
321 
323 {
325 }
326 
328 {
330  if(state)
331  {
334  }
335 }
336 
338 {
339  if(m_currentState)
340  {
341  m_currentState = false;
342  m_caseButton->setStyleSheet(TTK::UI::ScreenSaverOff);
343  }
344  else
345  {
346  m_currentState = true;
347  m_caseButton->setStyleSheet(TTK::UI::ScreenSaverOn);
349  }
350 
351  m_inputEdit->setEnabled(m_currentState);
354 }
355 
357 {
358  QVector<bool> statusVector(parseSettingParameter());
359  if(bytes.contains(SS_WALLNAIL_NAME))
360  {
361  const int index = TTK::String::splitToken(bytes, SS_SCREEN_DIR, TTK_SEPARATOR).toInt();
362  if(index < 0 || index >= statusVector.count())
363  {
364  return;
365  }
366 
367  m_backgroundList->addCellItem(this, bytes, index, statusVector[index]);
368  }
369 }
370 
371 void MusicScreenSaverWidget::currentItemClicked(int index, bool status)
372 {
373  QVector<bool> statusVector(parseSettingParameter());
374  statusVector[index] = status;
375 
376  QStringList items;
377  for(int i = 0; i < statusVector.count(); ++i)
378  {
379  items << QString("%1,%2").arg(i).arg(statusVector[i]);
380  }
381 
382  G_SETTING_PTR->setValue(MusicSettingManager::OtherScreenSaverIndex, items.join(";"));
384 }
385 
387 {
389  connect(m_networkRequest, SIGNAL(downloadDataChanged(QString)), SLOT(downloadDataFinished(QString)));
390 
391  MusicDownloadQueueDataList datas;
392  for(int index = 0; index < SS_COUNT; ++index)
393  {
394  const QString &url = QSyncUtils::makeDataBucketUrl() + QString("%1%2/").arg(SS_SCREENSAVER_URL).arg(index);
395  const QString &prefix = QString("%1%2%3/").arg(APPCACHE_DIR_FULL, SS_SCREEN_DIR).arg(index);
396  QDir().mkpath(prefix);
397 
398  MusicDownloadQueueData wallData;
399  wallData.m_url = url + SS_WALLPAPER_NAME;
400  wallData.m_path = prefix + SS_WALLPAPER_NAME;
401  datas << wallData;
402 
403  MusicDownloadQueueData barData;
404  barData.m_url = url + SS_WALLBAR_NAME;
405  barData.m_path = prefix + SS_WALLBAR_NAME;
406  datas << barData;
407 
408  MusicDownloadQueueData nailData;
409  nailData.m_url = url + SS_WALLNAIL_NAME;
410  nailData.m_path = prefix + SS_WALLNAIL_NAME;
411  datas << nailData;
412  }
413 
414  m_networkRequest->addQueue(datas);
416 }
417 
418 
419 
422  m_state(false),
423  m_isRunning(false)
424 {
425  setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
426 
427  m_runningTimer = new QTimer(this);
428  connect(m_runningTimer, SIGNAL(timeout()), SLOT(runningTimeout()));
429 
430  m_backgroundTimer = new QTimer(this);
431  m_backgroundTimer->setInterval(15 * TTK_DN_S2MS);
432  connect(m_backgroundTimer, SIGNAL(timeout()), SLOT(backgroundTimeout()));
433 
434  hide();
435  qApp->installEventFilter(this);
436 }
437 
439 {
440  if(m_runningTimer->isActive())
441  {
442  m_runningTimer->stop();
443  }
444  delete m_runningTimer;
445 
446  if(m_backgroundTimer->isActive())
447  {
448  m_backgroundTimer->stop();
449  }
450  delete m_backgroundTimer;
451 }
452 
454 {
455  if(m_runningTimer->isActive())
456  {
457  m_runningTimer->stop();
458  m_backgroundTimer->stop();
459  }
460 
462  const int value = G_SETTING_PTR->value(MusicSettingManager::OtherScreenSaverTime).toInt();
463  m_state = (m_state && (value > 0));
464 
465  if(m_state)
466  {
467  m_runningTimer->setInterval(value * TTK_DN_M2MS);
468  m_runningTimer->start();
469  }
470 }
471 
473 {
474  if(!m_isRunning)
475  {
476  m_isRunning = true;
477  setGeometry(TTKDesktopScreen::currentGeometry());
478  setParent(nullptr);
479  showFullScreen();
480 
482  m_backgroundTimer->start();
483  }
484 }
485 
487 {
488  QVector<bool> statusVector(MusicScreenSaverWidget::parseSettingParameter());
489  QVector<int> intVector;
490  for(int index = 0; index < SS_COUNT; ++index)
491  {
492  if(statusVector[index])
493  {
494  intVector << index;
495  }
496  }
497 
498  if(!intVector.isEmpty())
499  {
500  const int index = intVector[TTK::random(intVector.count())];
501  const QString &prefix = QString("%1%2%3/").arg(APPCACHE_DIR_FULL, SS_SCREEN_DIR).arg(index);
502 
503  QPixmap background(prefix + SS_WALLPAPER_NAME);
504  const QPixmap bar(prefix + SS_WALLBAR_NAME);
505  TTK::Image::fusionPixmap(background, bar, QPoint(100, 900));
506  setPixmap(QPixmap(background.scaled(size())));
507  }
508 }
509 
510 bool MusicScreenSaverBackgroundWidget::eventFilter(QObject *watched, QEvent *event)
511 {
512  if(event->type()== QEvent::MouseButtonPress || event->type()== QEvent::MouseButtonRelease ||
513  event->type()== QEvent::MouseButtonDblClick || event->type()== QEvent::MouseMove ||
514  event->type()== QEvent::KeyPress || event->type()== QEvent::KeyRelease)
515  {
516  if(m_state)
517  {
518  if(m_isRunning)
519  {
520  m_isRunning = false;
521  hide();
522  }
523  m_runningTimer->start();
524  }
525  else
526  {
527  m_runningTimer->stop();
528  m_backgroundTimer->stop();
529  }
530  }
531  return MusicTransitionAnimationLabel::eventFilter(watched, event);
532 }
#define QtEnterEvent
Event enter.
Definition: ttkqtcompat.h:178
The class of the screen saver list item.
void currentItemClicked(int index, bool status)
void setStatus(int index, bool status)
MusicScreenSaverHoverItem * m_hoverItem
MusicScreenSaverListWidget(QWidget *parent=nullptr)
static constexpr const char * SS_WALLNAIL_NAME
static constexpr const char * SS_SCREENSAVER_URL
The class of the screen saver list widget.
virtual void leaveEvent(QEvent *event) overridefinal
virtual void paintEvent(QPaintEvent *event) overridefinal
voidpf void uLong size
Definition: ioapi.h:136
void setStatus(int index, bool status)
void addQueue(const MusicDownloadQueueDataList &datas) noexcept
TTK_MODULE_EXPORT void setBorderShadow(QWidget *widget, QPainter *painter)
#define TTK_DN_M2MS
Definition: ttkglobal.h:361
MusicScreenSaverWidget(QWidget *parent=nullptr)
TTK_MODULE_EXPORT QPixmap grayScalePixmap(const QPixmap &input, int radius=0)
void downloadDataFinished(const QString &bytes)
The class of the download data from queue request.
static const QString ColorStyle05
Definition: musicuiobject.h:49
MusicScreenSaverListWidget * m_backgroundList
TTK_MODULE_EXPORT int random(int value=RAND_MAX)
Definition: ttktime.cpp:14
static constexpr const char * SS_WALLBAR_NAME
virtual void focusOutEvent(QFocusEvent *event) overridefinal
static const QString ColorStyle01
Color.
Definition: musicuiobject.h:37
#define APPCACHE_DIR_FULL
Definition: musicobject.h:140
#define qAsConst
Definition: ttkqtglobal.h:57
static QRect currentGeometry()
static const QString ColorStyle02
Definition: musicuiobject.h:40
The class of the label transition animation.
MusicDownloadQueueRequest * m_networkRequest
virtual void resizeGeometry() overridefinal
QList< MusicScreenSaverListItem * > m_items
static constexpr const char * ScreenItemEnable
static const QString BackgroundStyle01
Background.
Definition: musicuiobject.h:77
#define TTK_SEPARATOR
Definition: ttkglobal.h:269
static constexpr const char * ScreenSaverOff
virtual void startToRequest() overridefinal
static constexpr int LINE_SPACING_SIZE
static constexpr const char * SS_SCREEN_DIR
TTK_MODULE_EXPORT QString splitToken(const QString &name)
static const QString BackgroundStyle10
The class of the download queue data.
void itemClicked(int index, bool status)
static const QString ColorStyle03
Definition: musicuiobject.h:43
static constexpr int SS_COUNT
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
void setFilePath(const QString &path)
static const QString LineEditStyle01
LineEdit.
MusicScreenSaverHoverItem(QLabel *parent=nullptr)
static constexpr const char * ScreenSaverOn
static QVector< bool > parseSettingParameter()
void display(const QPoint &point)
void setFilePath(const QString &path)
static MusicApplicationModule * instance()
virtual void resizeEvent(QResizeEvent *event) overridefinal
virtual void enterEvent(QtEnterEvent *event) overridefinal
MusicScreenSaverBackgroundWidget(QWidget *parent=nullptr)
MusicScreenSaverListItem(QObject *object, QWidget *parent=nullptr)
virtual bool eventFilter(QObject *watched, QEvent *event) overridefinal
static constexpr const char * ScreenItemDisable
QString m_path
download url/
The class of the screen saver hover item.
void addCellItem(QObject *object, const QString &path, int index, bool status)
static constexpr const char * SS_WALLPAPER_NAME
static QString makeDataBucketUrl()
Definition: qsyncutils.cpp:89
state
Definition: http_parser.c:279
TTK_MODULE_EXPORT void fusionPixmap(QImage &back, const QImage &front, const QPoint &pt)
#define G_SETTING_PTR
#define SS_ITEM_SIZE
#define QtLablePixmap(p)
Lable pixmap.
Definition: ttkqtcompat.h:136