TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicsongslistplaytablewidget.cpp
Go to the documentation of this file.
4 #include "musictransformwidget.h"
6 #include "musicitemdelegate.h"
7 #include "musicmessagebox.h"
8 #include "musicprogresswidget.h"
9 #include "musicrightareawidget.h"
10 #include "musicopenfilewidget.h"
12 #include "musicapplication.h"
13 
14 #include <QAction>
15 
18  m_parent(parent),
19  m_dragStartIndex(-1),
20  m_mouseMoved(false),
21  m_openFileWidget(nullptr),
22  m_songsInfoWidget(nullptr),
23  m_songsPlayWidget(nullptr),
24  m_mouseLeftPressed(false),
25  m_renameActived(false),
26  m_deleteItemWithFile(false),
27  m_renameItem(nullptr),
28  m_renameEditDelegate(nullptr),
29  m_songSort(nullptr)
30 {
31  setSelectionMode(QAbstractItemView::ExtendedSelection);
32  setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
33  setColumnCount(6);
34 
35  QHeaderView *headerView = horizontalHeader();
36  headerView->resizeSection(0, 20);
37  headerView->resizeSection(1, 187);
38  headerView->resizeSection(2, 20);
39  headerView->resizeSection(3, 20);
40  headerView->resizeSection(4, 20);
41  headerView->resizeSection(5, 45);
42 
44 
45  connect(&m_timerShow, SIGNAL(timeout()), SLOT(showTimeOut()));
46  connect(&m_timerStay, SIGNAL(timeout()), SLOT(stayTimeOut()));
47  connect(this, SIGNAL(cellDoubleClicked(int,int)), MusicApplication::instance(), SLOT(playIndexClicked(int,int)));
48 }
49 
51 {
52  removeItems();
53  delete m_openFileWidget;
54  delete m_songsInfoWidget;
55  delete m_songsPlayWidget;
56  delete m_renameEditDelegate;
57 }
58 
59 void MusicSongsListPlayTableWidget::updateSongsList(const MusicSongList &songs)
60 {
62  {
63  return;
64  }
65 
66  const int count = rowCount();
67  setRowCount(songs.count());
68  QHeaderView *headerView = horizontalHeader();
69 
70  for(int i = count; i < songs.count(); ++i)
71  {
72  const MusicSong &v = songs[i];
73 
74  QTableWidgetItem *item = new QTableWidgetItem;
75  setItem(i, 0, item);
76 
77  item = new QTableWidgetItem;
78  item->setText(TTK::Widget::elidedText(font(), v.name(), Qt::ElideRight, headerView->sectionSize(1) - 10));
79  item->setForeground(QColor(TTK::UI::Color01));
80  QtItemSetTextAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
81  setItem(i, 1, item);
82 
83  item = new QTableWidgetItem;
84  setItem(i, 2, item);
85 
86  item = new QTableWidgetItem;
87  setItem(i, 3, item);
88 
89  item = new QTableWidgetItem;
90  setItem(i, 4, item);
91 
92  item = new QTableWidgetItem(v.duration());
93  item->setForeground(QColor(TTK::UI::Color01));
94  QtItemSetTextAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
95  setItem(i, 5, item);
96  }
97 
98  setFixedHeight(totalRowHeight());
99 }
100 
102 {
103  if(index < 0)
104  {
105  return;
106  }
107 
109 
111  for(int i = 0; i < columnCount(); ++i)
112  {
113  delete takeItem(index, i);
114  }
115 
116  QString durationLabel;
117  const QString &name = songName(index);
118  const QString &path = songPath(index);
119 
120  m_songsPlayWidget = new MusicSongsListPlayWidget(index, this);
121  m_songsPlayWidget->initialize(name, path, durationLabel);
122 
123  if(!m_songs->isEmpty())
124  {
125  MusicSong *song = &(*m_songs)[index];
126  if(song->duration().isEmpty() || song->duration() == TTK_TIME_INIT)
127  {
128  song->setDuration(durationLabel);
129  }
130  }
131 
132  setSpan(index, 0, 1, 6);
133  setCellWidget(index, 0, m_songsPlayWidget);
134  setRowHeight(index, TTK_ITEM_SIZE_2XL);
135  m_playRowIndex = index;
136 
137  setFixedHeight(totalRowHeight());
138 }
139 
140 void MusicSongsListPlayTableWidget::updateSearchFileName(MusicSongList *songs, const TTKIntList &result)
141 {
142  m_searchedSongs.clear();
143  if(songs->count() == result.count())
144  {
145  m_songs = songs;
146  }
147  else
148  {
150  for(int index : qAsConst(result))
151  {
152  m_songs->append(songs->at(index));
153  }
154  }
155 
156  removeItems();
157  if(!m_songs->isEmpty())
158  {
160  }
161  else
162  {
163  setFixedHeight(totalRowHeight());
164  }
165 }
166 
167 void MusicSongsListPlayTableWidget::updateDurationLabel(const QString &current, const QString &total) const
168 {
170  {
171  m_songsPlayWidget->updateDurationLabel(current, total);
172  }
173 }
174 
176 {
178  {
180  }
181 }
182 
184 {
185  if(m_playRowIndex >= rowCount() || m_playRowIndex < 0)
186  {
187  return;
188  }
189 
190  const QString &name = songName(m_playRowIndex);
191 
192  setRowHeight(m_playRowIndex, TTK_ITEM_SIZE_M);
193 
194  removeCellWidget(m_playRowIndex, 0);
195  delete takeItem(m_playRowIndex, 0);
196  clearSpans();
197 
198  QHeaderView *headerView = horizontalHeader();
199  QTableWidgetItem *item = new QTableWidgetItem;
200  setItem(m_playRowIndex, 0, item);
201 
202  item = new QTableWidgetItem(TTK::Widget::elidedText(font(), name, Qt::ElideRight, headerView->sectionSize(1) - 10));
203  item->setForeground(QColor(TTK::UI::Color01));
204  QtItemSetTextAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
205 
206  setItem(m_playRowIndex, 1, item);
207  setItem(m_playRowIndex, 2, new QTableWidgetItem);
208  setItem(m_playRowIndex, 3, new QTableWidgetItem);
209  setItem(m_playRowIndex, 4, new QTableWidgetItem);
210 
211  item = new QTableWidgetItem((*m_songs)[m_playRowIndex].duration());
212  item->setForeground(QColor(TTK::UI::Color01));
213  QtItemSetTextAlignment(item, Qt::AlignLeft | Qt::AlignVCenter);
214  setItem(m_playRowIndex, 5, item);
215 
216  delete m_songsPlayWidget;
217  m_songsPlayWidget = nullptr;
218 
219  m_playRowIndex = -1;
220  setFixedHeight(totalRowHeight());
221 }
222 
224 {
225  if(m_songs->isEmpty() && TTK::playlistRowValid(m_playlistRow))
226  {
227  setFixedSize(LEFT_SIDE_WIDTH_MIN, 100);
228  if(m_openFileWidget == nullptr && m_parent)
229  {
231  connect(m_openFileWidget, SIGNAL(uploadFileClicked()), m_parent, SLOT(importSongsByFiles()));
232  connect(m_openFileWidget, SIGNAL(uploadDirClicked()), m_parent, SLOT(importSongsByDir()));
233  m_openFileWidget->adjustWidgetRect(width(), height());
234  }
235 
236  if(m_openFileWidget)
237  {
238  m_openFileWidget->raise();
239  m_openFileWidget->show();
240  }
241  return true;
242  }
243  else
244  {
245  delete m_openFileWidget;
246  m_openFileWidget = nullptr;
247  }
248  return false;
249 }
250 
252 {
253  QTableWidgetItem *it = item(m_previousColorRow, 0);
254  if(it)
255  {
256  it->setIcon(QIcon());
257  }
258 
259  it = item(m_previousColorRow, 2);
260  if(it)
261  {
262  it->setIcon(QIcon());
263  }
264 
265  it = item(m_previousColorRow, 3);
266  if(it)
267  {
268  it->setIcon(QIcon());
269  }
270 
271  it = item(m_previousColorRow, 4);
272  if(it)
273  {
274  it->setIcon(QIcon());
275  }
276 
277  it = item(m_previousColorRow, 5);
278  if(it)
279  {
280  it->setIcon(QIcon());
281  it->setText((*m_songs)[m_previousColorRow].duration());
282  }
283 
285  if(it = item(row, 0))
286  {
287  it->setIcon(QIcon(":/tiny/btn_play_later_normal"));
288  }
289 
290  if(it = item(row, 2))
291  {
292  it->setIcon(QIcon(":/tiny/btn_mv_normal"));
293  }
294 
295  if(it = item(row, 3))
296  {
297  const bool contains = MusicApplication::instance()->containsLovestMedia(row);
298  it->setIcon(QIcon(contains ? ":/tiny/btn_loved_normal" : ":/tiny/btn_unloved_normal"));
299  }
300 
301  if(it = item(row, 4))
302  {
303  it->setIcon(QIcon(":/tiny/btn_delete_normal"));
304  }
305 
306  if(it = item(row, 5))
307  {
308  it->setText({});
309  it->setIcon(QIcon(":/tiny/btn_more_normal"));
310  }
311 
312  if(column != 1)
313  {
314  setCursor(QCursor(Qt::PointingHandCursor));
315  }
316  else
317  {
318  unsetCursor();
319  }
320 
322 
323  //To show music Songs Item information
324  if(m_songsInfoWidget == nullptr)
325  {
327  m_songsInfoWidget->hide();
328  }
329 
330  m_timerShow.stop();
331  m_timerShow.start(0.5 * TTK_DN_S2MS);
332 
333  m_timerStay.stop();
334  m_timerStay.start(3 * TTK_DN_S2MS);
335 }
336 
338 {
339  if(row == m_playRowIndex)
340  {
341  return;
342  }
343 
344  switch(column)
345  {
346  case 0:
347  {
348  addToPlayLater();
349  break;
350  }
351  case 2:
352  {
354  break;
355  }
356  case 3:
357  {
358  bool empty;
359  Q_EMIT isSearchedResultEmpty(empty);
360 
361  if(empty)
362  {
363  const bool contains = !MusicApplication::instance()->containsLovestMedia(row);
364  QTableWidgetItem *it = item(row, 3);
365  if(it)
366  {
367  it->setIcon(QIcon(contains ? ":/tiny/btn_loved_normal" : ":/tiny/btn_unloved_normal"));
368  }
369  Q_EMIT addSongToLovestList(contains, row);
370  }
371  break;
372  }
373  case 4:
374  {
375  bool empty;
376  Q_EMIT isSearchedResultEmpty(empty);
377 
378  if(empty)
379  {
380  removeItemAt();
381  }
382  break;
383  }
384  case 5:
385  {
386  QMenu menu(this);
387  createMoreMenu(&menu);
388  menu.exec(QCursor::pos());
389  break;
390  }
391  default: break;
392  }
393 }
394 
396 {
397 // if(m_playRowIndex < 0)
398 // {
399 // return;
400 // }
401 
402  //Remove play widget
403  setRowHeight(m_playRowIndex, TTK_ITEM_SIZE_M);
404  removeCellWidget(m_playRowIndex, 0);
405 
406  delete m_songsPlayWidget;
407  m_songsPlayWidget = nullptr;
408 
409  m_playRowIndex = -1;
410  //Remove all the original item
412  setColumnCount(6);
413 }
414 
416 {
418  message.setText(tr("Are you sure to delete?"));
419  if(!message.exec() || !isValid())
420  {
421  clearSelection();
422  return;
423  }
424 
425  const TTKIntList deletedRows(selectedRows());
426  if(deletedRows.isEmpty())
427  {
428  return;
429  }
430 
431  MusicProgressWidget progress;
432  progress.show();
433  progress.setTitle(tr("Delete file mode"));
434  progress.setRange(0, deletedRows.count() / 3 * 2);
435 
436  for(int i = 0; i < deletedRows.count(); ++i)
437  {
438  if(i % 3 == 0)
439  {
440  progress.setValue(i / 3);
441  }
442  }
443 
444  if(deletedRows.contains(m_playRowIndex) || deletedRows[0] < m_playRowIndex)
445  {
447  }
448 
449  for(int i = deletedRows.count() - 1; i >= 0; --i)
450  {
451  const int row = deletedRows[i];
452  removeRow(row);
453  progress.setValue(deletedRows.count() * 2 - i);
454  }
455 
456  setFixedHeight(totalRowHeight());
457  Q_EMIT deleteItemAt(deletedRows, m_deleteItemWithFile);
458 }
459 
461 {
462  m_deleteItemWithFile = true;
463  removeItemAt();
464  m_deleteItemWithFile = false;
465 }
466 
468 {
469  if(!isValid())
470  {
471  return;
472  }
473 
474  //the playing widget allow renaming
475  if((currentRow() == m_playRowIndex) && m_songsPlayWidget)
476  {
478  return;
479  }
480 
481  //others
482  delete m_renameEditDelegate;
484  setItemDelegateForRow(currentRow(), m_renameEditDelegate);
485 
486  m_renameActived = true;
487  m_renameItem = item(currentRow(), 1);
488  m_renameItem->setText((*m_songs)[m_renameItem->row()].name());
489  openPersistentEditor(m_renameItem);
490  editItem(m_renameItem);
491 }
492 
494 {
495  if(!isValid())
496  {
497  return;
498  }
499 
501 }
502 
504 {
505  if(!isValid())
506  {
507  return;
508  }
509 
510  MusicTransformWidget(this).exec();
511 }
512 
514 {
515  if(action->data().isNull())
516  {
517  return;
518  }
519 
520  MusicRightAreaWidget::instance()->showSongSearchedFound(action->data().toString());
521 }
522 
524 {
525  const int row = TTKObjectCast(QPushButton*, sender()) ? m_playRowIndex : currentRow();
526  if(rowCount() == 0 || row < 0)
527  {
528  return;
529  }
530 
532 }
533 
535 {
536  const int row = currentRow();
537  if(rowCount() == 0 || row < 0)
538  {
539  return;
540  }
541 
543 }
544 
546 {
547  if(m_playRowIndex >= rowCount() || m_playRowIndex < 0)
548  {
549  return;
550  }
551 
552  (*m_songs)[m_playRowIndex].setName(name);
553 }
554 
556 {
557  const int newType = action->data().toInt();
558  if(newType < 0 || newType > 5)
559  {
560  return;
561  }
562 
563  if(m_songSort)
564  {
565  const int type = m_songSort->m_type;
566  m_songSort->m_type = newType;
567 
568  if(type == newType)
569  {
570  const bool asc = m_songSort->m_order == Qt::AscendingOrder;
571  m_songSort->m_order = asc ? Qt::DescendingOrder : Qt::AscendingOrder;
572  }
573  else
574  {
575  m_songSort->m_order = Qt::AscendingOrder;
576  }
578  }
579 }
580 
582 {
583  m_timerShow.stop();
584  if(!m_songsInfoWidget || m_previousColorRow < 0 || m_previousColorRow >= m_songs->count())
585  {
586  return;
587  }
588 
589  const MusicSong &song = (*m_songs)[m_previousColorRow];
591  m_songsInfoWidget->move(mapToGlobal(QPoint(width(), 0)).x() + 8, QCursor::pos().y());
592 
593  bool state;
594  Q_EMIT isCurrentPlaylistRow(state);
595  m_songsInfoWidget->setVisible(state ? (m_songsPlayWidget && !m_songsPlayWidget->isRenameMode()) : true);
596 }
597 
599 {
600  m_timerStay.stop();
601  delete m_songsInfoWidget;
602  m_songsInfoWidget = nullptr;
603 }
604 
606 {
607  MusicAbstractSongsListTableWidget::mousePressEvent(event);
608  closeRenameItem();
609 
610  if(event->button() == Qt::LeftButton)
611  {
612  m_mouseLeftPressed = true;
613  m_dragStartIndex = currentRow();
614  m_dragStartPoint = event->pos();
615  }
616 }
617 
619 {
620  MusicAbstractSongsListTableWidget::mouseMoveEvent(event);
621  if(m_mouseLeftPressed && std::abs(m_dragStartPoint.y() - QtPositionY(event)) > 15)
622  {
623  m_mouseMoved = true;
624  setCursor(QCursor(QPixmap(":/functions/lb_drag_cursor")));
625  }
626 }
627 
629 {
630  MusicAbstractSongsListTableWidget::mouseReleaseEvent(event);
631  startToDrag();
632 
633  m_mouseMoved = false;
634  m_mouseLeftPressed = false;
635  setCursor(QCursor(Qt::ArrowCursor));
636 }
637 
639 {
641 
642  delete m_songsInfoWidget;
643  m_songsInfoWidget = nullptr;
644  closeRenameItem();
645 }
646 
648 {
650  closeRenameItem();
651  Q_EMIT showFloatWidget();
652 }
653 
655 {
656  Q_UNUSED(event);
657  QMenu menu(this);
658  menu.setStyleSheet(TTK::UI::MenuStyle02);
659 
660  menu.addAction(QIcon(":/contextMenu/btn_play"), tr("Play"), this, SLOT(playClicked()));
661  menu.addAction(tr("Play Later"), this, SLOT(addToPlayLater()));
662  menu.addAction(tr("Add To Playlist"), this, SLOT(addToPlayedList()));
663 
665  menu.addAction(tr("Download More..."), this, SLOT(showDownloadWidget()))->setEnabled(!status);
666  menu.addSeparator();
667 
668  QMenu *sortFilesMenu = menu.addMenu(tr("Sort"));
669  sortFilesMenu->addAction(tr("Sort By FileName"))->setData(0);
670  sortFilesMenu->addAction(tr("Sort By Singer"))->setData(1);
671  sortFilesMenu->addAction(tr("Sort By FileSize"))->setData(2);
672  sortFilesMenu->addAction(tr("Sort By AddTime"))->setData(3);
673  sortFilesMenu->addAction(tr("Sort By Duration"))->setData(4);
674  sortFilesMenu->addAction(tr("Sort By PlayCount"))->setData(5);
675  TTK::Widget::adjustMenuPosition(sortFilesMenu);
676  connect(sortFilesMenu, SIGNAL(triggered(QAction*)), SLOT(songListSortBy(QAction*)));
677 
678  if(m_songSort)
679  {
680  const QList<QAction*> actions(sortFilesMenu->actions());
681  if(-1 < m_songSort->m_type && m_songSort->m_type < actions.count())
682  {
683  const bool asc = m_songSort->m_order == Qt::AscendingOrder;
684  actions[m_songSort->m_type]->setIcon(QIcon(asc ? ":/tiny/lb_sort_asc" : ":/tiny/lb_sort_desc"));
685  }
686  }
687 
688  menu.addAction(tr("Found Movie"), this, SLOT(showMovieQueryWidget()));
689  menu.addSeparator();
690 
691  createMoreMenu(&menu);
692 
693  QMenu *toolMenu = menu.addMenu(tr("Tools"));
694  toolMenu->addAction(tr("Make Bell"), this, SLOT(showMakeRingWidget()));
695  toolMenu->addAction(tr("Make Transform"), this, SLOT(showTransformWidget()));
697 
698  status = !(m_songs->isEmpty() || status);
699  menu.addAction(tr("Song Info..."), this, SLOT(showFileInformation()))->setEnabled(status);
700  menu.addAction(QIcon(":/contextMenu/btn_local_file"), tr("Open File Dir"), this, SLOT(openFileDir()))->setEnabled(status);
701  menu.addAction(QIcon(":/contextMenu/btn_ablum"), tr("Ablum"), this, SLOT(showAlbumQueryWidget()));
702  menu.addSeparator();
703 
704  status = false;
705  Q_EMIT isSearchedResultEmpty(status);
706  menu.addAction(tr("Rename"), this, SLOT(setChangSongName()))->setEnabled(status);
707  menu.addAction(QIcon(":/contextMenu/btn_delete"), tr("Delete"), this, SLOT(removeItemAt()))->setEnabled(status);
708  menu.addAction(tr("Delete With File"), this, SLOT(removeItemWithFile()))->setEnabled(status);
709  menu.addAction(tr("Delete All"), this, SLOT(clearItems()))->setEnabled(status);
710  menu.addSeparator();
711 
712  const QString &songName = currentSongName();
713  QString name = TTK::generateSongTitle(songName);
714  menu.addAction(tr("Search '%1'").arg(name))->setData(name);
715 
716  const QStringList artists(TTK::String::split(TTK::generateSongArtist(songName), ";"));
717  for(int i = 0; i < artists.count(); ++i)
718  {
719  name = artists[i].trimmed();
720  menu.addAction(tr("Search '%1'").arg(name))->setData(name);
721  }
722  menu.addAction(tr("Search '%1'").arg(songName))->setData(songName);
723 
724  connect(&menu, SIGNAL(triggered(QAction*)), SLOT(searchQueryByName(QAction*)));
725  menu.exec(QCursor::pos());
726 }
727 
729 {
730  if(!m_renameItem)
731  {
732  return;
733  }
734 
735  //just close the rename editor;
736  if(m_renameActived)
737  {
738  closePersistentEditor(m_renameItem);
739  }
740  //it may be a bug in closePersistentEditor,so we select
741  //the two if function to deal with
742  if(m_renameActived)
743  {
744  QHeaderView *headerView = horizontalHeader();
745  (*m_songs)[m_renameItem->row()].setName(m_renameItem->text());
746  m_renameItem->setText(TTK::Widget::elidedText(font(), m_renameItem->text(), Qt::ElideRight, headerView->sectionSize(1) - 10));
747 
748  m_renameActived = false;
749  setItemDelegateForRow(m_renameItem->row(), nullptr);
750  m_renameItem = nullptr;
751 
752  delete m_renameEditDelegate;
753  m_renameEditDelegate = nullptr;
754  }
755 }
756 
758 {
759  bool empty;
760  Q_EMIT isSearchedResultEmpty(empty);
761 
762  if(empty && m_dragStartIndex > -1 && m_mouseLeftPressed && m_mouseMoved)
763  {
764  MusicSongList songs;
765  const int start = m_dragStartIndex;
766  const int end = currentRow();
767  int index = m_playRowIndex;
768 
769  if(m_playRowIndex == start)
770  {
771  index = end;
772  }
773  else if(m_playRowIndex == end)
774  {
775  index = (start > end) ? (end + 1) : (end - 1);
776  }
777  else
778  {
779  if(start > m_playRowIndex && end < m_playRowIndex)
780  {
781  ++index;
782  }
783  else if(start < m_playRowIndex && end > m_playRowIndex)
784  {
785  --index;
786  }
787  }
788 
789  Q_EMIT itemRowSwaped(start, end, index, songs);
790  for(int i = qMin(start, end); i <= qMax(start, end); ++i)
791  {
792  if(i == index)
793  {
794  continue; //skip the current play item index, because the play widget just has one item
795  }
796 
797  QHeaderView *headerView = horizontalHeader();
798  item(i, 1)->setText(TTK::Widget::elidedText(font(), songs[i].name(), Qt::ElideRight, headerView->sectionSize(1) - 10));
799  item(i, 5)->setText(songs[i].duration());
800  }
801 
802  bool state;
803  Q_EMIT isCurrentPlaylistRow(state);
804 
805  if(state)
806  {
807  selectRow(index);
808  }
809  }
810 }
static MusicRightAreaWidget * instance()
The class of the song list play widget.
TTK_MODULE_EXPORT QString generateSongArtist(const QString &name, const QString &key=TTK_DEFAULT_STR)
static QString message(const TTK::Attribute attr)
static MusicApplication * instance()
void setText(const QString &text) const
virtual void leaveEvent(QEvent *event) override
void initialize(int index, const MusicSong &song)
The class of the show progress widget.
void adjustWidgetRect(int w, int h)
MusicSongsListItemInfoWidget * m_songsInfoWidget
virtual void itemCellEntered(int row, int column) overridefinal
MusicSongsListPlayTableWidget(QWidget *parent=nullptr)
void songListSortBy(int index)
The class of the messagebox widget.
virtual void contextMenuEvent(QContextMenuEvent *event) overridefinal
virtual void mouseReleaseEvent(QMouseEvent *event) overridefinal
TTK_MODULE_EXPORT QString generateSongTitle(const QString &name, const QString &key=TTK_DEFAULT_STR)
#define QtItemSetTextAlignment(p, a)
Item text alignment.
Definition: ttkqtcompat.h:45
The class of the song ringtone maker widget.
static MusicPlayedListPopWidget * instance()
virtual void selectRow(int index) overridefinal
void addSongToLovestList(bool state, int row)
void showSongSearchedFound(const QString &text)
void setTitle(const QString &name)
void updateSearchFileName(MusicSongList *songs, const TTKIntList &result)
#define TTK_TIME_INIT
Definition: ttkglobal.h:299
#define TTK_ITEM_SIZE_2XL
Definition: ttkglobal.h:324
TTKIntList selectedRows() const
virtual void updateSongsList(const MusicSongList &songs) overridefinal
QList< int > TTKIntList
Definition: ttkqtglobal.h:200
#define qAsConst
Definition: ttkqtglobal.h:57
const char * name
Definition: http_parser.c:458
TTK_MODULE_EXPORT bool isNetworkUrl(const QString &path) noexcept
bool isValid() const noexcept
virtual void mousePressEvent(QMouseEvent *event) overridefinal
TTK_MODULE_EXPORT bool playlistRowValid(int index) noexcept
bool containsLovestMedia() const
TTK_MODULE_EXPORT void setTransparent(QWidget *widget, int alpha)
The class of the song list item info widget.
#define QtPositionY(p)
Definition: ttkqtcompat.h:160
MusicLineEditItemDelegate * m_renameEditDelegate
TTK_MODULE_EXPORT QString elidedText(const QFont &font, const QString &text, Qt::TextElideMode mode, int width)
void itemRowSwaped(int start, int end, int play, MusicSongList &songs)
virtual void itemCellEntered(int row, int column)
MusicSongsListPlayWidget * m_songsPlayWidget
The class of the lineedit item delegate.
TTK_MODULE_EXPORT QStringList split(const QString &value, const QString &key=TTK_DEFAULT_STR)
void initialize(const QString &name, const QString &path, QString &time)
void isCurrentPlaylistRow(bool &state)
void deleteItemAt(const TTKIntList &rows, bool fileRemove)
QString duration() const noexcept
Definition: musicsong.h:105
QString name() const noexcept
Definition: musicsong.h:81
static const QString MenuStyle02
void append(const MusicSongList &songs)
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
void setDuration(const QString &t) noexcept
Definition: musicsong.h:101
virtual void leaveEvent(QEvent *event) overridefinal
void updateDurationLabel(const QString &current, const QString &total)
virtual void itemCellClicked(int row, int column) overridefinal
virtual void mouseMoveEvent(QMouseEvent *event) overridefinal
virtual void wheelEvent(QWheelEvent *event) override
void isSearchedResultEmpty(bool &empty)
void insert(int playlistRow, const MusicSong &song)
virtual void wheelEvent(QWheelEvent *event) overridefinal
static constexpr unsigned int Color01
Color QRgb.
Definition: musicuiobject.h:32
The class of the music song info.
Definition: musicsong.h:28
Qt::SortOrder m_order
Definition: musicsong.h:144
void updateDurationLabel(const QString &current, const QString &total) const
TTK_MODULE_EXPORT void adjustMenuPosition(QMenu *menu)
The class of the transform widget.
The class of the open file widget.
#define TTK_ITEM_SIZE_M
Definition: ttkglobal.h:321
The class of the songs list abstract table widget.
state
Definition: http_parser.c:279
#define TTKObjectCast(x, y)
Definition: ttkqtglobal.h:82
#define LEFT_SIDE_WIDTH_MIN
Definition: musicobject.h:174