Skip to content

Commit

Permalink
fix zhongyang219#594 在m_media_lib_popup_menu.sub(1)菜单中添加下一首播放菜单项。
Browse files Browse the repository at this point in the history
当选中歌曲全部存在于播放中的列表中时启用否则禁用
  • Loading branch information
lrisora committed Sep 12, 2023
1 parent 72bd774 commit 550e940
Show file tree
Hide file tree
Showing 10 changed files with 104 additions and 29 deletions.
1 change: 0 additions & 1 deletion MusicPlayer2/AllMediaDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
};
29 changes: 18 additions & 11 deletions MusicPlayer2/FindDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()


Expand Down Expand Up @@ -546,18 +547,11 @@ void CFindDlg::OnItemProperty()
void CFindDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
if (m_item_selected < 0 || m_item_selected >= static_cast<int>(m_find_result.size())) return;

SongInfo song_selected;
if (m_item_selected < 0 || m_item_selected >= static_cast<int>(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();
Expand Down Expand Up @@ -599,8 +593,12 @@ void CFindDlg::OnInitMenu(CMenu* pMenu)
CBaseDialog::OnInitMenu(pMenu);

// TODO: 在此处添加消息处理程序代码
pMenu->SetDefaultItem(ID_PLAY_ITEM);
vector<SongInfo> 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));
}

Expand Down Expand Up @@ -644,3 +642,12 @@ void CFindDlg::OnDeleteFromDisk()
ShowFindResult();
}
}


void CFindDlg::OnPlayAsNext()
{
// TODO: 在此添加命令处理程序代码
vector<SongInfo> songs;
GetSongsSelected(songs);
CPlayer::GetInstance().PlayAfterCurrentTrack(songs);
}
1 change: 1 addition & 0 deletions MusicPlayer2/FindDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
};
17 changes: 16 additions & 1 deletion MusicPlayer2/MediaLibTabDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()


Expand Down Expand Up @@ -131,8 +132,13 @@ void CMediaLibTabDlg::OnInitMenu(CMenu* pMenu)
{
CTabDlg::OnInitMenu(pMenu);

// TODO: 在此处添加消息处理程序代码
// TODO: 在此处添加消息处理程序代码 vector<SongInfo> songs;
vector<SongInfo> 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));
}

Expand All @@ -144,6 +150,15 @@ void CMediaLibTabDlg::OnPlayItem()
}


void CMediaLibTabDlg::OnPlayAsNext()
{
// TODO: 在此添加命令处理程序代码
vector<SongInfo> songs;
GetSongsSelected(songs);
CPlayer::GetInstance().PlayAfterCurrentTrack(songs);
}


void CMediaLibTabDlg::OnPlayItemInFolderMode()
{
// TODO: 在此添加命令处理程序代码
Expand Down
1 change: 1 addition & 0 deletions MusicPlayer2/MediaLibTabDlg.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
3 changes: 2 additions & 1 deletion MusicPlayer2/MusicPlayer2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
16 changes: 9 additions & 7 deletions MusicPlayer2/MusicPlayer2.rc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion MusicPlayer2/MusicPlayerDlg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}
Expand Down
53 changes: 47 additions & 6 deletions MusicPlayer2/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -925,13 +925,33 @@ bool CPlayer::PlayTrack(int song_track, bool auto_next, bool play)
return valid;
}

bool CPlayer::PlayAfterCurrentTrack(vector<int> tracks_to_play) {
if (tracks_to_play.empty()) {
return false;
bool CPlayer::PlayAfterCurrentTrack(const std::vector<int>& tracks_to_play)
{
bool add{ false };
for (const int& track : tracks_to_play)
{
if (track >= 0 && track < static_cast<int>(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<SongInfo>& 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)
Expand Down Expand Up @@ -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<SongInfo>& 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<int>(m_playlist.size());
Expand Down
10 changes: 9 additions & 1 deletion MusicPlayer2/Player.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<int> tracks_to_play); //设置指定序号歌曲为下一首播放的歌曲
// 设置指定序号歌曲为下一首播放的歌曲,无效的index会被忽略
bool PlayAfterCurrentTrack(const std::vector<int>& tracks_to_play);
// 设置指定SongInfo为下一首播放的歌曲,不存在于m_playlist的条目会被忽略
bool PlayAfterCurrentTrack(const std::vector<SongInfo>& tracks_to_play);
private:
void LoopPlaylist(int& song_track);

Expand Down Expand Up @@ -348,6 +351,11 @@ class CPlayer

//获取播放列表的引用
vector<SongInfo>& GetPlayList() { return m_playlist; }

// 判断参数中的曲目是否存在于m_playlist,存在返回索引不存在返回-1(IsSameSong)
int IsSongInPlayList(const SongInfo& song);
// 判断参数中的曲目是否全部存在于m_playlist(IsSameSong)
bool IsSongsInPlayList(const vector<SongInfo>& songs_list);
//获取歌曲总数
int GetSongNum() const;
//获取当前播放曲目的目录
Expand Down

0 comments on commit 550e940

Please sign in to comment.