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