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