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