TTKMusicPlayer  3.7.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 "ttkdesktopwrapper.h"
8 #include "ttkglobalhelper.h"
9 
10 #include "qsync/qsyncutils.h"
11 
12 #define OS_ITEM_SIZE QSize(165, 110)
13 
14 static constexpr int OS_COUNT = 10;
15 static constexpr int LINE_SPACING_SIZE = 160;
16 
17 static constexpr const char *OS_SCREEN_DIR = "Screen";
18 static constexpr const char *OS_SCREENSAVER_URL = "ScreenSaver";
19 static constexpr const char *OS_WALLPAPER_NAME = "wallpaper.png";
20 static constexpr const char *OS_WALLBAR_NAME = "wallbar.png";
21 static constexpr const char *OS_WALLNAIL_NAME = "thumbnail.png";
22 
24  : QLabel(parent),
25  m_index(-1),
26  m_parent(parent)
27 {
28  setFixedSize(OS_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().contains(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  TTK::setBorderShadow(this, &painter);
104 
105  const QPixmap &pixmap = QtLablePixmap(this);
106  painter.drawPixmap(QRect(QPoint(4, 4), OS_ITEM_SIZE), pixmap.scaled(OS_ITEM_SIZE));
107 }
108 
109 
110 
111 MusicScreenSaverListItem::MusicScreenSaverListItem(QObject *object, QWidget *parent)
112  : QLabel(parent)
113 {
114  setFixedSize(155, 100);
115 
117  m_hoverItem->setParent(parent);
118  connect(m_hoverItem, SIGNAL(itemClicked(int,bool)), object, SLOT(currentItemClicked(int,bool)));
119 }
120 
122 {
123  delete m_hoverItem;
124 }
125 
126 void MusicScreenSaverListItem::setFilePath(const QString &path)
127 {
128  m_hoverItem->setFilePath(path);
129 }
130 
131 void MusicScreenSaverListItem::setStatus(int index, bool status)
132 {
133  m_hoverItem->setStatus(index, status);
134 }
135 
137 {
138  if(v)
139  {
140  m_hoverItem->display(mapToParent(rect().center()));
141  }
142  else
143  {
144  m_hoverItem->hide();
145  }
146 }
147 
149 {
150  QLabel::enterEvent(event);
151  setHoverVisible(true);
152 }
153 
154 
155 
157  : QWidget(parent)
158 {
159  m_gridLayout = new QGridLayout(this);
160  m_gridLayout->setAlignment(Qt::AlignLeft | Qt::AlignTop);
161  m_gridLayout->setContentsMargins(7, 7, 7, 7);
162  setLayout(m_gridLayout);
163 }
164 
166 {
167  qDeleteAll(m_items);
168 }
169 
170 void MusicScreenSaverListWidget::addCellItem(QObject *object, const QString &path, int index, bool status)
171 {
172  MusicScreenSaverListItem *item = new MusicScreenSaverListItem(object, this);
173  item->setFilePath(path);
174  item->setStatus(index, status);
175 
176  m_gridLayout->addWidget(item, m_items.count() / 4, m_items.count() % 4, Qt::AlignLeft | Qt::AlignTop);
177  m_items << item;
178 }
179 
181 {
183  {
184  item->setHoverVisible(false);
185  m_gridLayout->removeWidget(item);
186  }
187 
188  const int lineNumber = width() / LINE_SPACING_SIZE;
189  for(int i = 0; i < m_items.count(); ++i)
190  {
191  m_gridLayout->addWidget(m_items[i], i / lineNumber, i % lineNumber, Qt::AlignLeft | Qt::AlignTop);
192  }
193 }
194 
196 {
197  QWidget::resizeEvent(event);
198  resizeWindow();
199 }
200 
201 
202 
204  : QWidget(parent),
205  m_currentState(false)
206 {
208 
209  QVBoxLayout *layout = new QVBoxLayout(this);
210  layout->setSpacing(0);
211  layout->setContentsMargins(0, 0, 0, 0);
212 
213  QWidget *mainWidget = new QWidget(this);
214  QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
215  mainLayout->setSpacing(0);
216  mainLayout->setContentsMargins(0, 0, 0, 0);
217  mainWidget->setLayout(mainLayout);
218  layout->addWidget(mainWidget);
219  setLayout(layout);
220  //
221  QWidget *topWidget = new QWidget(mainWidget);
222  topWidget->setFixedHeight(60);
223  QHBoxLayout *topWidgetLayout = new QHBoxLayout(topWidget);
224  topWidgetLayout->setContentsMargins(15, 10, 20, 10);
225 
226  QLabel *pLabel = new QLabel(tr("Screen Saver"), topWidget);
227  QFont pLabelFont = pLabel->font();
228  pLabelFont.setPixelSize(20);
229  pLabel->setFont(pLabelFont);
230  pLabel->setStyleSheet(TTK::UI::ColorStyle01);
231 
232  QLabel *iLabel = new QLabel(tr("Popular singers spend your leisure time with you"), topWidget);
233  QFont iLabelFont = iLabel->font();
234  iLabelFont.setPixelSize(15);
235  iLabel->setFont(iLabelFont);
236  iLabel->setStyleSheet(TTK::UI::ColorStyle03);
237 
238  QLabel *wLabel = new QLabel(tr("Wait"), topWidget);
239  QLabel *mLabel = new QLabel(tr("Min"), topWidget);
240 
241  m_inputEdit = new QLineEdit(topWidget);
242  m_inputEdit->setFixedWidth(50);
243  m_inputEdit->setEnabled(false);
244  m_inputEdit->setAlignment(Qt::AlignCenter);
245  m_inputEdit->setStyleSheet(TTK::UI::LineEditStyle01);
246 
247  m_caseButton = new QPushButton(topWidget);
248  m_caseButton->setFixedSize(44, 20);
249  m_caseButton->setCursor(Qt::PointingHandCursor);
250  m_caseButton->setStyleSheet(TTK::UI::ScreenSaverOff);
251 #ifdef Q_OS_UNIX
252  m_caseButton->setFocusPolicy(Qt::NoFocus);
253 #endif
254 
255  topWidgetLayout->addWidget(pLabel);
256  topWidgetLayout->addWidget(iLabel);
257  topWidgetLayout->addStretch(1);
258  topWidgetLayout->addWidget(wLabel);
259  topWidgetLayout->addWidget(m_inputEdit);
260  topWidgetLayout->addWidget(mLabel);
261  topWidgetLayout->addWidget(m_caseButton);
262  topWidget->setLayout(topWidgetLayout);
263  mainLayout->addWidget(topWidget);
264  //
265  QFrame *frame = new QFrame(mainWidget);
266  frame->setFixedHeight(1);
267  frame->setFrameShape(QFrame::HLine);
268  frame->setFrameShadow(QFrame::Plain);
269  frame->setStyleSheet(TTK::UI::ColorStyle05);
270  mainLayout->addWidget(frame);
271  //
272  QWidget *functionWidget = new QWidget(mainWidget);
273  QHBoxLayout *functionWidgetLayout = new QHBoxLayout(functionWidget);
274  functionWidgetLayout->setContentsMargins(10, 10, 10, 10);
275  functionWidget->setLayout(functionWidgetLayout);
276  mainLayout->addWidget(functionWidget);
277 
278  m_backgroundList = new MusicScreenSaverListWidget(functionWidget);
279  functionWidgetLayout->addWidget(m_backgroundList);
280 
281  connect(m_inputEdit, SIGNAL(textChanged(QString)), SLOT(inputDataChanged()));
282  connect(m_caseButton, SIGNAL(clicked()), SLOT(switchButtonState()));
283 
284  initialize();
285  applyParameter();
286 }
287 
289 {
291  const int value = G_SETTING_PTR->value(MusicSettingManager::OtherScreenSaverTime).toInt();
292 
293  m_inputEdit->setText(QString::number(value));
294  if(state != m_currentState)
295  {
297  }
298 }
299 
301 {
302  QVector<bool> statusVector;
303  statusVector.fill(true, OS_COUNT);
304 
305  const QString &value = G_SETTING_PTR->value(MusicSettingManager::OtherScreenSaverIndex).toString();
306  const QStringList items(value.split(";"));
307 
308  for(const QString &item : qAsConst(items))
309  {
310  const QStringList itemStatus(item.split(","));
311  if(itemStatus.count() == 2)
312  {
313  const int index = itemStatus[0].toInt();
314  const bool status = itemStatus[1].toInt();
315  statusVector[index] = status;
316  }
317  }
318  return statusVector;
319 }
320 
322 {
324 }
325 
327 {
329  if(state)
330  {
333  }
334 }
335 
337 {
338  if(m_currentState)
339  {
340  m_currentState = false;
341  m_caseButton->setStyleSheet(TTK::UI::ScreenSaverOff);
342  }
343  else
344  {
345  m_currentState = true;
346  m_caseButton->setStyleSheet(TTK::UI::ScreenSaverOn);
348  }
349 
350  m_inputEdit->setEnabled(m_currentState);
353 }
354 
356 {
357  QVector<bool> statusVector(parseSettingParameter());
358  if(bytes.contains(OS_WALLNAIL_NAME))
359  {
360  const int index = TTK::String::splitToken(bytes, OS_SCREEN_DIR, TTK_SEPARATOR).toInt();
361  if(index < 0 || index >= statusVector.count())
362  {
363  return;
364  }
365  m_backgroundList->addCellItem(this, bytes, index, statusVector[index]);
366  }
367 }
368 
369 void MusicScreenSaverWidget::currentItemClicked(int index, bool status)
370 {
371  QVector<bool> statusVector(parseSettingParameter());
372  statusVector[index] = status;
373 
374  QStringList items;
375  for(int i = 0; i < statusVector.count(); ++i)
376  {
377  items << QString("%1,%2").arg(i).arg(statusVector[i]);
378  }
379 
380  G_SETTING_PTR->setValue(MusicSettingManager::OtherScreenSaverIndex, items.join(";"));
382 }
383 
385 {
387  connect(m_networkRequest, SIGNAL(downLoadDataChanged(QString)), SLOT(downLoadFinished(QString)));
388 
389  MusicDownloadQueueDataList datas;
390  for(int index = 0; index < OS_COUNT; ++index)
391  {
392  const QString &url = QSyncUtils::makeDataBucketUrl() + QString("%1/%2/").arg(OS_SCREENSAVER_URL).arg(index);
393  const QString &prefix = QString("%1%2/%3/").arg(APPCACHE_DIR_FULL, OS_SCREEN_DIR).arg(index);
394  QDir().mkpath(prefix);
395 
396  MusicDownloadQueueData wallData;
397  wallData.m_url = url + OS_WALLPAPER_NAME;
398  wallData.m_path = prefix + OS_WALLPAPER_NAME;
399  datas << wallData;
400 
401  MusicDownloadQueueData barData;
402  barData.m_url = url + OS_WALLBAR_NAME;
403  barData.m_path = prefix + OS_WALLBAR_NAME;
404  datas << barData;
405 
406  MusicDownloadQueueData nailData;
407  nailData.m_url = url + OS_WALLNAIL_NAME;
408  nailData.m_path = prefix + OS_WALLNAIL_NAME;
409  datas << nailData;
410  }
411 
412  m_networkRequest->addQueue(datas);
414 }
415 
416 
417 
420  m_state(false),
421  m_isRunning(false)
422 {
423  setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
424 
425  m_runningTimer = new QTimer(this);
426  connect(m_runningTimer, SIGNAL(timeout()), SLOT(runningTimeout()));
427 
428  m_backgroundTimer = new QTimer(this);
429  m_backgroundTimer->setInterval(15 * TTK_DN_S2MS);
430  connect(m_backgroundTimer, SIGNAL(timeout()), SLOT(backgroundTimeout()));
431 
432  hide();
433  qApp->installEventFilter(this);
434 }
435 
437 {
438  if(m_runningTimer->isActive())
439  {
440  m_runningTimer->stop();
441  }
442  delete m_runningTimer;
443 
444  if(m_backgroundTimer->isActive())
445  {
446  m_backgroundTimer->stop();
447  }
448  delete m_backgroundTimer;
449 }
450 
452 {
453  if(m_runningTimer->isActive())
454  {
455  m_runningTimer->stop();
456  m_backgroundTimer->stop();
457  }
458 
460  const int value = G_SETTING_PTR->value(MusicSettingManager::OtherScreenSaverTime).toInt();
461  m_state = (m_state && (value > 0));
462 
463  if(m_state)
464  {
465  m_runningTimer->setInterval(value * TTK_DN_M2MS);
466  m_runningTimer->start();
467  }
468 }
469 
471 {
472  if(!m_isRunning)
473  {
474  m_isRunning = true;
475  setGeometry(TTKDesktopWrapper::screenGeometry());
476  setParent(nullptr);
477  showFullScreen();
478 
480  m_backgroundTimer->start();
481  }
482 }
483 
485 {
486  QVector<bool> statusVector(MusicScreenSaverWidget::parseSettingParameter());
487  QVector<int> intVector;
488  for(int index = 0; index < OS_COUNT; ++index)
489  {
490  if(statusVector[index])
491  {
492  intVector << index;
493  }
494  }
495 
496  if(!intVector.isEmpty())
497  {
498  const int index = intVector[TTK::random(intVector.count())];
499  const QString &prefix = QString("%1%2/%3/").arg(APPCACHE_DIR_FULL, OS_SCREEN_DIR).arg(index);
500 
501  QPixmap background(prefix + OS_WALLPAPER_NAME);
502  const QPixmap bar(prefix + OS_WALLBAR_NAME);
503  TTK::Image::fusionPixmap(background, bar, QPoint(100, 900));
504  setPixmap(QPixmap(background.scaled(size())));
505  }
506 }
507 
508 bool MusicScreenSaverBackgroundWidget::eventFilter(QObject *watched, QEvent *event)
509 {
510  if(event->type()== QEvent::MouseButtonPress || event->type()== QEvent::MouseButtonRelease ||
511  event->type()== QEvent::MouseButtonDblClick || event->type()== QEvent::MouseMove ||
512  event->type()== QEvent::KeyPress || event->type()== QEvent::KeyRelease)
513  {
514  if(m_state)
515  {
516  if(m_isRunning)
517  {
518  m_isRunning = false;
519  hide();
520  }
521  m_runningTimer->start();
522  }
523  else
524  {
525  m_runningTimer->stop();
526  m_backgroundTimer->stop();
527  }
528  }
529  return MusicTransitionAnimationLabel::eventFilter(watched, event);
530 }
#define QtEnterEvent
Event enter.
Definition: ttkqtcompat.h:160
The class of the screen saver list item.
static constexpr const char * OS_WALLBAR_NAME
void currentItemClicked(int index, bool status)
void setStatus(int index, bool status)
MusicScreenSaverHoverItem * m_hoverItem
MusicScreenSaverListWidget(QWidget *parent=nullptr)
static constexpr const char * OS_SCREEN_DIR
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)
TTK_MODULE_EXPORT void setBorderShadow(QWidget *widget, QPainter *painter)
#define TTK_DN_M2MS
Definition: ttkglobal.h:282
MusicScreenSaverWidget(QWidget *parent=nullptr)
TTK_MODULE_EXPORT QPixmap grayScalePixmap(const QPixmap &input, int radius=0)
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
virtual void focusOutEvent(QFocusEvent *event) overridefinal
static const QString ColorStyle01
Color.
Definition: musicuiobject.h:37
static constexpr const char * OS_SCREENSAVER_URL
#define APPCACHE_DIR_FULL
Definition: musicobject.h:121
#define qAsConst
Definition: ttkqtglobal.h:53
static const QString ColorStyle02
Definition: musicuiobject.h:40
The class of the label transition animation.
virtual void resizeWidget() overridefinal
MusicDownloadQueueRequest * m_networkRequest
void addQueue(const MusicDownloadQueueDataList &datas)
QList< MusicScreenSaverListItem * > m_items
static constexpr const char * ScreenItemEnable
static const QString BackgroundStyle01
Background.
Definition: musicuiobject.h:77
#define TTK_SEPARATOR
Definition: ttkglobal.h:195
static QRect screenGeometry(int index=0)
static constexpr const char * ScreenSaverOff
virtual void startToRequest() overridefinal
static constexpr int LINE_SPACING_SIZE
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
#define TTK_DN_S2MS
Definition: ttkglobal.h:276
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)
static constexpr const char * OS_WALLNAIL_NAME
MusicScreenSaverListItem(QObject *object, QWidget *parent=nullptr)
void downLoadFinished(const QString &bytes)
#define OS_ITEM_SIZE
virtual bool eventFilter(QObject *watched, QEvent *event) overridefinal
static constexpr const char * ScreenItemDisable
static constexpr int OS_COUNT
static constexpr const char * OS_WALLPAPER_NAME
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 QString makeDataBucketUrl()
Definition: qsyncutils.cpp:90
state
Definition: http_parser.c:279
TTK_MODULE_EXPORT void fusionPixmap(QImage &back, const QImage &front, const QPoint &pt)
#define G_SETTING_PTR
#define QtLablePixmap(p)
Lable pixmap.
Definition: ttkqtcompat.h:122