From 550e940d870de2f8a14fb06f9f105e020b77c620 Mon Sep 17 00:00:00 2001 From: lrisora <43085437+lrisora@users.noreply.github.com> Date: Tue, 12 Sep 2023 19:35:42 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#594=20=E5=9C=A8m=5Fmedia=5Flib=5Fpopup?= =?UTF-8?q?=5Fmenu.sub(1)=E8=8F=9C=E5=8D=95=E4=B8=AD=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E9=A6=96=E6=92=AD=E6=94=BE=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E9=A1=B9=E3=80=82=20=E5=BD=93=E9=80=89=E4=B8=AD=E6=AD=8C?= =?UTF-8?q?=E6=9B=B2=E5=85=A8=E9=83=A8=E5=AD=98=E5=9C=A8=E4=BA=8E=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E4=B8=AD=E7=9A=84=E5=88=97=E8=A1=A8=E4=B8=AD=E6=97=B6?= =?UTF-8?q?=E5=90=AF=E7=94=A8=E5=90=A6=E5=88=99=E7=A6=81=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MusicPlayer2/AllMediaDlg.h | 1 - MusicPlayer2/FindDlg.cpp | 29 +++++++++++------- MusicPlayer2/FindDlg.h | 1 + MusicPlayer2/MediaLibTabDlg.cpp | 17 ++++++++++- MusicPlayer2/MediaLibTabDlg.h | 1 + MusicPlayer2/MusicPlayer2.cpp | 3 +- MusicPlayer2/MusicPlayer2.rc | 16 +++++----- MusicPlayer2/MusicPlayerDlg.cpp | 2 +- MusicPlayer2/Player.cpp | 53 +++++++++++++++++++++++++++++---- MusicPlayer2/Player.h | 10 ++++++- 10 files changed, 104 insertions(+), 29 deletions(-) diff --git a/MusicPlayer2/AllMediaDlg.h b/MusicPlayer2/AllMediaDlg.h index 0f2e0b887..ee989050f 100644 --- a/MusicPlayer2/AllMediaDlg.h +++ b/MusicPlayer2/AllMediaDlg.h @@ -93,5 +93,4 @@ class CAllMediaDlg : public CMediaLibTabDlg afx_msg void OnNMDblclkSongList(NMHDR *pNMHDR, LRESULT *pResult); protected: afx_msg LRESULT OnSearchEditBtnClicked(WPARAM wParam, LPARAM lParam); -public: }; diff --git a/MusicPlayer2/FindDlg.cpp b/MusicPlayer2/FindDlg.cpp index 27c958340..02d40999d 100644 --- a/MusicPlayer2/FindDlg.cpp +++ b/MusicPlayer2/FindDlg.cpp @@ -164,6 +164,7 @@ BEGIN_MESSAGE_MAP(CFindDlg, CBaseDialog) ON_COMMAND(ID_ADD_TO_NEW_PALYLIST_AND_PLAY, &CFindDlg::OnAddToNewPalylistAndPlay) ON_WM_INITMENU() ON_COMMAND(ID_DELETE_FROM_DISK, &CFindDlg::OnDeleteFromDisk) + ON_COMMAND(ID_PLAY_AS_NEXT, &CFindDlg::OnPlayAsNext) END_MESSAGE_MAP() @@ -546,18 +547,11 @@ void CFindDlg::OnItemProperty() void CFindDlg::OnOK() { // TODO: 在此添加专用代码和/或调用基类 + if (m_item_selected < 0 || m_item_selected >= static_cast(m_find_result.size())) return; - SongInfo song_selected; - if (m_item_selected < 0 || m_item_selected >= static_cast(m_find_result.size())) - return; - song_selected = m_find_result[m_item_selected]; - auto iter = std::find_if(CPlayer::GetInstance().GetPlayList().begin(), CPlayer::GetInstance().GetPlayList().end(), [&](const SongInfo& song) - { - return song.IsSameSong(song_selected); - }); - if (iter != CPlayer::GetInstance().GetPlayList().end()) //如果查找结果是当前播放列表中的曲目,则在当前播放列表中查找选中的曲目,并播放 + int selected_track = CPlayer::GetInstance().IsSongInPlayList(m_find_result[m_item_selected]); + if (selected_track != -1) //如果查找结果是当前播放列表中的曲目,则在当前播放列表中查找选中的曲目,并播放 { - int selected_track = iter - CPlayer::GetInstance().GetPlayList().begin(); CPlayer::GetInstance().GetPlayStatusMutex().lock(); CPlayer::GetInstance().PlayTrack(selected_track); CPlayer::GetInstance().GetPlayStatusMutex().unlock(); @@ -599,8 +593,12 @@ void CFindDlg::OnInitMenu(CMenu* pMenu) CBaseDialog::OnInitMenu(pMenu); // TODO: 在此处添加消息处理程序代码 - pMenu->SetDefaultItem(ID_PLAY_ITEM); + vector songs; + GetSongsSelected(songs); + bool select_all_in_playing_list = CPlayer::GetInstance().IsSongsInPlayList(songs); + pMenu->SetDefaultItem(ID_PLAY_ITEM); + pMenu->EnableMenuItem(ID_PLAY_AS_NEXT, MF_BYCOMMAND | (select_all_in_playing_list ? MF_ENABLED : MF_GRAYED)); pMenu->EnableMenuItem(ID_DELETE_FROM_DISK, MF_BYCOMMAND | (!theApp.m_media_lib_setting_data.disable_delete_from_disk ? MF_ENABLED : MF_GRAYED)); } @@ -644,3 +642,12 @@ void CFindDlg::OnDeleteFromDisk() ShowFindResult(); } } + + +void CFindDlg::OnPlayAsNext() +{ + // TODO: 在此添加命令处理程序代码 + vector songs; + GetSongsSelected(songs); + CPlayer::GetInstance().PlayAfterCurrentTrack(songs); +} diff --git a/MusicPlayer2/FindDlg.h b/MusicPlayer2/FindDlg.h index 35f9426d5..6c6d3f2df 100644 --- a/MusicPlayer2/FindDlg.h +++ b/MusicPlayer2/FindDlg.h @@ -107,4 +107,5 @@ class CFindDlg : public CBaseDialog afx_msg void OnInitMenu(CMenu* pMenu); virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); afx_msg void OnDeleteFromDisk(); + afx_msg void OnPlayAsNext(); }; diff --git a/MusicPlayer2/MediaLibTabDlg.cpp b/MusicPlayer2/MediaLibTabDlg.cpp index b79a761bd..a5713381f 100644 --- a/MusicPlayer2/MediaLibTabDlg.cpp +++ b/MusicPlayer2/MediaLibTabDlg.cpp @@ -30,6 +30,7 @@ BEGIN_MESSAGE_MAP(CMediaLibTabDlg, CTabDlg) ON_COMMAND(ID_DELETE_FROM_DISK, &CMediaLibTabDlg::OnDeleteFromDisk) ON_COMMAND(ID_ITEM_PROPERTY, &CMediaLibTabDlg::OnItemProperty) ON_COMMAND(ID_COPY_TEXT, &CMediaLibTabDlg::OnCopyText) + ON_COMMAND(ID_PLAY_AS_NEXT, &CMediaLibTabDlg::OnPlayAsNext) END_MESSAGE_MAP() @@ -131,8 +132,13 @@ void CMediaLibTabDlg::OnInitMenu(CMenu* pMenu) { CTabDlg::OnInitMenu(pMenu); - // TODO: 在此处添加消息处理程序代码 + // TODO: 在此处添加消息处理程序代码 vector songs; + vector songs; + GetSongsSelected(songs); + bool select_all_in_playing_list = CPlayer::GetInstance().IsSongsInPlayList(songs); + pMenu->SetDefaultItem(ID_PLAY_ITEM); + pMenu->EnableMenuItem(ID_PLAY_AS_NEXT, MF_BYCOMMAND | (select_all_in_playing_list ? MF_ENABLED : MF_GRAYED)); pMenu->EnableMenuItem(ID_DELETE_FROM_DISK, MF_BYCOMMAND | (theApp.m_media_lib_setting_data.disable_delete_from_disk ? MF_GRAYED : MF_ENABLED)); } @@ -144,6 +150,15 @@ void CMediaLibTabDlg::OnPlayItem() } +void CMediaLibTabDlg::OnPlayAsNext() +{ + // TODO: 在此添加命令处理程序代码 + vector songs; + GetSongsSelected(songs); + CPlayer::GetInstance().PlayAfterCurrentTrack(songs); +} + + void CMediaLibTabDlg::OnPlayItemInFolderMode() { // TODO: 在此添加命令处理程序代码 diff --git a/MusicPlayer2/MediaLibTabDlg.h b/MusicPlayer2/MediaLibTabDlg.h index 000f91cd1..67775dd04 100644 --- a/MusicPlayer2/MediaLibTabDlg.h +++ b/MusicPlayer2/MediaLibTabDlg.h @@ -46,6 +46,7 @@ class CMediaLibTabDlg : public CTabDlg afx_msg void OnInitMenu(CMenu* pMenu); afx_msg void OnPlayItem(); + afx_msg void OnPlayAsNext(); afx_msg void OnPlayItemInFolderMode(); afx_msg void OnAddToNewPlaylist(); afx_msg void OnAddToNewPalylistAndPlay(); diff --git a/MusicPlayer2/MusicPlayer2.cpp b/MusicPlayer2/MusicPlayer2.cpp index 497b442e9..ab934e6e4 100644 --- a/MusicPlayer2/MusicPlayer2.cpp +++ b/MusicPlayer2/MusicPlayer2.cpp @@ -883,8 +883,9 @@ void CMusicPlayerApp::InitMenuResourse() CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(0)->GetSafeHmenu(), ID_COPY_TEXT, FALSE, m_icon_set.copy); //右侧菜单 CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), ID_PLAY_ITEM, FALSE, m_icon_set.play_new.GetIcon(true)); + CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), ID_PLAY_AS_NEXT, FALSE, m_icon_set.play_as_next); CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), ID_PLAY_ITEM_IN_FOLDER_MODE, FALSE, m_icon_set.play_in_folder); - CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), 3, TRUE, m_icon_set.add.GetIcon(true)); + CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), 4, TRUE, m_icon_set.add.GetIcon(true)); CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), ID_ADD_TO_NEW_PLAYLIST, FALSE, m_icon_set.add.GetIcon(true)); CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), ID_ADD_TO_MY_FAVOURITE, FALSE, m_icon_set.favourite.GetIcon(true)); CMenuIcon::AddIconToMenuItem(m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSafeHmenu(), ID_ADD_TO_NEW_PALYLIST_AND_PLAY, FALSE, m_icon_set.play_in_playlist); diff --git a/MusicPlayer2/MusicPlayer2.rc b/MusicPlayer2/MusicPlayer2.rc index 96dbdc344..2530fa927 100644 --- a/MusicPlayer2/MusicPlayer2.rc +++ b/MusicPlayer2/MusicPlayer2.rc @@ -2462,7 +2462,7 @@ BEGIN POPUP "菜单" BEGIN MENUITEM "播放(&P)", ID_PLAY_ITEM - MENUITEM "下一首播放", ID_PLAY_AS_NEXT + MENUITEM "下一首播放(&N)", ID_PLAY_AS_NEXT MENUITEM SEPARATOR MENUITEM "在线查看(&O)", ID_EXPLORE_ONLINE MENUITEM "转换格式(&F)...", ID_FORMAT_CONVERT @@ -2493,12 +2493,12 @@ BEGIN MENUITEM "移动文件到(&M)...", ID_MOVE_FILE_TO MENUITEM SEPARATOR MENUITEM "上移(&U)", ID_MOVE_PLAYLIST_ITEM_UP - MENUITEM "下移(&N)", ID_MOVE_PLAYLIST_ITEM_DOWN + MENUITEM "下移(&W)", ID_MOVE_PLAYLIST_ITEM_DOWN MENUITEM SEPARATOR MENUITEM "查看艺术家(&I)...", ID_PLAYLIST_VIEW_ARTIST MENUITEM "查看唱片集(&V)...", ID_PLAYLIST_VIEW_ALBUM MENUITEM SEPARATOR - MENUITEM "重命名(&N)...", ID_RENAME + MENUITEM "重命名(&E)...", ID_RENAME MENUITEM "打开文件位置(&B)", ID_EXPLORE_TRACK MENUITEM "属性(&Y)...", ID_ITEM_PROPERTY END @@ -2918,7 +2918,7 @@ BEGIN MENUITEM "移动文件到(&M)...", ID_MOVE_FILE_TO MENUITEM SEPARATOR MENUITEM "上移(&U)", ID_MOVE_PLAYLIST_ITEM_UP - MENUITEM "下移(&N)", ID_MOVE_PLAYLIST_ITEM_DOWN + MENUITEM "下移(&W)", ID_MOVE_PLAYLIST_ITEM_DOWN MENUITEM SEPARATOR MENUITEM "全部选择(&A)", ID_PLAYLIST_SELECT_ALL MENUITEM "全部取消(&L)", ID_PLAYLIST_SELECT_NONE @@ -2950,6 +2950,7 @@ BEGIN POPUP "右侧菜单" BEGIN MENUITEM "播放(&P)", ID_PLAY_ITEM + MENUITEM "下一首播放(&N)", ID_PLAY_AS_NEXT MENUITEM "在文件夹模式中播放(&D)", ID_PLAY_ITEM_IN_FOLDER_MODE MENUITEM SEPARATOR POPUP "添加到播放列表(&T)" @@ -6166,7 +6167,7 @@ BEGIN POPUP "Menu" BEGIN MENUITEM "&Play", ID_PLAY_ITEM - MENUITEM "Play After Current Song", ID_PLAY_AS_NEXT + MENUITEM "Play &Next", ID_PLAY_AS_NEXT MENUITEM SEPARATOR MENUITEM "View &Online", ID_EXPLORE_ONLINE MENUITEM "&Format Convert...", ID_FORMAT_CONVERT @@ -6197,7 +6198,7 @@ BEGIN MENUITEM "&Move File to...", ID_MOVE_FILE_TO MENUITEM SEPARATOR MENUITEM "Move &Up", ID_MOVE_PLAYLIST_ITEM_UP - MENUITEM "Move Dow&n", ID_MOVE_PLAYLIST_ITEM_DOWN + MENUITEM "Move Do&wn", ID_MOVE_PLAYLIST_ITEM_DOWN MENUITEM SEPARATOR MENUITEM "View Art&ist...", ID_PLAYLIST_VIEW_ARTIST MENUITEM "View Al&bum...", ID_PLAYLIST_VIEW_ALBUM @@ -6392,7 +6393,7 @@ BEGIN MENUITEM "&Move File to...", ID_MOVE_FILE_TO MENUITEM SEPARATOR MENUITEM "Move &Up", ID_MOVE_PLAYLIST_ITEM_UP - MENUITEM "Move Dow&n", ID_MOVE_PLAYLIST_ITEM_DOWN + MENUITEM "Move Do&wn", ID_MOVE_PLAYLIST_ITEM_DOWN MENUITEM SEPARATOR MENUITEM "Select &All", ID_PLAYLIST_SELECT_ALL MENUITEM "Select N&one", ID_PLAYLIST_SELECT_NONE @@ -6424,6 +6425,7 @@ BEGIN POPUP "右侧菜单" BEGIN MENUITEM "&Play", ID_PLAY_ITEM + MENUITEM "Play &Next", ID_PLAY_AS_NEXT MENUITEM "Play in Folder Mode", ID_PLAY_ITEM_IN_FOLDER_MODE MENUITEM SEPARATOR POPUP "Add to Playlis&t" diff --git a/MusicPlayer2/MusicPlayerDlg.cpp b/MusicPlayer2/MusicPlayerDlg.cpp index d8f9b379c..d5795b1dd 100644 --- a/MusicPlayer2/MusicPlayerDlg.cpp +++ b/MusicPlayer2/MusicPlayerDlg.cpp @@ -1861,7 +1861,7 @@ void CMusicPlayerDlg::IniPlaylistPopupMenu() initAddToMenu(theApp.m_menu_set.m_playlist_toolbar_menu.GetSubMenu(4)->GetSubMenu(0)); initAddToMenu(theApp.m_menu_set.m_playlist_toolbar_popup_menu.GetSubMenu(4)->GetSubMenu(0)); initAddToMenu(theApp.m_menu_set.m_media_lib_popup_menu.GetSubMenu(0)->GetSubMenu(1)); - initAddToMenu(theApp.m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSubMenu(3)); + initAddToMenu(theApp.m_menu_set.m_media_lib_popup_menu.GetSubMenu(1)->GetSubMenu(4)); initAddToMenu(theApp.m_menu_set.m_main_popup_menu.GetSubMenu(0)->GetSubMenu(2)); initAddToMenu(theApp.m_menu_set.m_mini_mode_menu.GetSubMenu(0)->GetSubMenu(2)); } diff --git a/MusicPlayer2/Player.cpp b/MusicPlayer2/Player.cpp index 346855d44..de55dfd96 100644 --- a/MusicPlayer2/Player.cpp +++ b/MusicPlayer2/Player.cpp @@ -925,13 +925,33 @@ bool CPlayer::PlayTrack(int song_track, bool auto_next, bool play) return valid; } -bool CPlayer::PlayAfterCurrentTrack(vector tracks_to_play) { - if (tracks_to_play.empty()) { - return false; +bool CPlayer::PlayAfterCurrentTrack(const std::vector& tracks_to_play) +{ + bool add{ false }; + for (const int& track : tracks_to_play) + { + if (track >= 0 && track < static_cast(m_playlist.size())) + { + m_next_tracks.push_front(track); + add = true; + } } - m_next_tracks.insert(m_next_tracks.begin(), tracks_to_play.begin(), tracks_to_play.end()); - // TODO 无序播放时的修改 - return true; + return add; +} + +bool CPlayer::PlayAfterCurrentTrack(const std::vector& tracks_to_play) +{ + bool add{ false }; + for (const SongInfo& track : tracks_to_play) + { + int index = IsSongInPlayList(track); + if(index != -1) + { + m_next_tracks.push_front(index); + add = true; + } + } + return add; } void CPlayer::LoopPlaylist(int& song_track) @@ -1525,6 +1545,27 @@ void CPlayer::ExploreLyric() const } } +int CPlayer::IsSongInPlayList(const SongInfo& song) +{ + auto iter = std::find_if(m_playlist.begin(), m_playlist.end(), + [&](const SongInfo& songinfo) { return song.IsSameSong(songinfo); }); + if (iter != m_playlist.end()) + return iter - m_playlist.begin(); + return -1; +} + +bool CPlayer::IsSongsInPlayList(const vector& songs_list) +{ + for (const SongInfo& song : songs_list) + { + auto iter = std::find_if(m_playlist.begin(), m_playlist.end(), + [&](const SongInfo& songinfo) { return song.IsSameSong(songinfo); }); + if (iter == m_playlist.end()) + return false; + } + return true; // 没有找到不存在于m_playlist中的songs_list元素,返回true +} + int CPlayer::GetSongNum() const { return static_cast(m_playlist.size()); diff --git a/MusicPlayer2/Player.h b/MusicPlayer2/Player.h index 221490ec3..812fa6df8 100644 --- a/MusicPlayer2/Player.h +++ b/MusicPlayer2/Player.h @@ -274,7 +274,10 @@ class CPlayer //播放指定序号的歌曲,如果是播放结束自动播放下一曲,则auto_next为true,play为false时只打开不播放 bool PlayTrack(int song_track, bool auto_next = false, bool play = true); - bool PlayAfterCurrentTrack(std::vector tracks_to_play); //设置指定序号歌曲为下一首播放的歌曲 + // 设置指定序号歌曲为下一首播放的歌曲,无效的index会被忽略 + bool PlayAfterCurrentTrack(const std::vector& tracks_to_play); + // 设置指定SongInfo为下一首播放的歌曲,不存在于m_playlist的条目会被忽略 + bool PlayAfterCurrentTrack(const std::vector& tracks_to_play); private: void LoopPlaylist(int& song_track); @@ -348,6 +351,11 @@ class CPlayer //获取播放列表的引用 vector& GetPlayList() { return m_playlist; } + + // 判断参数中的曲目是否存在于m_playlist,存在返回索引不存在返回-1(IsSameSong) + int IsSongInPlayList(const SongInfo& song); + // 判断参数中的曲目是否全部存在于m_playlist(IsSameSong) + bool IsSongsInPlayList(const vector& songs_list); //获取歌曲总数 int GetSongNum() const; //获取当前播放曲目的目录