TTKMusicPlayer  4.2.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicplaylistbackupwidget.cpp
Go to the documentation of this file.
3 #include "musicbackupmodule.h"
5 #include "musicmessagebox.h"
6 #include "musicfileutils.h"
8 
9 #define ROOT_PATH APPBACKUP_DIR_FULL + "playlist/"
10 
13 {
14  setColumnCount(2);
15 
16  QHeaderView *headerView = horizontalHeader();
17  headerView->resizeSection(0, 372);
18  headerView->resizeSection(1, 45);
19 
20  connect(this, SIGNAL(cellDoubleClicked(int,int)), SLOT(itemDoubleClicked(int,int)));
21 }
22 
24 {
25  removeItems();
26 }
27 
28 void MusicPlaylistBackupTableWidget::updateSongsList(const MusicSongList &songs)
29 {
30  setRowCount(songs.count());
31 
32  QHeaderView *headerView = horizontalHeader();
33  for(int i = 0; i < songs.count(); ++i)
34  {
35  const MusicSong &v = songs[i];
36 
37  QTableWidgetItem *item = new QTableWidgetItem;
38  item->setToolTip(v.name());
39  item->setText(TTK::Widget::elidedText(font(), v.name(), Qt::ElideRight, headerView->sectionSize(0) - 10));
40  item->setForeground(QColor(TTK::UI::Color01));
41  QtItemSetTextAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
42  setItem(i, 0, item);
43 
44  item = new QTableWidgetItem(v.duration());
45  item->setForeground(QColor(TTK::UI::Color01));
46  QtItemSetTextAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
47  setItem(i, 1, item);
48  }
49 }
50 
52 {
53  Q_UNUSED(row);
54  Q_UNUSED(column);
55 
56  if(!isValid())
57  {
58  return;
59  }
60 
61  const QString &path = currentSongPath();
62  MusicSongsContainerWidget::instance()->addSongToPlaylist({QFile::exists(path) ? path : QString()});
63 }
64 
66 {
67  MusicAbstractSongsListTableWidget::contextMenuEvent(event);
68 
69  QMenu menu(this);
70  menu.setStyleSheet(TTK::UI::MenuStyle02);
71  menu.addAction(QIcon(":/contextMenu/btn_play"), tr("Play"), this, SLOT(playClicked()));
72  menu.addSeparator();
73 
74  createMoreMenu(&menu);
75 
76  const bool status = !(m_songs->isEmpty() || TTK::String::isNetworkUrl(currentSongPath()));
77  menu.addAction(tr("Song Info..."), this, SLOT(showFileInformation()))->setEnabled(status);
78  menu.addAction(QIcon(":/contextMenu/btn_local_file"), tr("Open File Dir"), this, SLOT(openFileDir()))->setEnabled(status);
79  menu.addAction(QIcon(":/contextMenu/btn_ablum"), tr("Ablum"), this, SLOT(showAlbumQueryWidget()));
80  menu.addSeparator();
81  menu.exec(QCursor::pos());
82 }
83 
84 
85 
87  : QWidget(parent)
88 {
90 
91  QVBoxLayout *layout = new QVBoxLayout(this);
92  layout->setSpacing(0);
93  layout->setContentsMargins(0, 0, 0, 0);
94 
95  QWidget *mainWidget = new QWidget(this);
96  QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
97  mainLayout->setSpacing(0);
98  mainLayout->setContentsMargins(0, 0, 0, 0);
99  mainWidget->setLayout(mainLayout);
100  layout->addWidget(mainWidget);
101  setLayout(layout);
102  //
103  QWidget *topWidget = new QWidget(mainWidget);
104  topWidget->setFixedHeight(60);
105  QHBoxLayout *topWidgetLayout = new QHBoxLayout(topWidget);
106  topWidgetLayout->setContentsMargins(15, 10, 20, 10);
107 
108  QLabel *pLabel = new QLabel(tr("Playlist Backup"), topWidget);
109  QFont pLabelFont = pLabel->font();
110  pLabelFont.setPixelSize(20);
111  pLabel->setFont(pLabelFont);
112  pLabel->setStyleSheet(TTK::UI::ColorStyle01);
113 
114  QLabel *iLabel = new QLabel(tr("Automatically backup your music"), topWidget);
115  QFont iLabelFont = iLabel->font();
116  iLabelFont.setPixelSize(15);
117  iLabel->setFont(iLabelFont);
118  iLabel->setStyleSheet(TTK::UI::ColorStyle03);
119 
120  QPushButton *exportButton = new QPushButton(topWidget);
121  exportButton->setIcon(QIcon(":/toolSets/btn_detect_download_normal"));
122  exportButton->setCursor(QCursor(Qt::PointingHandCursor));
123  exportButton->setStyleSheet(TTK::UI::BorderStyle02);
124  exportButton->setFixedSize(25, 25);
125 
126  m_dateBox = new QComboBox(topWidget);
127  m_dateBox->setFixedSize(95, 25);
129 
130  m_timeBox = new QComboBox(topWidget);
131  m_timeBox->setFixedSize(80, 25);
133 
134  topWidgetLayout->addWidget(pLabel);
135  topWidgetLayout->addWidget(iLabel);
136  topWidgetLayout->addStretch(1);
137  topWidgetLayout->addWidget(exportButton);
138  topWidgetLayout->addWidget(m_dateBox);
139  topWidgetLayout->addWidget(m_timeBox);
140  topWidget->setLayout(topWidgetLayout);
141  mainLayout->addWidget(topWidget);
142  //
143  QFrame *frame = new QFrame(mainWidget);
144  frame->setFixedHeight(1);
145  frame->setFrameShape(QFrame::HLine);
146  frame->setFrameShadow(QFrame::Plain);
147  frame->setStyleSheet(TTK::UI::ColorStyle05);
148  mainLayout->addWidget(frame);
149  //
150  QWidget *functionWidget = new QWidget(mainWidget);
151  QHBoxLayout *functionWidgetLayout = new QHBoxLayout(functionWidget);
152  functionWidgetLayout->setContentsMargins(10, 0, 10, 0);
153  functionWidget->setLayout(functionWidgetLayout);
154  mainLayout->addWidget(functionWidget);
155  //
156  QWidget *listWidget = new QWidget(functionWidget);
157  listWidget->setFixedWidth(200);
158  QHBoxLayout *listWidgetLayout = new QHBoxLayout(listWidget);
159  listWidgetLayout->setContentsMargins(0, 10, 0, 10);
160  listWidget->setLayout(listWidgetLayout);
161 
162  m_listWidget = new QListWidget(listWidget);
164  m_listWidget->verticalScrollBar()->setStyleSheet(TTK::UI::ScrollBarStyle03);
165  m_listWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
166  listWidgetLayout->addWidget(m_listWidget);
167  //
168  QFrame *hFrame = new QFrame(functionWidget);
169  hFrame->setFixedWidth(1);
170  hFrame->setFrameShape(QFrame::VLine);
171  hFrame->setFrameShadow(QFrame::Plain);
172  hFrame->setStyleSheet(TTK::UI::ColorStyle05);
173  //
174  QWidget *containerWidget = new QWidget(functionWidget);
175  QVBoxLayout *containerWidgetLayout = new QVBoxLayout(containerWidget);
176  containerWidgetLayout->setContentsMargins(10, 10, 10, 10);
177  containerWidget->setLayout(containerWidgetLayout);
178 
179  functionWidgetLayout->addWidget(listWidget);
180  functionWidgetLayout->addWidget(hFrame);
181  functionWidgetLayout->addWidget(containerWidget);
182  //
183  QWidget *containerTopWidget = new QWidget(containerWidget);
184  containerTopWidget->setFixedHeight(30);
185  m_tableWidget = new MusicPlaylistBackupTableWidget(containerWidget);
186 
187  containerWidgetLayout->addWidget(containerTopWidget);
188  containerWidgetLayout->addWidget(m_tableWidget);
189 
190  QHBoxLayout *containerTopWidgetLayout = new QHBoxLayout(containerTopWidget);
191  containerTopWidgetLayout->setContentsMargins(0, 0, 0, 0);
192  containerTopWidget->setLayout(containerTopWidgetLayout);
193  //
194  QFrame *blueFrame = new QFrame(containerTopWidget);
195  blueFrame->setFixedWidth(3);
196  blueFrame->setFrameShape(QFrame::VLine);
197  blueFrame->setFrameShadow(QFrame::Plain);
198  blueFrame->setStyleSheet(TTK::UI::ColorStyle08);
199 
200  m_titleLabel = new QLabel(containerTopWidget);
201  pLabelFont = m_titleLabel->font();
202  pLabelFont.setPixelSize(16);
203  m_titleLabel->setFont(pLabelFont);
204  //
205  QPushButton *restoreButton = new QPushButton(tr("Restore"), containerTopWidget);
206  restoreButton->setStyleSheet(TTK::UI::PushButtonStyle03);
207  restoreButton->setCursor(QCursor(Qt::PointingHandCursor));
208  restoreButton->setFixedSize(84, 26);
209  //
210  containerTopWidgetLayout->addWidget(blueFrame);
211  containerTopWidgetLayout->addWidget(m_titleLabel);
212  containerTopWidgetLayout->addStretch(1);
213  containerTopWidgetLayout->addWidget(restoreButton);
214 
215 #ifdef Q_OS_UNIX
216  exportButton->setFocusPolicy(Qt::NoFocus);
217  restoreButton->setFocusPolicy(Qt::NoFocus);
218 #endif
219 
220  connect(exportButton, SIGNAL(clicked()), SLOT(exportButtonClicked()));
221  connect(restoreButton, SIGNAL(clicked()), SLOT(restoreButtonClicked()));
222  connect(m_dateBox, SIGNAL(currentTextChanged(QString)), SLOT(currentDateChanged(QString)));
223  connect(m_timeBox, SIGNAL(currentIndexChanged(int)), SLOT(currentTimeChanged(int)));
224  connect(m_listWidget, SIGNAL(currentRowChanged(int)), SLOT(currentItemChanged(int)));
225 
226  initialize();
227 }
228 
230 {
231  delete m_dateBox;
232  delete m_timeBox;
233  delete m_titleLabel;
234  delete m_listWidget;
235  delete m_tableWidget;
236 }
237 
239 {
240  const int width = G_SETTING_PTR->value(MusicSettingManager::WidgetSize).toSize().width();
241  const int offset = width - WINDOW_WIDTH_MIN;
242  QHeaderView *headerView = m_tableWidget->horizontalHeader();
243  headerView->resizeSection(0, 372 + offset);
244 
245  const QString &text = m_titleLabel->toolTip();
246  if(!text.isEmpty())
247  {
248  m_titleLabel->setText(TTK::Widget::elidedTitleText(m_titleLabel->font(), text, 320 + offset));
249  }
250 }
251 
253 {
254  MusicMessageBox message;
255  message.setText(tr("Do you want to export the all backup list?"));
256  if(!message.exec())
257  {
258  return;
259  }
260 
261  const QString &path = TTK::File::getExistingDirectory(this);
262  if(!path.isEmpty())
263  {
264  TTK::File::copyPath(ROOT_PATH, path + "/playlist", true);
265  }
266 }
267 
269 {
270  MusicMessageBox message;
271  message.setText(tr("Do you want to restore the original list after the restoration is overwritten?"));
272  if(!message.exec())
273  {
274  return;
275  }
276 
277  int index = m_listWidget->currentRow();
278  if(index < 0 || index > m_items.count())
279  {
280  return;
281  }
282 
284 }
285 
287 {
288  m_timeBox->blockSignals(true);
289  m_timeBox->clear();
290  m_timeBox->blockSignals(false);
291 
292  QDir dir(ROOT_PATH + text);
293  for(const QFileInfo &fin : dir.entryInfoList(QDir::Files, QDir::Time | QDir::Reversed))
294  {
295  m_timeBox->addItem(TTKDateTime::format(fin.baseName().toULongLong(), TTK_TIMES_FORMAT), fin.baseName());
296  }
297 
298  m_listWidget->setCurrentRow(0);
299 }
300 
302 {
303  if(index < 0 || index >= m_timeBox->count())
304  {
305  return;
306  }
307 
308  m_items.clear();
309  m_listWidget->blockSignals(true);
310  m_listWidget->clear();
311  m_listWidget->blockSignals(false);
312 
313  MusicTKPLConfigManager manager;
314  if(!manager.fromFile(ROOT_PATH + m_dateBox->currentText() + TTK_SEPARATOR + m_timeBox->itemData(index).toString() + TKF_FILE))
315  {
316  TTK_LOG_STREAM("Backup playlist read error");
317  return;
318  }
319 
320  manager.readBuffer(m_items);
321 
322  for(const MusicSongItem &item : qAsConst(m_items))
323  {
324  const QString &text = QString("%1[%2]").arg(item.m_itemName).arg(item.m_songs.count());
325  QListWidgetItem *it = new QListWidgetItem(m_listWidget);
326  it->setToolTip(text);
327  it->setText(TTK::Widget::elidedTitleText(it->font(), text, TTKStaticCast(QWidget*, m_listWidget->parent())->width() - 5));
328  m_listWidget->addItem(it);
329  }
330 
331  m_listWidget->setCurrentRow(0);
332 }
333 
335 {
336  if(index < 0 || index >= m_items.count())
337  {
338  return;
339  }
340 
341  MusicSongItem &item = m_items[index];
343 
344  const int width = G_SETTING_PTR->value(MusicSettingManager::WidgetSize).toSize().width();
345  const QString &text = QString("%1[%2]").arg(item.m_itemName).arg(item.m_songs.count());
346  m_titleLabel->setToolTip(text);
347  m_titleLabel->setText(TTK::Widget::elidedTitleText(m_titleLabel->font(), text, 320 + width - WINDOW_WIDTH_MIN));
348 }
349 
351 {
352  QDir dir(ROOT_PATH);
353  if(dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time | QDir::Reversed).isEmpty())
354  {
356  module.runBackup();
357  }
358 
359  m_dateBox->addItems(dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot, QDir::Time | QDir::Reversed));
360 }
TTK_MODULE_EXPORT QString getExistingDirectory(QWidget *parent)
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:231
static const QString ListWidgetStyle02
void setText(const QString &text) const
#define TTK_TIMES_FORMAT
Definition: ttkglobal.h:303
virtual void contextMenuEvent(QContextMenuEvent *event) overridefinal
TTK_MODULE_EXPORT void generateComboBoxStyle(QComboBox *widget, const QString &style={})
bool fromFile(const QString &name)
The class of the messagebox widget.
#define QtItemSetTextAlignment(p, a)
Item text alignment.
Definition: ttkqtcompat.h:45
static const QString ColorStyle05
Definition: musicuiobject.h:49
virtual void resizeWidget() overridefinal
#define ROOT_PATH
void updateSongItem(const MusicSongItem &item)
TTK_MODULE_EXPORT bool copyPath(const QString &srcPath, const QString &dstPath, bool overwrite)
virtual bool readBuffer(MusicSongItemList &items) overridefinal
static const QString ScrollBarStyle03
static const QString ColorStyle01
Color.
Definition: musicuiobject.h:37
void addSongToPlaylist(const QStringList &items)
voidpf uLong offset
Definition: ioapi.h:142
#define qAsConst
Definition: ttkqtglobal.h:57
static const QString ColorStyle02
Definition: musicuiobject.h:40
virtual void updateSongsList(const MusicSongList &songs) overridefinal
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path) noexcept
bool isValid() const noexcept
static const QString PushButtonStyle03
virtual void setSongsList(MusicSongList *songs)
The class of the playlist backup module.
MusicPlaylistBackupTableWidget * m_tableWidget
virtual void runBackup() overridefinal
#define TTK_SEPARATOR
Definition: ttkglobal.h:269
static MusicSongsContainerWidget * instance()
#define TTK_LOG_STREAM(msg)
Definition: ttklogger.h:70
TTK_MODULE_EXPORT QString elidedText(const QFont &font, const QString &text, Qt::TextElideMode mode, int width)
void itemDoubleClicked(int row, int column)
static const QString ColorStyle08
Definition: musicuiobject.h:58
QString duration() const noexcept
Definition: musicsong.h:106
static const QString BackgroundStyle10
QString name() const noexcept
Definition: musicsong.h:82
static const QString MenuStyle02
static const QString ColorStyle03
Definition: musicuiobject.h:43
The class of the music song item.
Definition: musicsong.h:161
The class of the playlist backup table widget.
The class of the tkpl config manager.
MusicSongList m_songs
Definition: musicsong.h:167
static const QString BorderStyle02
MusicPlaylistBackupTableWidget(QWidget *parent=nullptr)
TTK_MODULE_EXPORT QString elidedTitleText(const QFont &font, const QString &text, int width)
#define WINDOW_WIDTH_MIN
Definition: musicobject.h:167
QString m_itemName
Definition: musicsong.h:165
static constexpr unsigned int Color01
Color QRgb.
Definition: musicuiobject.h:32
The class of the music song info.
Definition: musicsong.h:28
void currentDateChanged(const QString &text)
static QString format(const QString &time, const QString &format)
Definition: ttktime.cpp:254
MusicPlaylistBackupWidget(QWidget *parent=nullptr)
The class of the songs list abstract table widget.
#define TKF_FILE
Definition: musicobject.h:64
#define G_SETTING_PTR