TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicsongsearchonlinewidget.cpp
Go to the documentation of this file.
5 #include "musicrightareawidget.h"
6 #include "musictoastlabel.h"
8 #include "musicwidgetheaders.h"
9 
10 #include <QButtonGroup>
11 
14 {
15  setColumnCount(9);
16 
17  QHeaderView *headerView = horizontalHeader();
18  headerView->resizeSection(0, 30);
19  headerView->resizeSection(1, 273);
20  headerView->resizeSection(2, 105);
21  headerView->resizeSection(3, 105);
22  headerView->resizeSection(4, 55);
23  headerView->resizeSection(5, 23);
24  headerView->resizeSection(6, 26);
25  headerView->resizeSection(7, 26);
26  headerView->resizeSection(8, 26);
27 }
28 
30 {
31  if(!G_NETWORK_PTR->isOnline()) //no network connection
32  {
33  removeItems();
34  return;
35  }
36 
38  if(!manager.fromFile(SEARCH_PATH_FULL))
39  {
40  return;
41  }
42 
43  MusicSearchRecordList records;
44  manager.readBuffer(records);
45 
46  MusicSearchRecord record;
47  record.m_name = text;
48  record.m_timestamp = QString::number(TTKDateTime::currentTimestamp());
49  records.insert(0, record);
50 
51  manager.reset();
52  manager.writeBuffer(records);
53 
55 
57 }
58 
60 {
61  if(!isValid(row))
62  {
63  return;
64  }
65 
66  MusicDownloadWidget *widget = new MusicDownloadWidget(this);
67  widget->initialize(m_networkRequest, row);
68  widget->show();
69 }
70 
72 {
73  if(!G_NETWORK_PTR->isOnline()) //no network connection
74  {
75  removeItems();
76  return;
77  }
78 
81 }
82 
84 {
85  const int width = G_SETTING_PTR->value(MusicSettingManager::WidgetSize).toSize().width();
86  QHeaderView *headerView = horizontalHeader();
87  headerView->resizeSection(1, 273 + (width - WINDOW_WIDTH_MIN) / 3.0);
88  headerView->resizeSection(2, 105 + (width - WINDOW_WIDTH_MIN) / 3.0);
89  headerView->resizeSection(3, 105 + (width - WINDOW_WIDTH_MIN) / 3.0);
90 
91  for(int i = 0; i < rowCount(); ++i)
92  {
93  QTableWidgetItem *it = item(i, 1);
94  it->setText(TTK::Widget::elidedText(font(), it->toolTip(), Qt::ElideRight, headerView->sectionSize(1) - 31));
95 
96  it = item(i, 2);
97  it->setText(TTK::Widget::elidedText(font(), it->toolTip(), Qt::ElideRight, headerView->sectionSize(2) - 31));
98 
99  it = item(i, 3);
100  it->setText(TTK::Widget::elidedText(font(), it->toolTip(), Qt::ElideRight, headerView->sectionSize(3) - 31));
101  }
102 }
103 
105 {
107  if(column == 7 || column == 8)
108  {
109  setCursor(QCursor(Qt::PointingHandCursor));
110  }
111  else
112  {
113  unsetCursor();
114  }
115 }
116 
118 {
120  switch(column)
121  {
122  case 7: addSearchMusicToPlaylist(row, false); break;
123  case 8: downloadQueryResult(row); break;
124  default: break;
125  }
126 }
127 
129 {
130  if(column <= 0 || row < 0 || row >= rowCount() - 1)
131  {
132  return;
133  }
134 
135  addSearchMusicToPlaylist(row, true);
136 }
137 
139 {
141  setColumnCount(9);
142 }
143 
145 {
146  const int count = rowCount();
147  setRowCount(count + 1);
148 
149  QHeaderView *headerView = horizontalHeader();
150  QTableWidgetItem *item = new QTableWidgetItem;
151  item->setData(TTK_CHECKED_ROLE, Qt::Unchecked);
152  setItem(count, 0, item);
153 
154  item = new QTableWidgetItem;
155  item->setToolTip(songItem.m_songName);
156  item->setText(TTK::Widget::elidedText(font(), item->toolTip(), Qt::ElideRight, headerView->sectionSize(1) - 15));
157  item->setForeground(QColor(TTK::UI::Color02));
158  setItem(count, 1, item);
159 
160  item = new QTableWidgetItem;
161  item->setToolTip(songItem.m_artistName);
162  item->setText(TTK::Widget::elidedText(font(), item->toolTip(), Qt::ElideRight, headerView->sectionSize(2) - 30));
163  item->setForeground(QColor(TTK::UI::Color02));
164  setItem(count, 2, item);
165 
166  item = new QTableWidgetItem;
167  item->setToolTip(songItem.m_albumName);
168  item->setText(TTK::Widget::elidedText(font(), item->toolTip(), Qt::ElideRight, headerView->sectionSize(3) - 30));
169  item->setForeground(QColor(TTK::UI::Color02));
170  setItem(count, 3, item);
171 
172  item = new QTableWidgetItem(songItem.m_duration);
173  item->setForeground(QColor(TTK::UI::Color02));
174  setItem(count, 4, item);
175 
176  item = new QTableWidgetItem;
177  item->setIcon(QIcon(randSimulation()));
178  setItem(count, 5, item);
179 
180  item = new QTableWidgetItem;
181  item->setIcon(QIcon(":/tiny/lb_server_type"));
182  item->setToolTip(songItem.m_type);
183  setItem(count, 6, item);
184 
185  item = new QTableWidgetItem;
186  item->setIcon(QIcon(":/contextMenu/btn_add"));
187  setItem(count, 7, item);
188 
189  item = new QTableWidgetItem;
190  item->setIcon(QIcon(":/contextMenu/btn_download"));
191  setItem(count, 8, item);
192 }
193 
195 {
196  const int row = currentRow();
197  if(!m_networkRequest || row < 0 || row >= rowCount() - 1)
198  {
199  return;
200  }
201 
202  const TTK::MusicSongInformationList &songInfos = m_networkRequest->items();
203  const TTK::MusicSongInformation &info = songInfos[row];
204 
205  switch(action->data().toInt())
206  {
207  case 0: downloadQueryResult(row); break;
208  case 1: Q_EMIT startToQueryByText(info.m_songName); break;
210  case 3: Q_EMIT startToQueryByText(TTK::generateSongName(info.m_songName, info.m_artistName)); break;
211  case 4: addSearchMusicToPlaylist(row, true); break;
213  default: break;
214  }
215 }
216 
217 void MusicSongSearchTableWidget::contextMenuEvent(QContextMenuEvent *event)
218 {
219  MusicItemSearchTableWidget::contextMenuEvent(event);
220 
221  QMenu menu(this);
222  m_actionGroup->addAction(menu.addAction(QIcon(":/contextMenu/btn_play"), tr("Play")))->setData(4);
223 
224  createContextMenu(menu);
225 
226  if(!m_actionGroup->actions().isEmpty())
227  {
228  const QString &albumName = (currentRow() != -1 && rowCount() > 0) ? item(currentRow(), 3)->toolTip() : QString();
229  QAction *lastAction = m_actionGroup->actions().back();
230  QAction *action = m_actionGroup->addAction(tr("Search '%1'").arg(albumName));
231  action->setData(5);
232  menu.insertAction(lastAction, action);
233  }
234  menu.exec(QCursor::pos());
235 }
236 
238 {
239  if(!G_NETWORK_PTR->isOnline()) //no network connection
240  {
241  MusicToastLabel::popup(tr("No resource found"));
242  return;
243  }
244 
245  if(!isValid(row))
246  {
247  MusicToastLabel::popup(tr("Please select one item first"));
248  return;
249  }
250 
251  TTK::MusicSongInformationList songInfos(m_networkRequest->items());
252  if(row >= songInfos.count())
253  {
254  return;
255  }
256 
257  TTK::MusicSongInformation &info = songInfos[row];
259 
260  if(info.m_songProps.isEmpty())
261  {
262  MusicToastLabel::popup(tr("No resource found"));
263  return;
264  }
265 
266  const TTK::MusicSongProperty &prop = info.m_songProps.front();
267 
268  MusicResultDataItem item;
269  item.m_name = TTK::generateSongName(this->item(row, 1)->toolTip(), this->item(row, 2)->toolTip());
270  item.m_time = info.m_duration;
271  item.m_id = info.m_songId;
272  item.m_nickName = prop.m_url;
273  item.m_description = prop.m_format;
274  item.m_count = prop.m_size;
275  item.m_title = play ? MUSIC_PLAY_NOW : MUSIC_PLAY_LATER;
276 
277  if(m_networkRequest)
278  {
279  item.m_id = m_networkRequest->queryServer() + item.m_id;
280  }
281 
283 }
284 
285 
286 
288  : QWidget(parent)
289 {
290  QVBoxLayout *boxLayout = new QVBoxLayout(this);
291  boxLayout->setContentsMargins(0, 0, 0, 0);
292  boxLayout->setSpacing(0);
293 
294  QWidget *toolWidget = new QWidget(this);
295  toolWidget->setFixedHeight(80);
296  QPalette plt(palette());
297  plt.setColor(QPalette::Background, Qt::white);
298  toolWidget->setAutoFillBackground(true);
299  toolWidget->setPalette(plt);
300 
302  boxLayout->addWidget(toolWidget);
303 #if !TTK_QT_VERSION_CHECK(5,0,0)
304  QWidget *containerWidget = new QWidget(this);
305  containerWidget->setAutoFillBackground(true);
306  containerWidget->setPalette(plt);
307 
308  QVBoxLayout *layout = new QVBoxLayout(containerWidget);
309  layout->setContentsMargins(0, 0, 0, 0);
310  layout->setSpacing(0);
311  layout->addWidget(m_tableWidget);
312  containerWidget->setLayout(layout);
313  boxLayout->addWidget(containerWidget);
314 #else
315  boxLayout->addWidget(m_tableWidget);
316 #endif
317  setLayout(boxLayout);
318 
319  createToolWidget(toolWidget);
320  connect(m_tableWidget, SIGNAL(startToQueryByText(QString)), MusicRightAreaWidget::instance(), SLOT(showSongSearchedFound(QString)));
321 }
322 
324 {
325  delete m_playButton;
326  delete m_textLabel;
327  delete m_tableWidget;
328 }
329 
331 {
332  setResizeLabelText(name);
333  if(!m_resizeWidgets.isEmpty())
334  {
335  TTKObjectCast(QCheckBox*, m_resizeWidgets[0])->setChecked(false);
336  }
337 
339 }
340 
342 {
343  setResizeLabelText(name);
344  if(!m_resizeWidgets.isEmpty())
345  {
346  TTKObjectCast(QCheckBox*, m_resizeWidgets[0])->setChecked(false);
347  }
348 
350 }
351 
353 {
354  setResizeLabelText(m_textLabel->toolTip());
356 }
357 
359 {
361  list.removeOne(m_tableWidget->rowCount() - 1);
362 
363  if(list.isEmpty())
364  {
365  MusicToastLabel::popup(tr("Please select one item first"));
366  return;
367  }
368 
369  if(index == 0)
370  {
371  for(int i = 0; i < list.count(); ++i)
372  {
373  m_tableWidget->addSearchMusicToPlaylist(list[i], i == 0);
374  }
375  }
376  else if(index == 1)
377  {
378  for(int row : qAsConst(list))
379  {
381  }
382  }
383  else if(index == 2)
384  {
386  if(!d)
387  {
388  return;
389  }
390 
392  widget.initialize(d, list);
393  widget.exec();
394  }
395 }
396 
398 {
399  QVBoxLayout *wLayout = new QVBoxLayout(widget);
400  wLayout->setContentsMargins(0, 0, 0, 0);
401  wLayout->setSpacing(0);
402  widget->setLayout(wLayout);
403 
404  QWidget *funcWidget = new QWidget(widget);
405  QHBoxLayout *funcLayout = new QHBoxLayout(funcWidget);
406  funcLayout->setContentsMargins(0, 0, 10, 0);
407  funcLayout->setSpacing(10);
408 
409  m_textLabel = new QLabel(this);
410  m_textLabel->setTextFormat(Qt::RichText);
411  m_textLabel->setText(tr("&nbsp;Find no result"));
412  m_textLabel->setStyleSheet(TTK::UI::ColorStyle03);
413  funcLayout->addWidget(m_textLabel);
414 
415  m_playButton = new QPushButton(tr("Play"), this);
416  m_playButton->setIcon(QIcon(":/contextMenu/btn_play_white"));
417  m_playButton->setIconSize(QSize(14, 14));
418  m_playButton->setFixedSize(70, 25);
420  m_playButton->setCursor(QCursor(Qt::PointingHandCursor));
421  funcLayout->addWidget(m_playButton);
422 
423  QPushButton *addButton = new QPushButton(tr("Add"), this);
424  addButton->setFixedSize(70, 25);
425  addButton->setStyleSheet(TTK::UI::PushButtonStyle03);
426  addButton->setCursor(QCursor(Qt::PointingHandCursor));
427  funcLayout->addWidget(addButton);
428 
429  QPushButton *downloadButton = new QPushButton(tr("Download"), this);
430  downloadButton->setFixedSize(70, 25);
431  downloadButton->setStyleSheet(TTK::UI::PushButtonStyle03);
432  downloadButton->setCursor(QCursor(Qt::PointingHandCursor));
433  funcLayout->addWidget(downloadButton);
434 
435  QButtonGroup *buttonGroup = new QButtonGroup(this);
436  buttonGroup->addButton(m_playButton, 0);
437  buttonGroup->addButton(addButton, 1);
438  buttonGroup->addButton(downloadButton, 2);
439  QtButtonGroupConnect(buttonGroup, this, buttonClicked, TTK_SLOT);
440  funcWidget->setLayout(funcLayout);
441  wLayout->addWidget(funcWidget);
442 
443  QHeaderView *headerView = m_tableWidget->horizontalHeader();
444  //
445  QWidget *labelWidget = new QWidget(widget);
446  QHBoxLayout *labelLayout = new QHBoxLayout(labelWidget);
447  labelLayout->setContentsMargins(7, 0, 10, 0);
448  labelLayout->setSpacing(0);
449  labelWidget->setStyleSheet(TTK::UI::BackgroundStyle09);
450 
451  QCheckBox *labelCheckBox = new QCheckBox(this);
452  labelCheckBox->setStyleSheet(TTK::UI::CheckBoxStyle01);
453  connect(labelCheckBox, SIGNAL(clicked(bool)), m_tableWidget, SLOT(checkedItemsState(bool)));
454  labelLayout->addWidget(labelCheckBox, headerView->sectionSize(0));
455  m_resizeWidgets << labelCheckBox;
456 
457 #ifdef Q_OS_UNIX
458  m_playButton->setFocusPolicy(Qt::NoFocus);
459  addButton->setFocusPolicy(Qt::NoFocus);
460  downloadButton->setFocusPolicy(Qt::NoFocus);
461  labelCheckBox->setFocusPolicy(Qt::NoFocus);
462 #endif
463 
464  QLabel *label1 = new QLabel(tr("Song"), this);
465  label1->setStyleSheet(TTK::UI::FontStyle01);
466  labelLayout->addWidget(label1, headerView->sectionSize(1));
467  m_resizeWidgets << label1;
468 
469  QLabel *label2 = new QLabel(tr("Artist"), this);
470  label2->setStyleSheet(TTK::UI::FontStyle01);
471  labelLayout->addWidget(label2, headerView->sectionSize(2));
472  m_resizeWidgets << label2;
473 
474  QLabel *label3 = new QLabel(tr("Album"), this);
475  label3->setStyleSheet(TTK::UI::FontStyle01);
476  labelLayout->addWidget(label3, headerView->sectionSize(3));
477  m_resizeWidgets << label3;
478 
479  QLabel *label4 = new QLabel(tr("Operator"), this);
480  label4->setStyleSheet(TTK::UI::FontStyle01);
481  labelLayout->addWidget(label4, headerView->sectionSize(4) + headerView->sectionSize(5) + headerView->sectionSize(6) * 3);
482  m_resizeWidgets << label3;
483 
484  labelWidget->setLayout(labelLayout);
485  wLayout->addWidget(labelWidget);
486 }
487 
489 {
490  const int width = G_SETTING_PTR->value(MusicSettingManager::WidgetSize).toSize().width();
491  if(!m_resizeWidgets.isEmpty())
492  {
493  m_resizeWidgets[1]->setFixedWidth(273 + (width - WINDOW_WIDTH_MIN) / 3.0);
494  m_resizeWidgets[2]->setFixedWidth(105 + (width - WINDOW_WIDTH_MIN) / 3.0);
495  m_resizeWidgets[3]->setFixedWidth(105 + (width - WINDOW_WIDTH_MIN) / 3.0);
496  }
497 
498  m_textLabel->setText(tr("&nbsp;find <font color=#158FE1> %1 </font> result").arg(TTK::Widget::elidedText(font(), name, Qt::ElideRight, 240 + width - WINDOW_WIDTH_MIN)));
499  m_textLabel->setToolTip(name);
500 }
static MusicRightAreaWidget * instance()
The class of the download batch widget.
TTK_MODULE_EXPORT QString generateSongName(const QString &title, const QString &artist)
Definition: musicsong.cpp:105
virtual bool writeBuffer(const MusicSearchRecordList &items) overridefinal
The class of the search result data item.
virtual void searchActionClicked(QAction *action) overridefinal
The class of the download widget.
void addSearchMusicToPlaylist(int row, bool play)
virtual void startToSearchByText(const QString &text) override
virtual void createResultItem(const MusicResultInfoItem &songItem) overridefinal
static qint64 currentTimestamp() noexcept
Definition: ttktime.cpp:249
void startToSearchByText(const QString &name)
bool fromFile(const QString &name)
The class of the search item table widget.
The class of the music song property.
Definition: musicobject.h:225
static const QString CheckBoxStyle01
CheckBox.
void startToSearchByID(const QString &name)
MusicSongSearchTableWidget(QWidget *parent=nullptr)
MusicSongPropertyList m_songProps
Definition: musicobject.h:297
virtual void startToSearchByText(const QString &text) overridefinal
static constexpr unsigned int Color02
Definition: musicuiobject.h:34
The class of the search history Config.
static const QString FontStyle01
Font.
void setResizeLabelText(const QString &name)
virtual void startToSearchByID(const QString &value)
static void popup(const QString &text)
virtual bool readBuffer(MusicSearchRecordList &items) overridefinal
void initialize(const QString &name)
MusicAbstractQueryRequest * queryInput() const
virtual void startToQueryResult(TTK::MusicSongInformation *info, int bitrate)
#define MUSIC_PLAY_NOW
QList< int > TTKIntList
Definition: ttkqtglobal.h:204
#define qAsConst
Definition: ttkqtglobal.h:51
virtual void contextMenuEvent(QContextMenuEvent *event) overridefinal
const char * name
Definition: http_parser.c:458
void startToQueryByText(const QString &text)
The class of the song search online table widget.
static const QString PushButtonStyle03
void showArtistFound(const QString &text, const QString &id)
virtual void downloadQueryResult(int row) overridefinal
virtual void itemCellClicked(int row, int column) overridefinal
void startToSearchByID(const QString &text)
void initialize(MusicAbstractQueryRequest *request, const TTKIntList &items)
static MusicSongsContainerWidget * instance()
TTK_MODULE_EXPORT QString elidedText(const QFont &font, const QString &text, Qt::TextElideMode mode, int width)
static const QString BackgroundStyle09
virtual void itemCellEntered(int row, int column)
#define TTK_SLOT
Definition: ttkqtglobal.h:181
void showAlbumFound(const QString &text, const QString &id)
void addSongBufferToPlaylist(const MusicResultDataItem &item)
virtual void itemDoubleClicked(int row, int column) overridefinal
#define QtButtonGroupConnect(p, q, f, s)
Button group connect.
Definition: ttkqtcompat.h:101
static const QString ColorStyle03
Definition: musicuiobject.h:43
#define SEARCH_PATH_FULL
Definition: musicobject.h:140
virtual void removeItems() override
The class of the search result info item.
#define MUSIC_PLAY_LATER
The class of the searched record item.
virtual void removeItems() overridefinal
#define G_NETWORK_PTR
#define WINDOW_WIDTH_MIN
Definition: musicobject.h:155
virtual void itemCellClicked(int row, int column) override
virtual void startToSearch(const QString &value)=0
The class of the abstract query download data from net.
const TTK::MusicSongInformationList & items() const
MusicSongSearchOnlineWidget(QWidget *parent=nullptr)
virtual void itemCellEntered(int row, int column) overridefinal
MusicSongSearchTableWidget * m_tableWidget
MusicAbstractQueryRequest * m_networkRequest
#define TTK_CHECKED_ROLE
The class of the music song information.
Definition: musicobject.h:283
#define TTK_BN_128
Definition: ttkglobal.h:353
#define G_SETTING_PTR
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:76