TTKMusicPlayer  3.7.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicapplication.cpp
Go to the documentation of this file.
1 #include "musicapplication.h"
2 #include "ui_musicapplication.h"
5 #include "musicconfigmanager.h"
6 #include "musicplayer.h"
7 #include "musicformats.h"
8 #include "musicplaylist.h"
10 #include "musicbottomareawidget.h"
11 #include "musictopareawidget.h"
12 #include "musicrightareawidget.h"
13 #include "musicleftareawidget.h"
14 #include "musicapplicationmodule.h"
15 #include "musichotkeymanager.h"
16 #include "musicfunctionuiobject.h"
17 #include "musictoastlabel.h"
18 #include "musicfileutils.h"
19 #include "musicplaylistmanager.h"
20 #include "musictinyuiobject.h"
21 #include "musicdispatchmanager.h"
22 #include "musictkplconfigmanager.h"
23 #include "musicinputdialog.h"
24 #include "ttkversion.h"
25 
27 
29  : TTKAbstractMoveResizeWidget(false, parent),
30  m_ui(new Ui::MusicApplication),
31  m_quitWindowMode(false),
32  m_currentSongTreeIndex(TTK_NORMAL_LEVEL)
33 {
34  m_instance = this;
35 
41 
42  m_ui->setupUi(this);
43  const QSize &size = G_SETTING_PTR->value(MusicSettingManager::ScreenSize).toSize();
44  setMinimumSize(WINDOW_WIDTH_MIN, WINDOW_HEIGHT_MIN);
45  setMaximumSize(size.width(), size.height());
46 
47  m_player = new MusicPlayer(this);
48  m_playlist = new MusicPlaylist(this);
50  m_ui->songsContainer->addWidget(m_songTreeWidget);
51 
57 
58  connect(m_rightAreaWidget, SIGNAL(updateBackgroundTheme()), m_topAreaWidget, SLOT(backgroundTransparentChanged()));
59  connect(m_rightAreaWidget, SIGNAL(updateBackgroundThemeDownload()), m_topAreaWidget, SLOT(backgroundThemeDownloadFinished()));
60 
61  m_playlist->setPlaybackMode(TTK::PlayMode::Order); //The default is the order of play
62  m_ui->musicPlayedList->setPlaylist(m_playlist);
63  m_player->setPlaylist(m_playlist);
64  m_player->setVolume(100); //The default Volume is 100
65 
66  connect(m_player, SIGNAL(positionChanged(qint64)), SLOT(positionChanged(qint64)));
67  connect(m_player, SIGNAL(durationChanged(qint64)), SLOT(durationChanged(qint64)));
68  connect(m_player, SIGNAL(stateChanged(TTK::PlayState)), SLOT(playerStateChanged(TTK::PlayState)));
69  connect(m_playlist, SIGNAL(currentIndexChanged(int)), SLOT(showCurrentSong()));
70  connect(m_ui->musicDesktopLrc, SIGNAL(clicked(bool)), m_rightAreaWidget, SLOT(setDestopLrcVisible(bool)));
71 
72  m_ui->musicKey->setFocus();
73  m_ui->lrcDisplayAllButton->hide();
74  m_ui->functionsContainer->setCurrentIndex(MUSIC_SEARCH_PAGE);
75 
76  m_ui->musicTimeWidget->setInputModule(this);
77 
78  G_HOTKEY_PTR->addHotKey(this, SLOT(switchToPlayState()));
79  G_HOTKEY_PTR->addHotKey(this, SLOT(playPrevious()));
80  G_HOTKEY_PTR->addHotKey(this, SLOT(playNext()));
81  G_HOTKEY_PTR->addHotKey(this, SLOT(volumeUp()));
82  G_HOTKEY_PTR->addHotKey(this, SLOT(volumeDown()));
83  G_HOTKEY_PTR->addHotKey(this, SLOT(showSettingWidget()));
84  G_HOTKEY_PTR->addHotKey(this, SLOT(importSongsPopup()));
85  G_HOTKEY_PTR->addHotKey(this, SLOT(volumeMute()));
86 
88  setObjectsTracking({m_ui->background, m_ui->songsContainer});
89 
91  TTK_SIGNLE_SHOT(m_rightAreaWidget, showSongMainWidget, TTK_SLOT);
92 }
93 
95 {
96  delete m_player;
97  delete m_playlist;
98  delete m_songTreeWidget;
99  delete m_bottomAreaWidget;
100  delete m_topAreaWidget;
101  delete m_rightAreaWidget;
102  delete m_leftAreaWidget;
103  delete m_applicationObject;
104  delete m_ui;
105 }
106 
108 {
109  return m_instance;
110 }
111 
113 {
115  {
116  return {};
117  }
118 
119  const MusicPlayItem &item = m_playlist->currentItem();
120  const MusicSongItemList items(m_songTreeWidget->items());
121  if(0 <= m_currentSongTreeIndex && m_currentSongTreeIndex < items.count())
122  {
123  const MusicSongList &songs = items[m_currentSongTreeIndex].m_songs;
125  return (index != -1) ? songs[index].name() : QString();
126  }
127  return {};
128 }
129 
131 {
133  {
134  return {};
135  }
136 
137  const MusicPlayItem &item = m_playlist->currentItem();
138  const MusicSongItemList items(m_songTreeWidget->items());
139  if(0 <= m_currentSongTreeIndex && m_currentSongTreeIndex < items.count())
140  {
141  const MusicSongList &songs = items[m_currentSongTreeIndex].m_songs;
143  return (index != -1) ? songs[index].path() : QString();
144  }
145  return {};
146 }
147 
149 {
151 }
152 
154 {
155  //Loading the current song lrc
157  {
158  return;
159  }
160 
161  const QString &fileName = currentFileName();
162  const QString &path = TTK::String::lrcDirPrefix() + fileName + LRC_FILE;
163 
164  m_rightAreaWidget->loadCurrentSongLrc(fileName, path);
165  //reset current song lrc index.
167 }
168 
169 void MusicApplication::importSongsByOutside(const QString &path, bool play)
170 {
171  if(path.isEmpty())
172  {
173  return;
174  }
175 
177  if(play)
178  {
180  }
181 }
182 
183 QString MusicApplication::containsDownloadItem(bool &contains) const
184 {
185  contains = false;
186  QString path;
188  {
189  const MusicPlayItem &item = m_playlist->currentItem();
190  if(item.isValid())
191  {
192  const MusicSong currentSong(item.m_path);
193  path = QString("%1%2.%3").arg(G_SETTING_PTR->value(MusicSettingManager::DownloadMusicDirPath).toString(),
194  currentSong.name(), currentSong.format());
195  contains = QFile::exists(path);
196  }
197  }
198  return path;
199 }
200 
202 {
204  {
205  const MusicPlayItem &item = m_playlist->currentItem();
206  const MusicSongItemList items(m_songTreeWidget->items());
207  if(item.isValid() && item.m_playlistRow < items.count())
208  {
209  const MusicSongList &currentSongs = items[item.m_playlistRow].m_songs;
210  const int index = m_songTreeWidget->mapSongIndexByFilePath(item.m_playlistRow, item.m_path);
211  const MusicSongList &loveSongs = items[MUSIC_LOVEST_LIST].m_songs;
212  return index != -1 ? loveSongs.contains(currentSongs[index]) : false;
213  }
214  }
215  return false;
216 }
217 
219 {
221  {
222  const MusicSongItemList items(m_songTreeWidget->items());
223  if(m_songTreeWidget->currentIndex() < items.count())
224  {
225  const MusicSongList &currentSongs = items[m_songTreeWidget->currentIndex()].m_songs;
226  const MusicSongList &loveSongs = items[MUSIC_LOVEST_LIST].m_songs;
227  return loveSongs.contains(currentSongs[index]);
228  }
229  }
230  return false;
231 }
232 
234 {
236 }
237 
239 {
240  return m_player->isPlaying();
241 }
242 
244 {
245  return m_player->duration();
246 }
247 
249 {
250  return m_playlist->playbackMode();
251 }
252 
254 {
256  //
257  m_quitWindowMode = true;
260  //Write configuration files
262 }
263 
265 {
267  m_ui->musicTimeWidget->setValue(position);
268 
269  if(m_playlist->isEmpty())
270  {
271  m_ui->playCurrentTime->setText(TTK_TIME_INIT);
272  }
273  else
274  {
275  m_ui->playCurrentTime->setText(TTKTime::formatDuration(position));
276  }
277  //Show the current play time
278  m_songTreeWidget->updateDurationLabel(m_ui->playCurrentTime->text(), m_ui->playTotalTime->text());
279 }
280 
282 {
283  //Show the current play total time
284  m_ui->musicTimeWidget->setRange(0, duration);
285  m_ui->playTotalTime->setText(TTK_SEPARATOR + TTKTime::formatDuration(duration));
286  //Loading the current song lrc
288  //Update song quality label
289  m_ui->musicQualityLabel->updateQuality();
290 }
291 
293 {
294  if(state == TTK::PlayState::Stopped)
295  {
296  const bool concise = G_SETTING_PTR->value(MusicSettingManager::WindowConciseMode).toBool();
297  m_ui->musicKey->setStyleSheet(concise ? TTK::UI::TinyBtnPlay : TTK::UI::BtnPlay);
298  }
299 }
300 
302 {
303  QString name;
304  const MusicPlayItem &item = m_playlist->currentItem();
305  const int index = m_songTreeWidget->mapSongIndexByFilePath(item.m_playlistRow, item.m_path);
308 
309  if(index > TTK_NORMAL_LEVEL) //The list to end
310  {
311  name = currentFileName();
313  bool exist = false;
314  containsDownloadItem(exist);
315  m_ui->musicDownload->setStyleSheet(exist ? TTK::UI::BtnDownload : TTK::UI::BtnUnDownload);
316  //
317  exist = containsLovestItem();
318  m_ui->musicBestLove->setStyleSheet(exist ? TTK::UI::BtnLove : TTK::UI::BtnUnLove);
319  //
320  m_songTreeWidget->selectRow(index);
321  }
322  else
323  {
324  const bool concise = G_SETTING_PTR->value(MusicSettingManager::WindowConciseMode).toBool();
325  m_ui->musicBestLove->setStyleSheet(TTK::UI::BtnUnLove);
326  m_ui->musicDownload->setStyleSheet(TTK::UI::BtnUnDownload);
327  m_ui->musicKey->setStyleSheet(concise ? TTK::UI::TinyBtnPlay : TTK::UI::BtnPlay);
328  m_player->stop();
330 
334  m_ui->musicTimeWidget->setCurrentPlayState(isPlaying());
335 
336  durationChanged(0);
337  positionChanged(0);
339  }
340 
341  m_ui->musicPlayedList->selectCurrentIndex();
344  m_ui->musicSongTitle->setText(name);
345  m_ui->musicMoreFunction->setCurrentSongName(name);
346  //Show the current play song information
349  //display current ArtTheme pic
351  G_BACKGROUND_PTR->setArtistName(currentFileName());
353 }
354 
356 {
357  if(m_playlist->isEmpty())
358  {
359  return; //The playlist is not performing space-time
360  }
361 
362  const bool concise = G_SETTING_PTR->value(MusicSettingManager::WindowConciseMode).toBool();
363  if(isPlaying())
364  {
365  m_ui->musicKey->setStyleSheet(concise ? TTK::UI::TinyBtnPlay : TTK::UI::BtnPlay);
366  m_player->pause();
369  }
370  else
371  {
372  m_ui->musicKey->setStyleSheet(concise ? TTK::UI::TinyBtnPause : TTK::UI::BtnPause);
373  m_player->play();
376  }
377 
381  m_ui->musicTimeWidget->setCurrentPlayState(isPlaying());
382 }
383 
385 {
386  if(!isPlaying())
387  {
388  return;
389  }
390 
392 }
393 
395 {
396  if(m_playlist->isEmpty())
397  {
398  return; //The playlist is not performing space-time
399  }
400 
401  m_ui->musicPlayedList->clearQueueState();
403 
404  m_player->stop();
406 }
407 
409 {
410  if(m_playlist->isEmpty())
411  {
412  return; //The playlist is not performing space-time
413  }
414 
416 
417  m_player->stop();
419 }
420 
422 {
424  m_ui->musicPlayMode->setPlaybackMode(TTK::PlayMode::Order);
425 }
426 
428 {
430  m_ui->musicPlayMode->setPlaybackMode(TTK::PlayMode::Random);
431 }
432 
434 {
436  m_ui->musicPlayMode->setPlaybackMode(TTK::PlayMode::ListLoop);
437 }
438 
440 {
442  m_ui->musicPlayMode->setPlaybackMode(TTK::PlayMode::OneLoop);
443 }
444 
446 {
448  m_ui->musicPlayMode->setPlaybackMode(TTK::PlayMode::Once);
449 }
450 
452 {
454  const int volume = m_player->volume();
455 
458  m_ui->musicSound->setValue(volume);
459  G_SETTING_PTR->setValue(MusicSettingManager::Volume, volume);
460 }
461 
463 {
466  m_ui->musicSound->setValue(volume);
467  m_player->setVolume(volume);
468  G_SETTING_PTR->setValue(MusicSettingManager::Volume, volume);
469 }
470 
472 {
473  QMenu menu;
474  menu.setStyleSheet(TTK::UI::MenuStyle02);
475  menu.addAction(tr("Open Files"), this, SLOT(importSongsByFiles()));
476  menu.addAction(tr("Open Dir"), this, SLOT(importSongsByDir()));
477  menu.addAction(tr("Open Url"), this, SLOT(importSongsByUrl()));
478  menu.addSeparator();
479  menu.addAction(tr("Files Drag Drop"))->setEnabled(false);
480 
482  menu.exec(QCursor::pos());
483 }
484 
486 {
487  const QStringList &files = TTK::File::getOpenFileNames(this, MusicFormats::supportMusicInputFormats());
489 }
490 
492 {
493  const QString &path = TTK::File::getExistingDirectory(this);
494  if(path.isEmpty())
495  {
496  return;
497  }
498 
500 }
501 
503 {
504  MusicInputDialog dialog;
505  dialog.setPlaceholderText(tr("Please enter the local or network playback address"));
506  if(!dialog.exec())
507  {
508  return;
509  }
510 
511  const QString &path = dialog.text();
512  if(path.isEmpty())
513  {
514  return;
515  }
516 
518 }
519 
521 {
523  if(files.isEmpty())
524  {
525  return;
526  }
527 
528  MusicPlaylistManager manager;
529  MusicSongItemList items;
530  manager.readSongItems(files, items);
532 }
533 
535 {
537  if(path.isEmpty())
538  {
539  return;
540  }
541 
542  const MusicSongItemList &items = m_songTreeWidget->items();
543  if(index < 0 || index >= items.count())
544  {
545  return;
546  }
547 
548  MusicPlaylistManager manager;
549  manager.writeSongItem(path, items[index]);
550 
551  MusicToastLabel::popup(tr("Export current file success"));
552 }
553 
555 {
558 }
559 
561 {
563  m_player->stop();
565 }
566 
568 {
569  m_player->stop();
570 
571  if(row != -1)
572  {
573  setPlayIndex();
576  }
577  else
578  {
579  m_playlist->clear();
582  }
583 }
584 
586 {
587  m_player->stop();
588 
590  {
591  setPlayIndex();
592  const MusicSongItemList items(m_songTreeWidget->items());
593  const int index = m_songTreeWidget->currentIndex();
594  if(0 <= index && index < items.count())
595  {
596  m_ui->musicPlayedList->append(items[index].m_songs);
597  }
598  }
599 
603 }
604 
605 void MusicApplication::playIndexClicked(int row, int column)
606 {
608  {
609  setPlayIndex();
610  const MusicSongItemList items(m_songTreeWidget->items());
611  const int index = m_songTreeWidget->currentIndex();
612  if(0 <= index && index < items.count())
613  {
614  m_ui->musicPlayedList->append(items[index].m_songs);
615  }
616  }
617 
618  playIndexBy(row, column);
619 }
620 
622 {
623  //Drag the progress indicator to rewind or fast-forward through the current song
624  m_player->setPosition(time);
625  //Set lrc corrent to show
627 }
628 
630 {
631  int currentVol = m_player->volume();
632  currentVol -= 15;
633  if(currentVol < 0)
634  {
635  currentVol = 0; //reset music volume
636  }
637  volumeChanged(currentVol);
638 }
639 
641 {
642  int currentVol = m_player->volume();
643  currentVol += 15;
644  if(currentVol > 100)
645  {
646  currentVol = 100; //reset music volume
647  }
648  volumeChanged(currentVol);
649 }
650 
652 {
654 }
655 
657 {
658  if(m_playlist->isEmpty())
659  {
660  return;
661  }
662 
663  const MusicPlayItem &item = m_playlist->currentItem();
664  const int index = m_songTreeWidget->mapSongIndexByFilePath(item.m_playlistRow, item.m_path);
666 }
667 
669 {
670  const MusicPlayItem &item = m_playlist->currentItem();
671  const int index = m_songTreeWidget->mapSongIndexByFilePath(item.m_playlistRow, item.m_path);
672  if(m_playlist->isEmpty() || index < 0)
673  {
674  return;
675  }
676 
677  bool contains = true;
678  if(state)
679  {
680  contains = containsLovestItem();
681  if(contains)
682  {
683  m_songTreeWidget->songToLovestListAt(false, index);
685  }
686  else
687  {
688  m_songTreeWidget->songToLovestListAt(true, index);
690  }
691  }
692  else
693  {
694  m_songTreeWidget->songToLovestListAt(false, index);
696  }
697 
698  MusicToastLabel::popup(!contains ? tr("Add music to lovest list done") : tr("Remove music to lovest list done"));
699 }
700 
702 {
705 }
706 
708 {
710 }
711 
713 {
714  QMenu menu(this);
715  menu.setStyleSheet(TTK::UI::MenuStyle02);
716 
717  QMenu addNewFiles(tr("Add New Files"), &menu);
718  menu.addMenu(&addNewFiles);
719  addNewFiles.addAction(tr("Open Files"), this, SLOT(importSongsByFiles()));
720  addNewFiles.addAction(tr("Open Dir"), this, SLOT(importSongsByDir()));
721  addNewFiles.addAction(tr("Open Url"), this, SLOT(importSongsByUrl()));
722  TTK::Widget::adjustMenuPosition(&addNewFiles);
723 
724  QMenu playbackMode(tr("Playback Mode"), &menu);
725  menu.addMenu(&playbackMode);
726 
727  QList<QAction*> actions;
728  actions << playbackMode.addAction(tr("Play Once"), this, SLOT(playOnce()));
729  actions << playbackMode.addAction(tr("Single Cycle"), this, SLOT(playOneLoop()));
730  actions << playbackMode.addAction(tr("Order Play"), this, SLOT(playOrder()));
731  actions << playbackMode.addAction(tr("List Cycle"), this, SLOT(playlistLoop()));
732  actions << playbackMode.addAction(tr("Random Play"), this, SLOT(playRandom()));
733 
734  int index = TTK_NORMAL_LEVEL;
735  switch(playMode())
736  {
737  case TTK::PlayMode::Once: index = 0; break;
738  case TTK::PlayMode::OneLoop: index = 1; break;
739  case TTK::PlayMode::Order: index = 2; break;
740  case TTK::PlayMode::ListLoop: index = 3; break;
741  case TTK::PlayMode::Random: index = 4; break;
742  default: break;
743  }
744 
745  if(index > TTK_NORMAL_LEVEL && index < actions.count())
746  {
747  actions[index]->setIcon(QIcon(":/contextMenu/btn_selected"));
748  }
749 
750  menu.addSeparator();
751  QMenu remoteControl(tr("Remote Control"), &menu);
752  menu.addMenu(&remoteControl);
753  remoteControl.addAction(tr("Square Remote"), m_topAreaWidget, SLOT(showSquareRemote()));
754  remoteControl.addAction(tr("Rectangle Remote"), m_topAreaWidget, SLOT(showRectangleRemote()));
755  remoteControl.addAction(tr("Simple Style Remote"), m_topAreaWidget, SLOT(showSimpleStyleRemote()));
756  remoteControl.addAction(tr("Complex Style Remote"), m_topAreaWidget, SLOT(showComplexStyleRemote()));
757  remoteControl.addAction(tr("Ripple Remote"), m_topAreaWidget, SLOT(showRippleRemote()));
758  remoteControl.addAction(tr("Delete Remote"), m_topAreaWidget, SLOT(deleteCurrentRemote()));
759  TTK::Widget::adjustMenuPosition(&remoteControl);
760 
761  menu.addAction(QIcon(":/contextMenu/btn_equalizer"), tr("Equalizer"), m_applicationObject, SLOT(showEqualizerWidget()));
762  menu.addAction(tr("Sound Effect"), m_applicationObject, SLOT(showSoundEffectWidget()));
763  menu.addAction(tr("Timing Settings"), m_applicationObject, SLOT(showTimerWidget()));
764  menu.addAction(tr("Music Spectrum"), m_applicationObject, SLOT(showSpectrumWidget()));
765  menu.addSeparator();
766 
767  QAction *window = menu.addAction(tr("Window Top"), m_applicationObject, SLOT(setWindowToTop()));
768  window->setIcon(QIcon(m_applicationObject->windowToTop() ? ":/contextMenu/btn_selected" : QString()));
769  menu.addAction(tr("Reset Window"), m_applicationObject, SLOT(resetWindowGeometry()));
770 
771  QMenu download(tr("Download"), &menu);
772  menu.addMenu(&download);
774  actions.clear();
775  actions << download.addAction(tr("Full Download"), MusicRightAreaWidget::instance(), SLOT(changeDownloadFulllyWidget()));
776  actions << download.addAction(tr("Custom"), MusicRightAreaWidget::instance(), SLOT(changeDownloadCustumWidget()));
777  if(index > TTK_NORMAL_LEVEL && index < actions.count())
778  {
779  actions[index]->setIcon(QIcon(":/contextMenu/btn_selected"));
780  }
781 
783  {
784  menu.addAction(QIcon(":/contextMenu/btn_update"), tr("New Version"), m_applicationObject, SLOT(showVersionWidget()));
785  }
786  menu.addAction(QIcon(":/contextMenu/btn_setting"), tr("Settings"), this, SLOT(showSettingWidget()));
787 
788  QMenu information(tr("About"), &menu);
789  menu.addMenu(&information)->setIcon(QIcon(":/contextMenu/btn_about"));
790  information.addAction(QIcon(":/contextMenu/btn_bug_reoprt"), tr("Bug Report"), m_applicationObject, SLOT(showBugReportView()));
791  information.addAction(QIcon(":/contextMenu/btn_about"), tr("Version") + TTK_STR_CAT(TTK_VERSION_STR, TTK_VERSION_TIME_STR), m_applicationObject, SLOT(showAboutWidget()));
792 
793  menu.addSeparator();
794  menu.addAction(QIcon(":/contextMenu/btn_quit"), tr("Quit"), this, SLOT(quitWindow()));
795  menu.exec(QCursor::pos());
796 }
797 
799 {
800  //This attribute is effective immediately.
802  //
806 }
807 
808 void MusicApplication::removeLoveItemAt(const QString &path, bool current)
809 {
810  removeItemAt({path}, false, current, MUSIC_LOVEST_LIST);
811 }
812 
813 void MusicApplication::removeItemAt(const QStringList &path, bool remove, bool current, int playlistRow)
814 {
815  if(path.isEmpty())
816  {
817  return;
818  }
819 
820  if(current)
821  {
822  const MusicPlayItem &item = m_playlist->currentItem();
823  TTKIntList index;
824  for(const QString &p : qAsConst(path))
825  {
826  int idx = -1;
827  do
828  {
829  idx = m_playlist->find(item.m_playlistRow, p, idx + 1);
830  if(idx != -1)
831  {
832  index << idx;
833  }
834  } while(idx != -1);
835  }
836 
837  if(index.isEmpty())
838  {
839  return;
840  }
841  std::sort(index.begin(), index.end());
842 
843  bool contains = false;
844  int oldIndex = m_playlist->currentIndex();
846  if(index.count() == 1 && index.front() == oldIndex)
847  {
848  contains = true;
849  }
851  for(int i = index.count() - 1; i >= 0; --i)
852  {
853  m_ui->musicPlayedList->remove(index[i]);
854  if(i != 0 && !contains && oldIndex <= index[i] && oldIndex >= index[i - 1])
855  {
856  oldIndex -= i;
857  contains = true;
858  }
859  }
860 
861  if(!contains && m_playlist->currentIndex() > index[0])
862  {
863  oldIndex -= index.count();
864  }
865 
866  if(oldIndex == m_playlist->count())
867  {
868  --oldIndex;
869  }
870  m_playlist->setCurrentIndex(oldIndex);
871 
872  if(contains)
873  {
874  //The corresponding item is deleted from the Playlist
875  m_player->stop();
877 
878  const QString &removeParh = playlistRow == MUSIC_NETWORK_LIST ? TTK::generateNetworkSongPath(item.m_path) : item.m_path;
879  if(remove && !QFile::remove(removeParh))
880  {
882  }
883  }
884  }
885  else
886  {
887  for(const QString &p : qAsConst(path))
888  {
889  m_ui->musicPlayedList->remove(playlistRow, p);
890  }
891  }
892 }
893 
895 {
896  const QString &fileName = currentFileName();
897  QFile::remove(TTK::String::lrcDirPrefix() + fileName + LRC_FILE);
899 }
900 
902 {
903  const int pos = m_player->position();
904  if(pos != -1)
905  {
906  //Set lrc corrent to show
908  }
909 }
910 
912 {
913  if(isPlaying())
914  {
915  m_player->setPosition(pos);
916  }
917 }
918 
920 {
921  if(m_playlist->isEmpty() || index < 0 || index >= m_playlist->count())
922  {
923  return;
924  }
925 
927 }
928 
929 void MusicApplication::currentPlaylist(QStringList &list)
930 {
932 }
933 
934 void MusicApplication::resizeEvent(QResizeEvent *event)
935 {
936  if(!m_quitWindowMode)
937  {
942  TTKAbstractMoveResizeWidget::resizeEvent(event);
943  }
944  else
945  {
946  setMinimumSize(0, 0);
947  m_ui->background->stop();
948  event->ignore();
949  }
950 }
951 
952 void MusicApplication::closeEvent(QCloseEvent *event)
953 {
954  TTKAbstractMoveResizeWidget::closeEvent(event);
955  event->ignore();
956 
958  {
959  hide();
960  m_bottomAreaWidget->showMessage(tr("Prompt"), tr("TTKMusicPlayer will run in the background"));
961  }
962  else
963  {
964  quitWindow();
965  }
966 }
967 
968 void MusicApplication::contextMenuEvent(QContextMenuEvent *event)
969 {
970  const int h = event->pos().y();
971  if(h < m_ui->topWidget->height() || h > height() - m_ui->bottomWidget->height())
972  {
973  TTKAbstractMoveResizeWidget::contextMenuEvent(event);
974  createRightMenu();
975  }
976  else
977  {
978  event->accept();
979  }
980 }
981 
983 {
984  TTKAbstractMoveResizeWidget::enterEvent(event);
986 }
987 
988 void MusicApplication::leaveEvent(QEvent *event)
989 {
990  TTKAbstractMoveResizeWidget::leaveEvent(event);
992 }
993 
994 void MusicApplication::mouseReleaseEvent(QMouseEvent *event)
995 {
998 }
999 
1001 {
1002  if(event->pos().y() <= m_ui->topWidget->height() && !G_SETTING_PTR->value(MusicSettingManager::WindowConciseMode).toBool())
1003  {
1004  TTKAbstractMoveResizeWidget::mouseDoubleClickEvent(event);
1005  if(event->buttons() == Qt::LeftButton)
1006  {
1007  isMaximized() ? showNormal() : showMaximized();
1008  }
1009  }
1010  else
1011  {
1012  event->ignore();
1013  }
1014 }
1015 
1016 bool MusicApplication::eventFilter(QObject *object, QEvent *event)
1017 {
1018  if(object == m_ui->centerWidget && (QEvent::ContextMenu == event->type() || QEvent::MouseButtonPress == event->type()))
1019  {
1020  return true;
1021  }
1022  return TTKAbstractMoveResizeWidget::eventFilter(object, event);
1023 }
1024 
1026 {
1030 }
1031 
1033 {
1034  int value = TTK_NORMAL_LEVEL;
1035  //Path configuration song
1036  MusicSongItemList songs;
1037  {
1038  MusicTKPLConfigManager manager;
1039  if(manager.fromFile(PLAYLIST_PATH_FULL))
1040  {
1041  manager.readBuffer(songs);
1042  }
1043  }
1044 
1045  MusicConfigManager manager;
1046  if(!manager.fromFile(COFIG_PATH_FULL))
1047  {
1048  return;
1049  }
1050 
1051  manager.readBuffer();
1053  const bool success = m_songTreeWidget->addMusicItemList(songs);
1054 
1056  {
1057  case TTK::PlayMode::Order: playOrder();break;
1058  case TTK::PlayMode::Random: playRandom();break;
1059  case TTK::PlayMode::ListLoop: playlistLoop();break;
1060  case TTK::PlayMode::OneLoop: playOneLoop();break;
1061  case TTK::PlayMode::Once: playOnce();break;
1062  default:break;
1063  }
1064 
1065  value = G_SETTING_PTR->value(MusicSettingManager::RemoteWidgetMode).toInt();
1066  if(value != 0)
1067  {
1069  }
1070 
1071  //The size of the volume of the allocation of songs
1073 
1074  //Configure playback mode
1075  m_ui->musicEnhancedButton->setEnhancedMusicConfig(G_SETTING_PTR->value(MusicSettingManager::EnhancedMusicIndex).toInt());
1077  if(G_SETTING_PTR->value(MusicSettingManager::EqualizerEnable).toInt() == 1)
1078  {
1080  }
1081 
1082  //music hotkey
1084  {
1085  QStringList hotkeys = G_SETTING_PTR->value(MusicSettingManager::HotkeyValue).toString().split(TTK_SPLITER);
1086  if(hotkeys.count() != G_HOTKEY_PTR->count())
1087  {
1088  hotkeys = G_HOTKEY_PTR->defaultKeys();
1089  }
1090 
1091  for(int i = 0; i < hotkeys.count(); ++i)
1092  {
1093  G_HOTKEY_PTR->setHotKey(i, hotkeys[i]);
1094  }
1095  //
1096  G_HOTKEY_PTR->setEnabled(true);
1097  }
1098 
1099  //musicSetting
1101  //Just always set fade false, because it is not finished yet.
1103 #ifdef Q_OS_UNIX
1104  //Disable window quit mode on unix
1106 #endif
1107  //Set interior lrc mode always on
1109 
1110  //Set the desktop lrc should be shown
1113 
1114  //Set the current background color and alpha value
1116 
1117  //Configuration from next time also stopped at the last record.
1118  const QStringList &lastPlayIndex = G_SETTING_PTR->value(MusicSettingManager::LastPlayIndex).toStringList();
1119  //add new music file to playlist
1120  value = lastPlayIndex[1].toInt();
1122  if(TTK_NORMAL_LEVEL < value && value < songs.count())
1123  {
1124  m_ui->musicPlayedList->append(songs[value].m_songs);
1125  }
1126 
1127  applyParameter();
1128 
1129  if(success && lastPlayIndex[0] == "1")
1130  {
1131  TTK_SIGNLE_SHOT(m_songTreeWidget, updateCurrentIndex, TTK_SLOT);
1132  const int index = lastPlayIndex[2].toInt();
1134  m_playlist->blockSignals(true);
1136  m_playlist->blockSignals(false);
1137  m_ui->musicPlayedList->selectCurrentIndex();
1138  }
1139 
1140  //Configure automatic playback
1141  if(G_SETTING_PTR->value(MusicSettingManager::StartUpPlayMode).toInt() == 1)
1142  {
1144  }
1145 
1149 
1150  //Set the lrc color the user set
1152 
1153  //init or reset the window
1154  value = G_SETTING_PTR->value(MusicSettingManager::ShowDesktopLrc).toInt();
1157 
1158  //Reset geometry
1159  setGeometry(manager.readWindowGeometry());
1160 
1161  //Reset window concise
1163  {
1165  }
1166 
1167  //Update check on
1169  {
1171  }
1172 }
1173 
1175 {
1176  MusicConfigManager manager;
1177  if(!manager.load(COFIG_PATH_FULL))
1178  {
1179  return;
1180  }
1181 
1185  G_SETTING_PTR->setValue(MusicSettingManager::Volume, m_ui->musicSound->value());
1186 
1187  QStringList lastPlayIndex = G_SETTING_PTR->value(MusicSettingManager::LastPlayIndex).toStringList();
1188  if(lastPlayIndex.isEmpty())
1189  {
1190  lastPlayIndex << "1" << "-1" << "-1";
1191  }
1192  else
1193  {
1194  const MusicPlayItem &item = m_playlist->currentItem();
1195  lastPlayIndex[1] = QString::number(item.m_playlistRow);
1196  lastPlayIndex[2] = QString::number(m_songTreeWidget->mapSongIndexByFilePath(item.m_playlistRow, item.m_path));
1197  }
1198 
1199  G_SETTING_PTR->setValue(MusicSettingManager::LastPlayIndex, lastPlayIndex);
1205  manager.writeBuffer();
1206 
1207  {
1208  MusicTKPLConfigManager manager;
1209  if(!manager.load(PLAYLIST_PATH_FULL))
1210  {
1211  return;
1212  }
1213 
1214  manager.writeBuffer(m_songTreeWidget->items());
1215  }
1216 }
const MusicSongItemList & items() const
bool containsLovestItem() const
static MusicRightAreaWidget * instance()
void setupUi(Ui::MusicApplication *ui)
MusicBottomAreaWidget * m_bottomAreaWidget
#define QtEnterEvent
Event enter.
Definition: ttkqtcompat.h:160
TTK_MODULE_EXPORT QString getExistingDirectory(QWidget *parent)
#define TTKStaticCast(x, y)
Definition: ttkglobal.h:159
The class of the music play item.
Definition: musicplaylist.h:27
The class of the songs container widget.
The class of the app top area widget.
int backgroundAlpha() const
The class of the app object widget.
void setEqualizerConfig()
void updateDurationLabel(const QString &current, const QString &total) const
#define G_DISPATCH_PTR
bool addMusicItemList(const MusicSongItemList &items)
static MusicApplication * instance()
PlayState
Definition: musicobject.h:164
QRect readWindowGeometry() const
void importMusicSongsByUrl(const QString &path, int playlistRow)
#define MUSIC_SEARCH_PAGE
#define PLAYLIST_PATH_FULL
Definition: musicobject.h:134
int count() const
#define TTK_LOW_LEVEL
Definition: ttkglobal.h:253
void addSongToLovestList(bool state=true)
MusicApplication(QWidget *parent=nullptr)
#define G_BACKGROUND_PTR
#define G_HOTKEY_PTR
void setPlaySongChanged(int index)
TTK::PlayMode playMode() const
void songToLovestListAt(bool state, int row)
bool fromFile(const QString &name)
TTK_MODULE_EXPORT void enableBreakPoint(bool enable)
static QString supportPlaylistOutputFormats()
virtual void leaveEvent(QEvent *event) overridefinal
QString m_path
Definition: musicplaylist.h:30
void positionChanged(qint64 position)
void setObjectsTracking(const QWidgetList &objects)
The class of the ttk moving resize widget base.
#define TTK_SPLITER
Definition: ttkglobal.h:199
static QString supportMusicInputFormats()
voidpf void uLong size
Definition: ioapi.h:136
void playIndexBy(int row)
QString backgroundPath() const
static constexpr const char * BtnUnDownload
The class of the app main widget.
void setEnhanced(Enhance type)
Definition: musicplayer.cpp:87
void setCurrentPlayState(bool state) const
void playSortBy(int row)
QStringList musicSongsFileName(int index) const
virtual void mouseReleaseEvent(QMouseEvent *event) overridefinal
MusicPlayer * m_player
void setLabelText(const QString &name) const
void setPosition(qint64 position)
Definition: musicplayer.cpp:60
The class of the playlist manager.
void setLoveState(bool state)
The class of the xml config manager.
void volumeChanged(int volume)
int find(const MusicPlayItem &item) const
static constexpr const char * BtnPlay
QStringList musicSongsFilePath(int index) const
The class of the music player.
Definition: musicplayer.h:31
void removeItemAt(const QStringList &path, bool remove, bool current, int playlistRow)
void importSongsByDir(int index=TTK_LOW_LEVEL)
virtual bool eventFilter(QObject *object, QEvent *event) override
Ui::MusicApplication * m_ui
void setInteriorLrcVisible(bool status) const
void playAnyTimeAt(int time)
int mapSongIndexByFilePath(int playlistRow, const QString &path) const
qint64 duration() const
Definition: musicplayer.cpp:50
void add(int playlistRow, const QString &content)
virtual void mouseDoubleClickEvent(QMouseEvent *event) overridefinal
TTK::PlayMode playbackMode() const
virtual bool eventFilter(QObject *object, QEvent *event) overridefinal
qint64 position() const
Definition: musicplayer.cpp:55
Enhance enhanced() const
MusicTopAreaWidget * m_topAreaWidget
void setVolume(int volume)
Definition: musicplayer.cpp:70
static void popup(const QString &text)
void writeSongItem(const QString &path, const MusicSongItem &item)
virtual bool readBuffer(MusicSongItemList &items) overridefinal
void playedIndexBy(int row)
#define TTK_TIME_INIT
Definition: ttkglobal.h:222
TTK_MODULE_EXPORT QString getSaveFileName(QWidget *parent, const QString &filter="Image Files (*.png *.bmp *.jpg)")
MusicPlayItem currentItem() const
static constexpr int PLAY_PREVIOUS_LEVEL
Definition: musicplaylist.h:58
static constexpr const char * TinyBtnPause
MusicRightAreaWidget * m_rightAreaWidget
void loadCurrentSongLrc(const QString &name, const QString &path) const
void importMusicSongsByPath(const QStringList &files, int playlistRow)
TTK_MODULE_EXPORT QString generateNetworkSongPath(const QString &path)
Definition: musicsong.cpp:182
QList< int > TTKIntList
Definition: ttkqtglobal.h:188
#define qAsConst
Definition: ttkqtglobal.h:53
bool isEmpty() const
const char * name
Definition: http_parser.c:458
virtual void enterEvent(QtEnterEvent *event) overridefinal
void appendMusicItemList(const MusicSongItemList &items)
MusicSongsContainerWidget * m_songTreeWidget
void setLabelText(const QString &name) const
void setDestopLrcVisible(bool status) const
void exportSongsItemList(int index)
static constexpr const char * BtnDownload
void setPlaceholderText(const QString &text)
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:177
MusicApplicationModule * m_applicationObject
PlayMode
Definition: musicobject.h:171
int currentIndex() const
void importSongsByFiles(int index=TTK_LOW_LEVEL)
bool isMuted() const
Definition: musicplayer.cpp:76
void setupUi(Ui::MusicApplication *ui)
MusicPlaylist * m_playlist
void durationChanged(qint64 duration)
void setVolumeValue(int value) const
#define TTK_NORMAL_LEVEL
Definition: ttkglobal.h:254
void currentPlaylist(QStringList &list)
void setPlaybackMode(TTK::PlayMode mode)
#define TTK_SEPARATOR
Definition: ttkglobal.h:195
TTK_MODULE_EXPORT QString lrcDirPrefix()
void playIndexClicked(int row, int column)
void updateCurrentTime(qint64 pos)
virtual void mouseReleaseEvent(QMouseEvent *event) override
QString currentFilePath() const
#define TTK_VERSION_TIME_STR
Definition: ttkversion.h:172
MusicLeftAreaWidget * m_leftAreaWidget
#define TTK_SLOT
Definition: ttkqtglobal.h:165
static constexpr int PLAY_NEXT_LEVEL
Definition: musicplaylist.h:57
#define TTK_VERSION_STR
Definition: ttkversion.h:171
void setDestopLrcVisible(bool visible) const
void importSongsByOutside(const QString &path, bool play)
void setCurrentIndex(int index)
The class of the app left area widget.
QString format() const noexcept
Definition: musicsong.h:98
The class of the app bottom area widget.
QString name() const noexcept
Definition: musicsong.h:82
static const QString MenuStyle02
void setCurrentPlayState(bool state) const
void setCurrentPlayState(bool state) const
static constexpr const char * TinyBtnPlay
#define COFIG_PATH_FULL
Definition: musicobject.h:133
bool checkMusicListCurrentIndex() const
void setVolumeValue(int value) const
The class of the tkpl config manager.
void enhancedMusicChanged(int type)
#define MUSIC_NETWORK_LIST
bool load(const QString &name)
#define MUSIC_LOVEST_LIST
virtual void contextMenuEvent(QContextMenuEvent *event) overridefinal
bool isPlaying() const
virtual void closeEvent(QCloseEvent *event) overridefinal
#define WINDOW_WIDTH_MIN
Definition: musicobject.h:153
static constexpr const char * BtnLove
void readSongItems(const QStringList &paths, MusicSongItemList &items)
#define TTK_STR_CAT(...)
Definition: ttkglobal.h:167
static MusicApplication * m_instance
void setupUi(Ui::MusicApplication *ui)
void checkMetaDataValid(bool mode) const
QString containsDownloadItem(bool &contains) const
TTK_MODULE_EXPORT QStringList getOpenFileNames(QWidget *parent, const QString &filter="Image Files (*.png *.bmp *.jpg)")
static constexpr const char * BtnPause
int volume() const
Definition: musicplayer.cpp:65
void setShuffleMode(bool shuffle)
The class of the music song info.
Definition: musicsong.h:28
void removeLoveItemAt(const QString &path, bool current)
virtual void resizeEvent(QResizeEvent *event) overridefinal
bool isValid() const
Definition: musicplaylist.h:45
void setBackgroundAnimation(bool state)
void playerStateChanged(TTK::PlayState state)
void showMessage(const QString &title, const QString &text)
The class of the music play list.
Definition: musicplaylist.h:63
The class of the input widget.
#define MUSIC_NORMAL_LIST
#define LRC_FILE
Definition: musicobject.h:63
static QString supportPlaylistInputFormats()
void setSongTimeSpeed(qint64 time) const
void setupUi(Ui::MusicApplication *ui)
TTK_MODULE_EXPORT void adjustMenuPosition(QMenu *menu)
qint64 duration() const
The class of the app right area widget.
QString mapFilePathBySongIndex(int playlistRow, int index) const
void remoteTypeChanged(QAction *type)
void setMuted(bool muted)
Definition: musicplayer.cpp:81
bool isPlaying() const
Definition: musicplayer.cpp:35
void backgroundAnimationChanged(bool state)
void updateCurrentLrc(qint64 current, qint64 total, bool playState) const
QPoint readShowDesktopLrcGeometry() const
state
Definition: http_parser.c:279
#define WINDOW_HEIGHT_MIN
Definition: musicobject.h:154
QString text() const
virtual bool writeBuffer(const MusicSongItemList &items) overridefinal
static constexpr const char * BtnUnLove
#define G_SETTING_PTR
static qint64 formatDuration(const QString &time) noexcept
Definition: ttktime.cpp:123
bool backgroundTransparentEnable() const
QString currentFileName() const