xref: /MusicPlayer2/MusicPlayer2/UIWindowCmdHelper.cpp (revision b02ea78914f3f3cea834525e3ae2052cd91d1e6d)
1 #include "stdafx.h"
2 #include "UIWindowCmdHelper.h"
3 #include "Player.h"
4 #include "UserUi.h"
5 #include "UiMediaLibItemMgr.h"
6 #include "MusicPlayerCmdHelper.h"
7 #include "PropertyDlg.h"
8 #include "COSUPlayerHelper.h"
9 #include "PlaylistPropertiesDlg.h"
10 #include "FolderPropertiesDlg.h"
11 #include "MediaLibItemPropertiesDlg.h"
12 #include "CRecentList.h"
13 
CUIWindowCmdHelper(UiElement::Element * sender)14 CUIWindowCmdHelper::CUIWindowCmdHelper(UiElement::Element* sender)
15     : m_context_menu_sender(sender)
16 {
17 }
18 
OnUiCommand(DWORD command)19 void CUIWindowCmdHelper::OnUiCommand(DWORD command)
20 {
21     //获取命令的发送者
22     UiElement::MediaLibItemList* medialib_item_list = dynamic_cast<UiElement::MediaLibItemList*>(m_context_menu_sender);
23     if (medialib_item_list != nullptr)
24     {
25         OnMediaLibItemListCommand(medialib_item_list, command);
26     }
27     UiElement::RecentPlayedList* recent_played_list = dynamic_cast<UiElement::RecentPlayedList*>(m_context_menu_sender);
28     if (recent_played_list != nullptr)
29     {
30         OnRecentPlayedListCommand(recent_played_list, command);
31     }
32     UiElement::MediaLibFolder* medialib_folder = dynamic_cast<UiElement::MediaLibFolder*>(m_context_menu_sender);
33     if (medialib_folder != nullptr)
34     {
35         OnMediaLibFolderCommand(medialib_folder, command);
36     }
37     UiElement::MediaLibPlaylist* medialib_playlist = dynamic_cast<UiElement::MediaLibPlaylist*>(m_context_menu_sender);
38     if (medialib_playlist != nullptr)
39     {
40         OnMediaLibPlaylistCommand(medialib_playlist, command);
41     }
42     UiElement::MyFavouriteList* my_favourite_list = dynamic_cast<UiElement::MyFavouriteList*>(m_context_menu_sender);
43     if (my_favourite_list != nullptr)
44     {
45         OnMyFavouriteListCommand(my_favourite_list, command);
46     }
47     UiElement::AllTracksList* all_tracks_list = dynamic_cast<UiElement::AllTracksList*>(m_context_menu_sender);
48     if (all_tracks_list != nullptr)
49     {
50         OnAllTracksListCommand(all_tracks_list, command);
51     }
52     UiElement::FolderExploreTree* folder_explore = dynamic_cast<UiElement::FolderExploreTree*>(m_context_menu_sender);
53     if (folder_explore != nullptr)
54     {
55         OnMedialibFolderExploreCommand(folder_explore, command);
56     }
57     UiElement::Playlist* playlist = dynamic_cast<UiElement::Playlist*>(m_context_menu_sender);
58     if (playlist != nullptr)
59     {
60         OnAddToPlaystCommand(playlist, command);
61     }
62     OnFolderOrPlaylistSortCommand(command);
63 }
64 
SetMenuState(CMenu * pMenu)65 void CUIWindowCmdHelper::SetMenuState(CMenu* pMenu)
66 {
67     if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::UiLibLeftMenu))
68     {
69         SetMediaLibItemListMenuState(pMenu);
70     }
71     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::LibSetPathMenu))
72     {
73         SetMediaLibFolderMenuState(pMenu);
74     }
75     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::LibPlaylistMenu))
76     {
77         SetMediaLibPlaylistMenuState(pMenu);
78     }
79     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::UiRecentPlayedMenu))
80     {
81         SetRecentPlayedListMenuState(pMenu);
82     }
83     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::UiMyFavouriteMenu))
84     {
85         SetMyFavouriteListMenuState(pMenu);
86     }
87     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::LibRightMenu))
88     {
89         SetAllTracksListMenuState(pMenu);
90     }
91     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::AddToPlaylistMenu))
92     {
93         SetAddToPlaylistMenuState(pMenu);
94     }
95     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::LibFolderSortMenu))
96     {
97         SetFolderSortMenuState(pMenu);
98     }
99     else if (pMenu == theApp.m_menu_mgr.GetMenu(MenuMgr::LibPlaylistSortMenu))
100     {
101         SetPlaylistSortMenuState(pMenu);
102     }
103     else
104     {
105         SetAddToPlaylistMenuState(pMenu);
106     }
107 }
108 
OnMediaLibItemListCommand(UiElement::MediaLibItemList * medialib_item_list,DWORD command)109 void CUIWindowCmdHelper::OnMediaLibItemListCommand(UiElement::MediaLibItemList* medialib_item_list, DWORD command)
110 {
111     std::wstring item_name = CUiMediaLibItemMgr::Instance().GetItemName(medialib_item_list->type, medialib_item_list->GetItemSelected());
112     std::wstring display_name = CUiMediaLibItemMgr::Instance().GetItemDisplayName(medialib_item_list->type, medialib_item_list->GetItemSelected());
113     auto getSongList = [&](std::vector<SongInfo>& song_list)
114         {
115             CMediaClassifier classifier(medialib_item_list->type);
116             classifier.ClassifyMedia();
117             song_list = classifier.GetMeidaList()[item_name];
118         };
119     CMusicPlayerCmdHelper helper;
120     ListItem list_item{ LT_MEDIA_LIB, item_name, medialib_item_list->type };
121 
122     //播放
123     if (command == ID_PLAY_ITEM)
124     {
125         helper.OnListItemSelected(list_item, true);
126     }
127     //添加到新播放列表
128     else if (command == ID_ADD_TO_NEW_PLAYLIST)
129     {
130         wstring playlist_path;
131         helper.OnAddToNewPlaylist(getSongList, playlist_path, display_name);
132     }
133 
134     //添加到新播放列表并播放
135     else if (command == ID_ADD_TO_NEW_PLAYLIST_AND_PLAY)
136     {
137         wstring playlist_path;
138         if (helper.OnAddToNewPlaylist(getSongList, playlist_path, display_name))
139         {
140             if (!CPlayer::GetInstance().SetPlaylist(playlist_path, 0, 0, true))
141             {
142                 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
143                 AfxMessageBox(info.c_str(), MB_ICONINFORMATION | MB_OK);
144             }
145         }
146     }
147     //复制文本
148     else if (command == ID_COPY_TEXT)
149     {
150         if (!CCommon::CopyStringToClipboard(display_name))
151             AfxMessageBox(theApp.m_str_table.LoadText(L"MSG_COPY_CLIPBOARD_FAILED").c_str(), MB_ICONWARNING);
152 
153     }
154     //在媒体库中查看
155     else if (command == ID_VIEW_IN_MEDIA_LIB)
156     {
157         CMusicPlayerCmdHelper::eMediaLibTab tab{};
158         switch (medialib_item_list->type)
159         {
160         case CMediaClassifier::CT_ARTIST: tab = CMusicPlayerCmdHelper::ML_ARTIST; break;
161         case CMediaClassifier::CT_ALBUM: tab = CMusicPlayerCmdHelper::ML_ALBUM; break;
162         case CMediaClassifier::CT_GENRE: tab = CMusicPlayerCmdHelper::ML_GENRE; break;
163         case CMediaClassifier::CT_YEAR: tab = CMusicPlayerCmdHelper::ML_YEAR; break;
164         case CMediaClassifier::CT_TYPE: tab = CMusicPlayerCmdHelper::ML_FILE_TYPE; break;
165         case CMediaClassifier::CT_BITRATE: tab = CMusicPlayerCmdHelper::ML_BITRATE; break;
166         case CMediaClassifier::CT_RATING: tab = CMusicPlayerCmdHelper::ML_RATING; break;
167         }
168         helper.OnViewInMediaLib(tab, item_name);
169     }
170     else
171     {
172         helper.OnAddToPlaylistCommand(getSongList, command);
173     }
174 }
175 
OnRecentPlayedListCommand(UiElement::RecentPlayedList * medialib_item_list,DWORD command)176 void CUIWindowCmdHelper::OnRecentPlayedListCommand(UiElement::RecentPlayedList* medialib_item_list, DWORD command)
177 {
178     int item_selected{ medialib_item_list->GetItemSelected() };
179     ListItem list_item = medialib_item_list->m_list_cache.GetItem(item_selected);
180     if (list_item.empty())
181         return;
182 
183     //播放
184     if (command == ID_PLAY_ITEM)
185     {
186         CMusicPlayerCmdHelper helper;
187         helper.OnListItemSelected(list_item, true);
188     }
189     //移除
190     else if (command == ID_RECENT_PLAYED_REMOVE)
191     {
192         wstring info = theApp.m_str_table.LoadTextFormat(L"MSG_DELETE_RECENTPLAYED_ITEM_INQUIRY", { list_item.GetTypeDisplayName(), list_item.GetDisplayName() });
193         if (AfxMessageBox(info.c_str(), MB_ICONQUESTION | MB_YESNO) == IDYES)
194             CRecentList::Instance().ResetLastPlayedTime(list_item);
195     }
196     //复制文本
197     else if (command == ID_COPY_TEXT)
198     {
199         if (!CCommon::CopyStringToClipboard(list_item.GetDisplayName()))
200             AfxMessageBox(theApp.m_str_table.LoadText(L"MSG_COPY_CLIPBOARD_FAILED").c_str(), MB_ICONWARNING);
201     }
202     //在媒体库中查看
203     else if (command == ID_VIEW_IN_MEDIA_LIB)
204     {
205         CMusicPlayerCmdHelper helper;
206         CMusicPlayerCmdHelper::eMediaLibTab tab{};
207         switch (list_item.type)
208         {
209         case LT_FOLDER: tab = CMusicPlayerCmdHelper::ML_FOLDER; break;
210         case LT_PLAYLIST: tab = CMusicPlayerCmdHelper::ML_PLAYLIST; break;
211         case LT_MEDIA_LIB:
212             switch (list_item.medialib_type)
213             {
214             case CMediaClassifier::CT_ARTIST: tab = CMusicPlayerCmdHelper::ML_ARTIST; break;
215             case CMediaClassifier::CT_ALBUM: tab = CMusicPlayerCmdHelper::ML_ALBUM; break;
216             case CMediaClassifier::CT_GENRE: tab = CMusicPlayerCmdHelper::ML_GENRE; break;
217             case CMediaClassifier::CT_YEAR: tab = CMusicPlayerCmdHelper::ML_YEAR; break;
218             case CMediaClassifier::CT_TYPE: tab = CMusicPlayerCmdHelper::ML_FILE_TYPE; break;
219             case CMediaClassifier::CT_BITRATE: tab = CMusicPlayerCmdHelper::ML_BITRATE; break;
220             case CMediaClassifier::CT_RATING: tab = CMusicPlayerCmdHelper::ML_RATING; break;
221             case CMediaClassifier::CT_NONE: tab = CMusicPlayerCmdHelper::ML_ALL; break;
222             }
223         }
224         helper.OnViewInMediaLib(tab, list_item.path);
225     }
226     //属性
227     else if (command == ID_LIB_RECENT_PLAYED_ITEM_PROPERTIES)
228     {
229         if (list_item.type == LT_FOLDER)
230         {
231             CFolderPropertiesDlg dlg(list_item);
232             dlg.DoModal();
233         }
234         else if (list_item.type == LT_PLAYLIST)
235         {
236             CPlaylistPropertiesDlg dlg(list_item);
237             dlg.DoModal();
238         }
239         else if (list_item.type == LT_MEDIA_LIB)
240         {
241             CMediaLibItemPropertiesDlg dlg(list_item);
242             dlg.DoModal();
243         }
244     }
245 }
246 
OnMediaLibFolderCommand(UiElement::MediaLibFolder * medialib_folder,DWORD command)247 void CUIWindowCmdHelper::OnMediaLibFolderCommand(UiElement::MediaLibFolder* medialib_folder, DWORD command)
248 {
249     int item_selected{ medialib_folder->GetItemSelected() };
250 
251     ListItem list_item = UiElement::MediaLibFolder::m_list_cache.GetItem(item_selected);
252     CMusicPlayerCmdHelper helper;
253 
254     auto getSongList = [&](std::vector<SongInfo>& song_list) {
255         CAudioCommon::GetAudioFiles(list_item.path, song_list, MAX_SONG_NUM, list_item.contain_sub_folder);
256         int cnt{};
257         bool flag{};
258         CAudioCommon::GetCueTracks(song_list, cnt, flag, MR_MIN_REQUIRED);
259     };
260 
261     if (command == ID_PLAY_PATH)
262     {
263         helper.OnListItemSelected(list_item, true);
264     }
265     else if (command == ID_DELETE_PATH)
266     {
267         helper.OnDeleteRecentListItem(list_item);
268     }
269     else if (command == ID_BROWSE_PATH)
270     {
271         ShellExecute(NULL, _T("open"), _T("explorer"), list_item.path.c_str(), NULL, SW_SHOWNORMAL);
272     }
273     else if (command == ID_CONTAIN_SUB_FOLDER)
274     {
275         // 如果是当前播放则使用CPlayer成员方法更改(会启动播放列表初始化)
276         if (CRecentList::Instance().IsCurrentList(list_item))
277         {
278             if (!CPlayer::GetInstance().SetContainSubFolder())
279             {
280                 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
281                 AfxMessageBox(info.c_str(), MB_ICONINFORMATION | MB_OK);
282             }
283         }
284         else
285         {
286             CRecentList::Instance().SetContainSubFolder(list_item);
287         }
288 
289     }
290     else if (command == ID_CLEAR_INVALID_PATH)
291     {
292         const wstring& inquiry_info = theApp.m_str_table.LoadText(L"MSG_LIB_PATH_CLEAR_INQUIRY");
293         if (AfxMessageBox(inquiry_info.c_str(), MB_ICONQUESTION | MB_OKCANCEL) == IDCANCEL)
294             return;
295         int cleard_cnt = CRecentList::Instance().RemoveItemIf([](const ListItem& list_item)
296             { return list_item.type == LT_FOLDER && !CAudioCommon::IsPathContainsAudioFile(list_item.path, list_item.contain_sub_folder); });
297         CRecentList::Instance().SaveData();
298         wstring complete_info = theApp.m_str_table.LoadTextFormat(L"MSG_LIB_PATH_CLEAR_COMPLETE", { cleard_cnt });
299         AfxMessageBox(complete_info.c_str(), MB_ICONINFORMATION | MB_OK);
300     }
301     else if (command == ID_FILE_OPEN_FOLDER)
302     {
303         helper.OnOpenFolder();
304     }
305     else if (command == ID_LIB_FOLDER_PROPERTIES)
306     {
307         CFolderPropertiesDlg dlg(list_item);
308         dlg.DoModal();
309     }
310     //添加到新播放列表
311     else if (command == ID_ADD_TO_NEW_PLAYLIST)
312     {
313         wstring playlist_path;
314         helper.OnAddToNewPlaylist(getSongList, playlist_path, CFilePathHelper(list_item.path).GetFolderName());
315     }
316     //添加到播放列表
317     else
318     {
319         helper.OnAddToPlaylistCommand(getSongList, command);
320     }
321 }
322 
OnMediaLibPlaylistCommand(UiElement::MediaLibPlaylist * medialib_folder,DWORD command)323 void CUIWindowCmdHelper::OnMediaLibPlaylistCommand(UiElement::MediaLibPlaylist* medialib_folder, DWORD command)
324 {
325     int item_selected{ medialib_folder->GetItemSelected() };
326     ListItem list_item = medialib_folder->m_list_cache.GetItem(item_selected);
327     CMusicPlayerCmdHelper helper;
328 
329     if (command == ID_PLAY_PLAYLIST)
330     {
331         helper.OnListItemSelected(list_item, true);
332     }
333     else if (command == ID_RENAME_PLAYLIST)
334     {
335         helper.OnRenamePlaylist(list_item);
336     }
337     else if (command == ID_DELETE_PLAYLIST)
338     {
339         helper.OnDeleteRecentListItem(list_item);
340     }
341     else if (command == ID_SAVE_AS_NEW_PLAYLIST)
342     {
343         helper.OnNewPlaylist(list_item.path);
344     }
345     else if (command == ID_PLAYLIST_SAVE_AS)
346     {
347         helper.OnPlaylistSaveAs(list_item.path);
348 
349     }
350     else if (command == ID_PLAYLIST_BROWSE_FILE)
351     {
352         if (!list_item.path.empty())
353         {
354             CString str;
355             str.Format(_T("/select,\"%s\""), list_item.path.c_str());
356             ShellExecute(NULL, _T("open"), _T("explorer"), str, NULL, SW_SHOWNORMAL);
357         }
358     }
359     else if (command == ID_PLAYLIST_FIX_PATH_ERROR)
360     {
361         helper.OnPlaylistFixPathError(list_item.path);
362     }
363     else if (command == ID_NEW_PLAYLIST)
364     {
365         helper.OnNewPlaylist();
366     }
367     else if (command == ID_LIB_PLAYLIST_PROPERTIES)
368     {
369         CPlaylistPropertiesDlg dlg(list_item);
370         dlg.DoModal();
371     }
372 }
373 
OnSongListCommand(const std::vector<SongInfo> & songs,DWORD command)374 bool CUIWindowCmdHelper::OnSongListCommand(const std::vector<SongInfo>& songs, DWORD command)
375 {
376     if (songs.empty())
377         return false;
378 
379     auto getSongList = [&](std::vector<SongInfo>& song_list) {
380         song_list = songs;
381     };
382 
383     CMusicPlayerCmdHelper helper;
384     //下一首播放
385     if (command == ID_PLAY_AS_NEXT)
386     {
387         CPlayer::GetInstance().PlayAfterCurrentTrack(songs);
388     }
389     //在文件夹模式中播放
390     else if (command == ID_PLAY_ITEM_IN_FOLDER_MODE)
391     {
392         if (!CPlayer::GetInstance().OpenASongInFolderMode(songs.front(), true))
393         {
394             const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
395             AfxMessageBox(info.c_str(), MB_ICONINFORMATION | MB_OK);
396         }
397     }
398     //在线查看
399     else if (command == ID_EXPLORE_ONLINE)
400     {
401         static SongInfo song_view_online;
402         song_view_online = songs.front();
403         AfxBeginThread(CMusicPlayerCmdHelper::ViewOnlineThreadFunc, (LPVOID)&song_view_online);
404     }
405     //格式转换
406     else if (command == ID_FORMAT_CONVERT)
407     {
408         helper.FormatConvert(songs);
409     }
410     //打开文件位置
411     else if (command == ID_EXPLORE_TRACK)
412     {
413         CString str;
414         str.Format(_T("/select,\"%s\""), songs.front().file_path.c_str());
415         ShellExecute(NULL, _T("open"), _T("explorer"), str, NULL, SW_SHOWNORMAL);
416     }
417     //从磁盘删除
418     else if (command == ID_DELETE_FROM_DISK)
419     {
420         helper.DeleteSongsFromDisk(songs);
421     }
422     //分级
423     else if ((command >= ID_RATING_1 && command <= ID_RATING_5) || command == ID_RATING_NONE)    //如果命令是歌曲分级(应确保分级命令的ID是连续的)
424     {
425         helper.OnRating(songs.front(), command);
426     }
427     //添加到新播放列表
428     else if (command == ID_ADD_TO_NEW_PLAYLIST)
429     {
430         wstring playlist_path;
431         helper.OnAddToNewPlaylist(getSongList, playlist_path);
432     }
433     //添加到播放列表
434     else
435     {
436         return helper.OnAddToPlaylistCommand(getSongList, command);
437     }
438     return true;
439 }
440 
OnMyFavouriteListCommand(UiElement::MyFavouriteList * my_favourite_list,DWORD command)441 void CUIWindowCmdHelper::OnMyFavouriteListCommand(UiElement::MyFavouriteList* my_favourite_list, DWORD command)
442 {
443     std::vector<int> indexes;
444     my_favourite_list->GetItemsSelected(indexes);
445     vector<SongInfo> songs;
446     for (int i : indexes)
447     {
448         if (i >= 0 && i < CUiMyFavouriteItemMgr::Instance().GetSongCount())
449             songs.push_back(CUiMyFavouriteItemMgr::Instance().GetSongInfo(i));
450     }
451 
452     if (songs.empty())
453         return;
454 
455     int item_selected{ my_favourite_list->GetItemSelected() };
456     SongInfo song_info{ CUiMyFavouriteItemMgr::Instance().GetSongInfo(item_selected) };
457 
458     CMusicPlayerCmdHelper helper;
459 
460     if (!OnSongListCommand(songs, command))
461     {
462         //播放
463         if (command == ID_PLAY_ITEM)
464         {
465             helper.OnPlayMyFavourite(song_info);
466         }
467         //从列表中删除
468         else if (command == ID_REMOVE_FROM_PLAYLIST)
469         {
470             helper.OnRemoveFromPlaylist(CRecentList::Instance().GetSpecPlaylist(CRecentList::PT_FAVOURITE), songs);
471         }
472         //属性
473         else if (command == ID_ITEM_PROPERTY)
474         {
475             if (my_favourite_list->IsMultipleSelected())
476             {
477                 CPropertyDlg dlg(songs);
478                 dlg.DoModal();
479             }
480             else
481             {
482                 std::vector<SongInfo> song_list;
483                 CUiMyFavouriteItemMgr::Instance().GetSongList(song_list);
484                 CPropertyDlg dlg(song_list, item_selected, false);
485                 dlg.DoModal();
486             }
487         }
488         //复制文本
489         else if (command == ID_COPY_TEXT)
490         {
491             std::wstring text = my_favourite_list->GetItemText(item_selected, UiElement::MyFavouriteList::COL_TRACK);
492             if (!CCommon::CopyStringToClipboard(text))
493                 AfxMessageBox(theApp.m_str_table.LoadText(L"MSG_COPY_CLIPBOARD_FAILED").c_str(), MB_ICONWARNING);
494         }
495     }
496 }
497 
OnAllTracksListCommand(UiElement::AllTracksList * all_tracks_list,DWORD command)498 void CUIWindowCmdHelper::OnAllTracksListCommand(UiElement::AllTracksList* all_tracks_list, DWORD command)
499 {
500     std::vector<int> indexes;
501     all_tracks_list->GetItemsSelected(indexes);
502     vector<SongInfo> songs;
503     for (int i : indexes)
504     {
505         if (i >= 0 && i < CUiAllTracksMgr::Instance().GetSongCount())
506             songs.push_back(CUiAllTracksMgr::Instance().GetSongInfo(i));
507     }
508 
509     if (songs.empty())
510         return;
511 
512     int item_selected{ all_tracks_list->GetItemSelected() };
513 
514     CMusicPlayerCmdHelper helper;
515 
516     if (!OnSongListCommand(songs, command))
517     {
518         //播放
519         if (command == ID_PLAY_ITEM)
520         {
521             const SongInfo& song_info = CUiAllTracksMgr::Instance().GetSongInfo(item_selected);
522             helper.OnPlayAllTrack(song_info);
523         }
524         //属性
525         else if (command == ID_ITEM_PROPERTY)
526         {
527             if (all_tracks_list->IsMultipleSelected())
528             {
529                 CPropertyDlg dlg(songs);
530                 dlg.DoModal();
531             }
532             else
533             {
534                 std::vector<SongInfo> song_list;
535                 CUiAllTracksMgr::Instance().GetSongList(song_list);
536                 CPropertyDlg dlg(song_list, item_selected, false);
537                 dlg.DoModal();
538             }
539         }
540         //复制文本
541         else if (command == ID_COPY_TEXT)
542         {
543             std::wstring text = all_tracks_list->GetItemText(item_selected, UiElement::AllTracksList::COL_TRACK);
544             if (!CCommon::CopyStringToClipboard(text))
545                 AfxMessageBox(theApp.m_str_table.LoadText(L"MSG_COPY_CLIPBOARD_FAILED").c_str(), MB_ICONWARNING);
546         }
547 
548     }
549 }
550 
OnMedialibFolderExploreCommand(UiElement::FolderExploreTree * folder_explore,DWORD command)551 void CUIWindowCmdHelper::OnMedialibFolderExploreCommand(UiElement::FolderExploreTree* folder_explore, DWORD command)
552 {
553     std::wstring folder_path = folder_explore->GetSelectedPath();
554     if (folder_path.empty())
555         return;
556 
557     std::wstring folder_name = folder_explore->GetItemText(folder_explore->GetItemSelected(), UiElement::FolderExploreTree::COL_NAME);
558 
559     CMusicPlayerCmdHelper helper;
560 
561     auto getSongList = [&](std::vector<SongInfo>& song_list) {
562         if (COSUPlayerHelper::IsOsuFolder(folder_path))
563             COSUPlayerHelper::GetOSUAudioFiles(folder_path, song_list);
564         else
565             CAudioCommon::GetAudioFiles(folder_path, song_list, MAX_SONG_NUM, true);
566     };
567 
568     //播放
569     if (command == ID_PLAY_ITEM)
570     {
571         helper.OnOpenFolder(folder_path, true, true);
572     }
573     //添加到新播放列表并播放
574     else if (command == ID_ADD_TO_NEW_PLAYLIST_AND_PLAY)
575     {
576         wstring playlist_path;
577         if (helper.OnAddToNewPlaylist(getSongList, playlist_path, folder_name))
578         {
579             if (!CPlayer::GetInstance().SetPlaylist(playlist_path, 0, 0, true))
580             {
581                 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
582                 AfxMessageBox(info.c_str(), MB_ICONINFORMATION | MB_OK);
583             }
584         }
585     }
586     //复制文本
587     else if (command == ID_COPY_TEXT)
588     {
589         if (!CCommon::CopyStringToClipboard(folder_name))
590             AfxMessageBox(theApp.m_str_table.LoadText(L"MSG_COPY_CLIPBOARD_FAILED").c_str(), MB_ICONWARNING);
591     }
592     //打开文件夹位置
593     else if (command == ID_BROWSE_PATH)
594     {
595         ShellExecute(NULL, _T("open"), _T("explorer"), folder_path.c_str(), NULL, SW_SHOWNORMAL);
596     }
597     //添加到新播放列表
598     else if (command == ID_ADD_TO_NEW_PLAYLIST)
599     {
600         wstring playlist_path;
601         helper.OnAddToNewPlaylist(getSongList, playlist_path, folder_name);
602     }
603     //添加到播放列表
604     else
605     {
606         helper.OnAddToPlaylistCommand(getSongList, command);
607     }
608 
609 }
610 
OnAddToPlaystCommand(UiElement::Playlist * playlist,DWORD command)611 void CUIWindowCmdHelper::OnAddToPlaystCommand(UiElement::Playlist* playlist, DWORD command)
612 {
613     int item_selected{ playlist->GetItemSelected() };
614     if (item_selected < 0 || item_selected >= CPlayer::GetInstance().GetSongNum())
615         return;
616     const SongInfo& song_info = CPlayer::GetInstance().GetPlayList()[item_selected];
617     CMusicPlayerCmdHelper helper;
618     auto getSongList = [&](std::vector<SongInfo>& song_list) {
619         song_list.clear();
620         song_list.push_back(song_info);
621         };
622     //添加到新播放列表
623     if (command == ID_ADD_TO_NEW_PLAYLIST)
624     {
625         wstring playlist_path;
626         helper.OnAddToNewPlaylist(getSongList, playlist_path);
627     }
628     else
629     {
630         helper.OnAddToPlaylistCommand(getSongList, command);
631     }
632 }
633 
OnFolderOrPlaylistSortCommand(DWORD command)634 void CUIWindowCmdHelper::OnFolderOrPlaylistSortCommand(DWORD command)
635 {
636     //文件夹-最近播放
637     if (command == ID_LIB_FOLDER_SORT_RECENT_PLAYED)
638     {
639         CRecentList::Instance().SetSortMode(LT_FOLDER, CRecentList::listSortMode::SM_RECENT_PLAYED);
640     }
641     //文件夹-最近添加
642     else if (command == ID_LIB_FOLDER_SORT_RECENT_ADDED)
643     {
644         CRecentList::Instance().SetSortMode(LT_FOLDER, CRecentList::listSortMode::SM_RECENT_CREATED);
645     }
646     //文件夹-路径
647     else if (command == ID_LIB_FOLDER_SORT_PATH)
648     {
649         CRecentList::Instance().SetSortMode(LT_FOLDER, CRecentList::listSortMode::SM_PATH);
650     }
651     //播放列表-最近播放
652     else if (command == ID_LIB_PLAYLIST_SORT_RECENT_PLAYED)
653     {
654         CRecentList::Instance().SetSortMode(LT_PLAYLIST, CRecentList::listSortMode::SM_RECENT_PLAYED);
655         theApp.m_pMainWnd->SendMessage(WM_INIT_ADD_TO_MENU);
656     }
657     //播放列表-最近创建
658     else if (command == ID_LIB_PLAYLIST_SORT_RECENT_CREATED)
659     {
660         CRecentList::Instance().SetSortMode(LT_PLAYLIST, CRecentList::listSortMode::SM_RECENT_CREATED);
661         theApp.m_pMainWnd->SendMessage(WM_INIT_ADD_TO_MENU);
662     }
663     //播放列表-名称
664     else if (command == ID_LIB_PLAYLIST_SORT_NAME)
665     {
666         CRecentList::Instance().SetSortMode(LT_PLAYLIST, CRecentList::listSortMode::SM_PATH);
667         theApp.m_pMainWnd->SendMessage(WM_INIT_ADD_TO_MENU);
668     }
669 }
670 
SetRecentPlayedListMenuState(CMenu * pMenu)671 void CUIWindowCmdHelper::SetRecentPlayedListMenuState(CMenu* pMenu)
672 {
673     UiElement::RecentPlayedList* recent_played = dynamic_cast<UiElement::RecentPlayedList*>(m_context_menu_sender);
674     if (recent_played != nullptr)
675     {
676         int item_selected{ recent_played->GetItemSelected() };
677         //最近播放中排在第一个的项目为正在播放的项目,不允许移除
678         pMenu->EnableMenuItem(ID_RECENT_PLAYED_REMOVE, MF_BYCOMMAND | (item_selected > 0 ? MF_ENABLED : MF_GRAYED));
679     }
680 }
681 
SetMediaLibItemListMenuState(CMenu * pMenu)682 void CUIWindowCmdHelper::SetMediaLibItemListMenuState(CMenu* pMenu)
683 {
684     //设置“添加到播放列表”子菜单项的可用状态
685     SetAddToPlaylistMenuState(pMenu);
686 }
687 
SetMediaLibFolderMenuState(CMenu * pMenu)688 void CUIWindowCmdHelper::SetMediaLibFolderMenuState(CMenu* pMenu)
689 {
690     bool select_valid{};
691     bool contain_sub_folder{};
692     UiElement::MediaLibFolder* medialib_folder{ dynamic_cast<UiElement::MediaLibFolder*>(m_context_menu_sender) };
693     if (medialib_folder != nullptr)
694     {
695         int item_selected{ medialib_folder->GetItemSelected() };
696         ListItem list_item = UiElement::MediaLibFolder::m_list_cache.GetItem(item_selected);
697         select_valid = !list_item.empty();
698         contain_sub_folder = list_item.contain_sub_folder;
699     }
700 
701     pMenu->EnableMenuItem(ID_PLAY_PATH, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
702     pMenu->EnableMenuItem(ID_DELETE_PATH, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
703     pMenu->EnableMenuItem(ID_BROWSE_PATH, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
704     pMenu->EnableMenuItem(ID_CONTAIN_SUB_FOLDER, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
705     pMenu->CheckMenuItem(ID_CONTAIN_SUB_FOLDER, MF_BYCOMMAND | (select_valid && contain_sub_folder ? MF_CHECKED : MF_UNCHECKED));
706     pMenu->EnableMenuItem(ID_LIB_FOLDER_PROPERTIES, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
707 
708     SetAddToPlaylistMenuState(pMenu);
709 }
710 
SetMediaLibPlaylistMenuState(CMenu * pMenu)711 void CUIWindowCmdHelper::SetMediaLibPlaylistMenuState(CMenu* pMenu)
712 {
713     bool select_valid{};
714     ListItem selected_playlist;
715     UiElement::MediaLibPlaylist* medialib_playlist = dynamic_cast<UiElement::MediaLibPlaylist*>(m_context_menu_sender);
716     if (medialib_playlist != nullptr)
717     {
718         int item_selected{ medialib_playlist->GetItemSelected() };
719         selected_playlist = medialib_playlist->m_list_cache.GetItem(item_selected);
720         select_valid = !selected_playlist.empty();
721     }
722 
723     bool selected_can_play{ select_valid && !CRecentList::Instance().IsCurrentList(selected_playlist) };
724 
725     bool is_spec_playlist = CRecentList::IsSpecPlaylist(selected_playlist);
726     bool is_cant_del = CRecentList::IsSpecPlaylist(selected_playlist, CRecentList::PT_DEFAULT) || CRecentList::IsSpecPlaylist(selected_playlist, CRecentList::PT_FAVOURITE);
727     pMenu->EnableMenuItem(ID_RENAME_PLAYLIST, MF_BYCOMMAND | (select_valid && !is_spec_playlist ? MF_ENABLED : MF_GRAYED));
728     pMenu->EnableMenuItem(ID_DELETE_PLAYLIST, MF_BYCOMMAND | (select_valid && !is_cant_del ? MF_ENABLED : MF_GRAYED));
729     pMenu->EnableMenuItem(ID_PLAY_PLAYLIST, MF_BYCOMMAND | (selected_can_play ? MF_ENABLED : MF_GRAYED));
730     pMenu->EnableMenuItem(ID_SAVE_AS_NEW_PLAYLIST, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
731     pMenu->EnableMenuItem(ID_PLAYLIST_SAVE_AS, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
732     pMenu->EnableMenuItem(ID_PLAYLIST_FIX_PATH_ERROR, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
733     pMenu->EnableMenuItem(ID_PLAYLIST_BROWSE_FILE, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
734 }
735 
SetMyFavouriteListMenuState(CMenu * pMenu)736 void CUIWindowCmdHelper::SetMyFavouriteListMenuState(CMenu* pMenu)
737 {
738     bool selected_in_current_playing_list{ false }; //选中是否正在播放
739     bool can_del{ false };
740     UiElement::MyFavouriteList* my_favourite_list = dynamic_cast<UiElement::MyFavouriteList*>(m_context_menu_sender);
741     if (my_favourite_list != nullptr)
742     {
743         int item_selected{ my_favourite_list->GetItemSelected() };
744         if (item_selected >= 0 && item_selected < static_cast<int>(CUiMyFavouriteItemMgr::Instance().GetSongCount()))
745         {
746             //获取选中曲目
747             const SongInfo& selected_song{ CUiMyFavouriteItemMgr::Instance().GetSongInfo(item_selected) };
748             std::vector<SongInfo> selected_songs{ selected_song };
749             //判断是否可以下一首播放
750             selected_in_current_playing_list = CPlayer::GetInstance().IsSongsInPlayList(selected_songs);
751             //判断是否可以从磁盘删除
752             can_del = !theApp.m_media_lib_setting_data.disable_delete_from_disk &&
753                 !selected_song.is_cue &&
754                 !COSUPlayerHelper::IsOsuFile(selected_song.file_path);
755         }
756     }
757 
758     pMenu->EnableMenuItem(ID_PLAY_AS_NEXT, MF_BYCOMMAND | (selected_in_current_playing_list ? MF_ENABLED : MF_GRAYED));
759     pMenu->EnableMenuItem(ID_DELETE_FROM_DISK, MF_BYCOMMAND | (can_del ? MF_ENABLED : MF_GRAYED));
760 
761     SetAddToPlaylistMenuState(pMenu);
762 }
763 
SetAllTracksListMenuState(CMenu * pMenu)764 void CUIWindowCmdHelper::SetAllTracksListMenuState(CMenu* pMenu)
765 {
766     bool selected_in_current_playing_list{ false }; //选中是否正在播放
767     bool can_del{ false };
768     UiElement::AllTracksList* all_tracks_list = dynamic_cast<UiElement::AllTracksList*>(m_context_menu_sender);
769     if (all_tracks_list != nullptr)
770     {
771         int item_selected{ all_tracks_list->GetItemSelected() };
772         if (item_selected >= 0 && item_selected < static_cast<int>(CUiAllTracksMgr::Instance().GetSongCount()))
773         {
774             //获取选中曲目
775             const SongInfo& selected_song{ CUiAllTracksMgr::Instance().GetSongInfo(item_selected) };
776             std::vector<SongInfo> selected_songs{ selected_song };
777             //判断是否可以下一首播放
778             selected_in_current_playing_list = CPlayer::GetInstance().IsSongsInPlayList(selected_songs);
779             //判断是否可以从磁盘删除
780             can_del = !theApp.m_media_lib_setting_data.disable_delete_from_disk &&
781                 !selected_song.is_cue &&
782                 !COSUPlayerHelper::IsOsuFile(selected_song.file_path);
783         }
784     }
785 
786     pMenu->EnableMenuItem(ID_PLAY_AS_NEXT, MF_BYCOMMAND | (selected_in_current_playing_list ? MF_ENABLED : MF_GRAYED));
787     pMenu->EnableMenuItem(ID_DELETE_FROM_DISK, MF_BYCOMMAND | (can_del ? MF_ENABLED : MF_GRAYED));
788     SetAddToPlaylistMenuState(pMenu);
789 }
790 
SetAddToPlaylistMenuState(CMenu * pMenu)791 void CUIWindowCmdHelper::SetAddToPlaylistMenuState(CMenu* pMenu)
792 {
793     //判断菜单的发送者
794     UiElement::Playlist* playlist{ dynamic_cast<UiElement::Playlist*>(m_context_menu_sender) };
795     UiElement::MyFavouriteList* my_favourite_list{ dynamic_cast<UiElement::MyFavouriteList*>(m_context_menu_sender) };
796     UiElement::ListElement* list_element{ dynamic_cast<UiElement::ListElement*>(m_context_menu_sender) };
797 
798     //设置默认状态
799     if (list_element != nullptr)
800     {
801         bool select_valid{ list_element->GetItemSelected() >= 0 };
802         for (UINT id = ID_ADD_TO_DEFAULT_PLAYLIST; id < ID_ADD_TO_MY_FAVOURITE + ADD_TO_PLAYLIST_MAX_SIZE + 1; id++)
803         {
804             pMenu->EnableMenuItem(id, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
805         }
806         pMenu->EnableMenuItem(ID_ADD_TO_NEW_PLAYLIST, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
807         pMenu->EnableMenuItem(ID_ADD_TO_OTHER_PLAYLIST, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
808     }
809     else
810     {
811         for (UINT id = ID_ADD_TO_DEFAULT_PLAYLIST; id < ID_ADD_TO_MY_FAVOURITE + ADD_TO_PLAYLIST_MAX_SIZE + 1; id++)
812         {
813             pMenu->EnableMenuItem(id, MF_BYCOMMAND | MF_ENABLED);
814         }
815         pMenu->EnableMenuItem(ID_ADD_TO_NEW_PLAYLIST, MF_BYCOMMAND | MF_ENABLED);
816         pMenu->EnableMenuItem(ID_ADD_TO_OTHER_PLAYLIST, MF_BYCOMMAND | MF_ENABLED);
817     }
818 
819     //设置播放列表和我喜欢的音乐“添加到”子菜单的状态
820     wstring disable_item_name;
821     if (my_favourite_list)
822     {
823         disable_item_name = theApp.m_str_table.LoadMenuText(L"ADD_TO_PLAYLIST", L"ID_ADD_TO_MY_FAVOURITE");
824     }
825     else if (playlist)
826     {
827         ListItem list_item = CRecentList::Instance().GetCurrentList();
828         if (CRecentList::IsSpecPlaylist(list_item, CRecentList::PT_DEFAULT))
829             disable_item_name = theApp.m_str_table.LoadMenuText(L"ADD_TO_PLAYLIST", L"ID_ADD_TO_DEFAULT_PLAYLIST");
830         else if (CRecentList::IsSpecPlaylist(list_item, CRecentList::PT_FAVOURITE))
831             disable_item_name = theApp.m_str_table.LoadMenuText(L"ADD_TO_PLAYLIST", L"ID_ADD_TO_MY_FAVOURITE");
832         else if (!CRecentList::IsSpecPlaylist(list_item, CRecentList::PT_TEMP)) // 临时播放列表不会出现在菜单中,所以不用禁用
833             disable_item_name = CFilePathHelper(list_item.path).GetFileNameWithoutExtension();
834     }
835     if (!disable_item_name.empty())
836     {
837         for (UINT id = ID_ADD_TO_DEFAULT_PLAYLIST; id < ID_ADD_TO_MY_FAVOURITE + ADD_TO_PLAYLIST_MAX_SIZE + 1; id++)
838         {
839             CString menu_string;
840             pMenu->GetMenuString(id, menu_string, 0);
841             pMenu->EnableMenuItem(id, MF_BYCOMMAND | (disable_item_name != menu_string.GetString() ? MF_ENABLED : MF_GRAYED));
842         }
843     }
844 }
845 
SetFolderSortMenuState(CMenu * pMenu)846 void CUIWindowCmdHelper::SetFolderSortMenuState(CMenu* pMenu)
847 {
848     switch (CRecentList::Instance().GetSortMode(LT_FOLDER))
849     {
850     case CRecentList::listSortMode::SM_RECENT_PLAYED: pMenu->CheckMenuRadioItem(ID_LIB_FOLDER_SORT_RECENT_PLAYED, ID_LIB_FOLDER_SORT_PATH, ID_LIB_FOLDER_SORT_RECENT_PLAYED, MF_BYCOMMAND | MF_CHECKED); break;
851     case CRecentList::listSortMode::SM_RECENT_CREATED: pMenu->CheckMenuRadioItem(ID_LIB_FOLDER_SORT_RECENT_PLAYED, ID_LIB_FOLDER_SORT_PATH, ID_LIB_FOLDER_SORT_RECENT_ADDED, MF_BYCOMMAND | MF_CHECKED); break;
852     case CRecentList::listSortMode::SM_PATH: pMenu->CheckMenuRadioItem(ID_LIB_FOLDER_SORT_RECENT_PLAYED, ID_LIB_FOLDER_SORT_PATH, ID_LIB_FOLDER_SORT_PATH, MF_BYCOMMAND | MF_CHECKED); break;
853     }
854 }
855 
SetPlaylistSortMenuState(CMenu * pMenu)856 void CUIWindowCmdHelper::SetPlaylistSortMenuState(CMenu* pMenu)
857 {
858     switch (CRecentList::Instance().GetSortMode(LT_PLAYLIST))
859     {
860     case CRecentList::listSortMode::SM_RECENT_PLAYED: pMenu->CheckMenuRadioItem(ID_LIB_PLAYLIST_SORT_RECENT_PLAYED, ID_LIB_PLAYLIST_SORT_NAME, ID_LIB_PLAYLIST_SORT_RECENT_PLAYED, MF_BYCOMMAND | MF_CHECKED); break;
861     case CRecentList::listSortMode::SM_RECENT_CREATED: pMenu->CheckMenuRadioItem(ID_LIB_PLAYLIST_SORT_RECENT_PLAYED, ID_LIB_PLAYLIST_SORT_NAME, ID_LIB_PLAYLIST_SORT_RECENT_CREATED, MF_BYCOMMAND | MF_CHECKED); break;
862     case CRecentList::listSortMode::SM_PATH: pMenu->CheckMenuRadioItem(ID_LIB_PLAYLIST_SORT_RECENT_PLAYED, ID_LIB_PLAYLIST_SORT_NAME, ID_LIB_PLAYLIST_SORT_NAME, MF_BYCOMMAND | MF_CHECKED); break;
863     }
864 }
865