1 // FindDlg.cpp : 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "FindDlg.h"
8 #include "MusicPlayerCmdHelper.h"
9 #include "PropertyDlg.h"
10 #include "Playlist.h"
11 #include "AddToPlaylistDlg.h"
12 #include "SongDataManager.h"
13 #include "COSUPlayerHelper.h"
14 #include "IniHelper.h"
15
16
17 // CFindDlg 对话框
18
IMPLEMENT_DYNAMIC(CFindDlg,CTabDlg)19 IMPLEMENT_DYNAMIC(CFindDlg, CTabDlg)
20
21 CFindDlg::CFindDlg(CWnd* pParent /*=NULL*/)
22 : CTabDlg(IDD_FIND_DIALOG, pParent)
23 {
24
25 }
26
~CFindDlg()27 CFindDlg::~CFindDlg()
28 {
29 }
30
OnTabEntered()31 void CFindDlg::OnTabEntered()
32 {
33 SetPlaySelectedEnable(m_find_result_list.GetCurSel() > 0);
34 }
35
InitializeControls()36 bool CFindDlg::InitializeControls()
37 {
38 wstring temp;
39 temp = theApp.m_str_table.LoadText(L"TITLE_FIND");
40 SetWindowTextW(temp.c_str());
41 temp = theApp.m_str_table.LoadText(L"TXT_FIND_KEY_WORD_INPUT");
42 SetDlgItemTextW(IDC_TXT_FIND_KEY_WORD_INPUT_STATIC, temp.c_str());
43 // IDC_FIND_EDIT
44 temp = theApp.m_str_table.LoadText(L"TXT_FIND_FIND");
45 SetDlgItemTextW(IDC_FIND_BUTTON, temp.c_str());
46 temp = theApp.m_str_table.LoadText(L"TXT_FIND_FIND_RANGE");
47 SetDlgItemTextW(IDC_TXT_FIND_FIND_RANGE_STATIC, temp.c_str());
48 temp = theApp.m_str_table.LoadText(L"TXT_FIND_CURRENT_PLAYLIST");
49 SetDlgItemTextW(IDC_FIND_CURRENT_PLAYLIST_RADIO, temp.c_str());
50 temp = theApp.m_str_table.LoadText(L"TXT_FIND_MEDIA_LIB");
51 SetDlgItemTextW(IDC_FIND_ALL_PLAYLIST_RADIO, temp.c_str());
52 temp = theApp.m_str_table.LoadText(L"TXT_FIND_OPT");
53 SetDlgItemTextW(IDC_TXT_FIND_OPT_STATIC, temp.c_str());
54 temp = theApp.m_str_table.LoadText(L"TXT_FIND_OPT_FILE_NAME");
55 SetDlgItemTextW(IDC_FIND_FILE_CHECK, temp.c_str());
56 temp = theApp.m_str_table.LoadText(L"TXT_FIND_OPT_TITLE");
57 SetDlgItemTextW(IDC_FIND_TITLE_CHECK, temp.c_str());
58 temp = theApp.m_str_table.LoadText(L"TXT_FIND_OPT_ARTIST");
59 SetDlgItemTextW(IDC_FIND_ARTIST_CHECK, temp.c_str());
60 temp = theApp.m_str_table.LoadText(L"TXT_FIND_OPT_ALBUM");
61 SetDlgItemTextW(IDC_FIND_ALBUM_CHECK, temp.c_str());
62 temp = theApp.m_str_table.LoadText(L"TXT_FIND_RESULT_LAST");
63 SetDlgItemTextW(IDC_FIND_RESULT_STATIC, temp.c_str());
64 temp = L"";
65 SetDlgItemTextW(IDC_FIND_INFO_STATIC, temp.c_str());
66
67 RepositionTextBasedControls({
68 { CtrlTextInfo::L1, IDC_TXT_FIND_KEY_WORD_INPUT_STATIC },
69 { CtrlTextInfo::C0, IDC_FIND_EDIT },
70 { CtrlTextInfo::R1, IDC_FIND_BUTTON, CtrlTextInfo::W32 }
71 }, CtrlTextInfo::W128);
72 return true;
73 }
74
DoDataExchange(CDataExchange * pDX)75 void CFindDlg::DoDataExchange(CDataExchange* pDX)
76 {
77 CTabDlg::DoDataExchange(pDX);
78 DDX_Control(pDX, IDC_FIND_LIST, m_find_result_list);
79 DDX_Control(pDX, IDC_FIND_FILE_CHECK, m_find_file_check);
80 DDX_Control(pDX, IDC_FIND_TITLE_CHECK, m_find_title_check);
81 DDX_Control(pDX, IDC_FIND_ARTIST_CHECK, m_find_artist_check);
82 DDX_Control(pDX, IDC_FIND_ALBUM_CHECK, m_find_album_check);
83 }
84
ShowFindResult()85 void CFindDlg::ShowFindResult()
86 {
87 m_find_result_list.DeleteAllItems();
88 CString str;
89 for (size_t i{}; i < m_find_result.size(); i++)
90 {
91 str.Format(_T("%u"), i + 1);
92 m_find_result_list.InsertItem(i, str);
93 m_find_result_list.SetItemText(i, COL_FILE_NAME, m_find_result[i].GetFileName().c_str());
94 m_find_result_list.SetItemText(i, COL_TITLE, m_find_result[i].GetTitle().c_str());
95 m_find_result_list.SetItemText(i, COL_ARTIST, m_find_result[i].GetArtist().c_str());
96 m_find_result_list.SetItemText(i, COL_ALBUM, m_find_result[i].GetAlbum().c_str());
97 m_find_result_list.SetItemText(i, COL_PATH, m_find_result[i].file_path.c_str());
98 }
99 }
100
ShowFindInfo()101 void CFindDlg::ShowFindInfo()
102 {
103 wstring str = theApp.m_str_table.LoadTextFormat(L"TXT_FIND_RESULT_INFO", { m_key_word, m_find_result.size() });
104 SetDlgItemText(IDC_FIND_INFO_STATIC, str.c_str());
105 ShowDlgCtrl(IDC_FIND_INFO_STATIC, !m_key_word.empty());
106 }
107
_OnAddToNewPlaylist(std::wstring & playlist_path)108 bool CFindDlg::_OnAddToNewPlaylist(std::wstring& playlist_path)
109 {
110 auto getSongList = [&](std::vector<SongInfo>& song_list)
111 {
112 GetSongsSelected(song_list);
113 };
114 CMusicPlayerCmdHelper cmd_helper(this);
115 return cmd_helper.OnAddToNewPlaylist(getSongList, playlist_path);
116 }
117
ViewOnlineThreadFunc(LPVOID lpParam)118 UINT CFindDlg::ViewOnlineThreadFunc(LPVOID lpParam)
119 {
120 CFindDlg* pThis = (CFindDlg*)(lpParam);
121 if (pThis == nullptr)
122 return 0;
123 CCommon::SetThreadLanguageList(theApp.m_str_table.GetLanguageTag());
124 //此命令用于跳转到歌曲对应的网易云音乐的在线页面
125 SongInfo song{ pThis->m_find_result[pThis->m_item_selected] };
126 if (CCommon::FileExist(song.file_path))
127 {
128 CMusicPlayerCmdHelper cmd_helper(pThis);
129 cmd_helper.VeiwOnline(song);
130 }
131 return 0;
132 }
133
SetPlaySelectedEnable(bool enable)134 void CFindDlg::SetPlaySelectedEnable(bool enable)
135 {
136 CWnd* pParent = GetParentWindow();
137 ::SendMessage(pParent->GetSafeHwnd(), WM_PLAY_SELECTED_BTN_ENABLE, WPARAM(enable), 0);
138 }
139
ClearFindResult()140 void CFindDlg::ClearFindResult()
141 {
142 m_find_result.clear();
143 }
144
SaveConfig()145 void CFindDlg::SaveConfig()
146 {
147 m_find_option_data = 0;
148 if (m_find_file)
149 m_find_option_data |= 0x01;
150 if (m_find_title)
151 m_find_option_data |= 0x02;
152 if (m_find_artist)
153 m_find_option_data |= 0x04;
154 if (m_find_album)
155 m_find_option_data |= 0x08;
156 if (m_find_current_playlist)
157 m_find_option_data |= 0x10;
158
159 CIniHelper ini(theApp.m_config_path);
160 ini.WriteInt(L"config", L"find_option_data", m_find_option_data);
161 ini.Save();
162 }
163
LoadConfig()164 void CFindDlg::LoadConfig()
165 {
166 CIniHelper ini(theApp.m_config_path);
167 m_find_option_data = ini.GetInt(L"config", L"find_option_data", 0xff);
168
169 m_find_file = (m_find_option_data % 2 != 0);
170 m_find_title = ((m_find_option_data >> 1) % 2 != 0);
171 m_find_artist = ((m_find_option_data >> 2) % 2 != 0);
172 m_find_album = ((m_find_option_data >> 3) % 2 != 0);
173 m_find_current_playlist = ((m_find_option_data >> 4) % 2 != 0);
174 }
175
GetSongsSelected(vector<SongInfo> & songs) const176 void CFindDlg::GetSongsSelected(vector<SongInfo>& songs) const
177 {
178 songs.clear();
179 for (const auto& index : m_items_selected)
180 songs.push_back(m_find_result[index]);
181 }
182
BEGIN_MESSAGE_MAP(CFindDlg,CTabDlg)183 BEGIN_MESSAGE_MAP(CFindDlg, CTabDlg)
184 ON_EN_CHANGE(IDC_FIND_EDIT, &CFindDlg::OnEnChangeFindEdit)
185 ON_NOTIFY(NM_CLICK, IDC_FIND_LIST, &CFindDlg::OnNMClickFindList)
186 ON_BN_CLICKED(IDC_FIND_BUTTON, &CFindDlg::OnBnClickedFindButton)
187 ON_NOTIFY(NM_DBLCLK, IDC_FIND_LIST, &CFindDlg::OnNMDblclkFindList)
188 ON_BN_CLICKED(IDC_FIND_FILE_CHECK, &CFindDlg::OnBnClickedFindFileCheck)
189 ON_BN_CLICKED(IDC_FIND_TITLE_CHECK, &CFindDlg::OnBnClickedFindTitleCheck)
190 ON_BN_CLICKED(IDC_FIND_ARTIST_CHECK, &CFindDlg::OnBnClickedFindArtistCheck)
191 ON_BN_CLICKED(IDC_FIND_ALBUM_CHECK, &CFindDlg::OnBnClickedFindAlbumCheck)
192 ON_BN_CLICKED(IDC_FIND_CURRENT_PLAYLIST_RADIO, &CFindDlg::OnBnClickedFindCurrentPlaylistRadio)
193 ON_BN_CLICKED(IDC_FIND_ALL_PLAYLIST_RADIO, &CFindDlg::OnBnClickedFindAllPlaylistRadio)
194 ON_WM_GETMINMAXINFO()
195 ON_WM_SIZE()
196 ON_COMMAND(ID_PLAY_ITEM, &CFindDlg::OnPlayItem)
197 ON_COMMAND(ID_EXPLORE_TRACK, &CFindDlg::OnExploreTrack)
198 ON_NOTIFY(NM_RCLICK, IDC_FIND_LIST, &CFindDlg::OnNMRClickFindList)
199 ON_COMMAND(ID_COPY_TEXT, &CFindDlg::OnCopyText)
200 ON_COMMAND(ID_PLAY_ITEM_IN_FOLDER_MODE, &CFindDlg::OnPlayItemInFolderMode)
201 ON_COMMAND(ID_ADD_TO_NEW_PLAYLIST, &CFindDlg::OnAddToNewPlaylist)
202 ON_COMMAND(ID_EXPLORE_ONLINE, &CFindDlg::OnExploreOnline)
203 ON_COMMAND(ID_FORMAT_CONVERT, &CFindDlg::OnFormatConvert)
204 ON_COMMAND(ID_ITEM_PROPERTY, &CFindDlg::OnItemProperty)
205 ON_COMMAND(ID_ADD_TO_NEW_PLAYLIST_AND_PLAY, &CFindDlg::OnAddToNewPlaylistAndPlay)
206 ON_WM_INITMENU()
207 ON_COMMAND(ID_DELETE_FROM_DISK, &CFindDlg::OnDeleteFromDisk)
208 ON_COMMAND(ID_PLAY_AS_NEXT, &CFindDlg::OnPlayAsNext)
209 END_MESSAGE_MAP()
210
211
212 // CFindDlg 消息处理程序
213
214 void CFindDlg::OnEnChangeFindEdit()
215 {
216 // TODO: 如果该控件是 RICHEDIT 控件,它将不
217 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
218 // 函数并调用 CRichEditCtrl().SetEventMask(),
219 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
220
221 // TODO: 在此添加控件通知处理程序代码
222 CString find_string;
223 GetDlgItemText(IDC_FIND_EDIT, find_string);
224 m_key_word = find_string;
225 }
226
227
OnNMClickFindList(NMHDR * pNMHDR,LRESULT * pResult)228 void CFindDlg::OnNMClickFindList(NMHDR* pNMHDR, LRESULT* pResult)
229 {
230 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
231 // TODO: 在此添加控件通知处理程序代码
232 //NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
233 m_item_selected = pNMItemActivate->iItem; //单击查找结果列表时保存选中的项目序号
234 m_find_result_list.GetItemSelected(m_items_selected);
235 SetPlaySelectedEnable(m_item_selected != -1);
236 *pResult = 0;
237 }
238
239
OnBnClickedFindButton()240 void CFindDlg::OnBnClickedFindButton()
241 {
242 // TODO: 在此添加控件通知处理程序代码
243 if (!m_key_word.empty())
244 {
245 // 清除上次查找结果
246 m_item_selected = -1;
247 m_items_selected.clear();
248 m_find_result.clear();
249 bool find_flag;
250 if (m_find_current_playlist) //查找当前播放列表时,在m_playlist窗口中查找
251 {
252 for (int i{ 0 }; i < CPlayer::GetInstance().GetSongNum(); i++)
253 {
254 find_flag = false;
255 if (m_find_file && !find_flag)
256 {
257 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, CPlayer::GetInstance().GetPlayList()[i].GetFileName()))
258 find_flag = true;
259 }
260 if (m_find_title && !find_flag)
261 {
262 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, CPlayer::GetInstance().GetPlayList()[i].title))
263 find_flag = true;
264 }
265 if (m_find_artist && !find_flag)
266 {
267 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, CPlayer::GetInstance().GetPlayList()[i].artist))
268 find_flag = true;
269 }
270 if (m_find_album && !find_flag)
271 {
272 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, CPlayer::GetInstance().GetPlayList()[i].album))
273 find_flag = true;
274 }
275 if (find_flag)
276 {
277 m_find_result.push_back(CPlayer::GetInstance().GetPlayList()[i]);
278 }
279 }
280 }
281 else // 查找所有播放列表时,在SongDataMap中查找
282 {
283 CSongDataManager::GetInstance().GetSongData([&](const CSongDataManager::SongDataMap& song_data_map)
284 {
285 for (const auto& item : song_data_map)
286 {
287 find_flag = false;
288 if (m_find_file && !find_flag)
289 {
290 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, item.second.GetFileName()))
291 find_flag = true;
292 }
293 if (m_find_title && !find_flag)
294 {
295 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, item.second.title))
296 find_flag = true;
297 }
298 if (m_find_artist && !find_flag)
299 {
300 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, item.second.artist))
301 find_flag = true;
302 }
303 if (m_find_album && !find_flag)
304 {
305 if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(m_key_word, item.second.album))
306 find_flag = true;
307 }
308 if (find_flag)
309 {
310 m_find_result.push_back(item.second); //如果找到了,就保存结果
311 }
312 }
313 });
314 }
315 // 显示查找结果
316 ShowFindResult();
317 if (!m_find_result.empty())
318 SetDlgItemText(IDC_FIND_RESULT_STATIC, theApp.m_str_table.LoadText(L"TXT_FIND_RESULT_CURRENT").c_str());
319 else
320 SetDlgItemText(IDC_FIND_RESULT_STATIC, theApp.m_str_table.LoadText(L"TXT_FIND_RESULT_NONE").c_str());
321 ShowFindInfo();
322 }
323 }
324
325
OnInitDialog()326 BOOL CFindDlg::OnInitDialog()
327 {
328 CTabDlg::OnInitDialog();
329
330 // TODO: 在此添加额外的初始化
331
332 SetButtonIcon(IDOK, IconMgr::IconType::IT_Play);
333 SetButtonIcon(IDC_FIND_BUTTON, IconMgr::IconType::IT_Find);
334
335 //设置查找选项复选按钮的状态
336 m_find_file_check.SetCheck(m_find_file);
337 m_find_title_check.SetCheck(m_find_title);
338 m_find_artist_check.SetCheck(m_find_artist);
339 m_find_album_check.SetCheck(m_find_album);
340
341 if (m_find_current_playlist)
342 ((CButton*)GetDlgItem(IDC_FIND_CURRENT_PLAYLIST_RADIO))->SetCheck(TRUE);
343 else
344 ((CButton*)GetDlgItem(IDC_FIND_ALL_PLAYLIST_RADIO))->SetCheck(TRUE);
345
346 //初始化列表控件
347 CRect rect;
348 m_find_result_list.GetClientRect(rect);
349 m_find_result_list.SetExtendedStyle(m_find_result_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP);
350 int list_width{ rect.Width() - theApp.DPI(20) - 1 }; //列表控件宽度减去留给垂直滚动条的宽度余量
351 int width0, width1, width2;
352 width0 = theApp.DPI(40);
353 width2 = (list_width - width0) / 5;
354 width1 = list_width - width0 - width2 * 4;
355 m_find_result_list.InsertColumn(0, theApp.m_str_table.LoadText(L"TXT_SERIAL_NUMBER").c_str(), LVCFMT_LEFT, width0);
356 m_find_result_list.InsertColumn(1, theApp.m_str_table.LoadText(L"TXT_FILE_NAME").c_str(), LVCFMT_LEFT, width1);
357 m_find_result_list.InsertColumn(2, theApp.m_str_table.LoadText(L"TXT_TITLE").c_str(), LVCFMT_LEFT, width2);
358 m_find_result_list.InsertColumn(3, theApp.m_str_table.LoadText(L"TXT_ARTIST").c_str(), LVCFMT_LEFT, width2);
359 m_find_result_list.InsertColumn(4, theApp.m_str_table.LoadText(L"TXT_ALBUM").c_str(), LVCFMT_LEFT, width2);
360 m_find_result_list.InsertColumn(5, theApp.m_str_table.LoadText(L"TXT_FILE_PATH").c_str(), LVCFMT_LEFT, width2);
361
362 ShowFindResult(); //显示(上一次的)查找结果
363 ShowFindInfo();
364
365 m_key_word.clear();
366 m_item_selected = -1;
367 m_items_selected.clear();
368
369 GetDlgItem(IDC_FIND_EDIT)->SetFocus(); //将焦点设置到搜索框
370
371 //设置列表控件的提示总是置顶,用于解决如果弹出此窗口的父窗口具有置顶属性时,提示信息在窗口下面的问题
372 m_find_result_list.GetToolTips()->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
373
374 SetPlaySelectedEnable(FALSE); //禁用“播放选中曲目”按钮,除非选中了一个项目
375
376 return FALSE; // return TRUE unless you set the focus to a control
377 // 异常: OCX 属性页应返回 FALSE
378 }
379
380
OnNMDblclkFindList(NMHDR * pNMHDR,LRESULT * pResult)381 void CFindDlg::OnNMDblclkFindList(NMHDR* pNMHDR, LRESULT* pResult)
382 {
383 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
384 // TODO: 在此添加控件通知处理程序代码
385 m_item_selected = pNMItemActivate->iItem;
386 m_find_result_list.GetItemSelected(m_items_selected);
387 SetPlaySelectedEnable(m_item_selected != -1);
388
389 //双击列表项目后关闭对话框并播放选中项目
390 OnPlayItem();
391 *pResult = 0;
392 }
393
394
PreTranslateMessage(MSG * pMsg)395 BOOL CFindDlg::PreTranslateMessage(MSG* pMsg)
396 {
397 // TODO: 在此添加专用代码和/或调用基类
398 if (pMsg->message == WM_KEYUP && pMsg->wParam == VK_RETURN) //按回车键执行搜索操作
399 {
400 OnBnClickedFindButton();
401 return TRUE;
402 }
403 if (pMsg->wParam == VK_RETURN) //屏蔽按回车键退出
404 {
405 return TRUE;
406 }
407
408 return CTabDlg::PreTranslateMessage(pMsg);
409 }
410
411
OnBnClickedFindFileCheck()412 void CFindDlg::OnBnClickedFindFileCheck()
413 {
414 // TODO: 在此添加控件通知处理程序代码
415 m_find_file = (m_find_file_check.GetCheck() != 0);
416 }
417
418
OnBnClickedFindTitleCheck()419 void CFindDlg::OnBnClickedFindTitleCheck()
420 {
421 // TODO: 在此添加控件通知处理程序代码
422 m_find_title = (m_find_title_check.GetCheck() != 0);
423 }
424
425
OnBnClickedFindArtistCheck()426 void CFindDlg::OnBnClickedFindArtistCheck()
427 {
428 // TODO: 在此添加控件通知处理程序代码
429 m_find_artist = (m_find_artist_check.GetCheck() != 0);
430 }
431
432
OnBnClickedFindAlbumCheck()433 void CFindDlg::OnBnClickedFindAlbumCheck()
434 {
435 // TODO: 在此添加控件通知处理程序代码
436 m_find_album = (m_find_album_check.GetCheck() != 0);
437 }
438
439
440
OnBnClickedFindCurrentPlaylistRadio()441 void CFindDlg::OnBnClickedFindCurrentPlaylistRadio()
442 {
443 // TODO: 在此添加控件通知处理程序代码
444 m_find_current_playlist = true;
445 }
446
447
OnBnClickedFindAllPlaylistRadio()448 void CFindDlg::OnBnClickedFindAllPlaylistRadio()
449 {
450 // TODO: 在此添加控件通知处理程序代码
451 m_find_current_playlist = false;
452 }
453
454
OnSize(UINT nType,int cx,int cy)455 void CFindDlg::OnSize(UINT nType, int cx, int cy)
456 {
457 CTabDlg::OnSize(nType, cx, cy);
458
459 // TODO: 在此处添加消息处理程序代码
460 if (m_find_result_list.m_hWnd != NULL && nType != SIZE_MINIMIZED)
461 {
462 //调整列表中项目的宽度
463 CRect rect;
464 m_find_result_list.GetWindowRect(rect);
465 int list_width{ rect.Width() - theApp.DPI(20) - 1 }; //列表控件宽度减去留给垂直滚动条的宽度余量
466 int width0, width1, width2;
467 width0 = theApp.DPI(40);
468 width2 = (list_width - width0) / 5;
469 width1 = list_width - width0 - width2 * 4;
470 m_find_result_list.SetColumnWidth(1, width1);
471 m_find_result_list.SetColumnWidth(2, width2);
472 m_find_result_list.SetColumnWidth(3, width2);
473 m_find_result_list.SetColumnWidth(4, width2);
474 m_find_result_list.SetColumnWidth(5, width2);
475 }
476 }
477
478
OnPlayItem()479 void CFindDlg::OnPlayItem()
480 {
481 //向父窗口发送IDOK命令
482 CWnd* pParent = GetParentWindow();
483 ::SendMessage(pParent->GetSafeHwnd(), WM_COMMAND, IDOK, 0);
484 }
485
486
OnExploreTrack()487 void CFindDlg::OnExploreTrack()
488 {
489 // TODO: 在此添加命令处理程序代码
490 wstring file;
491 if (m_item_selected >= 0 && m_item_selected < static_cast<int>(m_find_result.size()))
492 {
493 file = m_find_result[m_item_selected].file_path;
494 CString str;
495 str.Format(_T("/select,\"%s\""), file.c_str());
496 ShellExecute(NULL, _T("open"), _T("explorer"), str, NULL, SW_SHOWNORMAL);
497 }
498 }
499
500
OnNMRClickFindList(NMHDR * pNMHDR,LRESULT * pResult)501 void CFindDlg::OnNMRClickFindList(NMHDR* pNMHDR, LRESULT* pResult)
502 {
503 LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
504 // TODO: 在此添加控件通知处理程序代码
505 m_item_selected = pNMItemActivate->iItem;
506 m_find_result_list.GetItemSelected(m_items_selected);
507 SetPlaySelectedEnable(m_item_selected != -1);
508
509 if (m_item_selected >= 0 && m_item_selected < static_cast<int>(m_find_result.size()))
510 {
511 //获取鼠标点击处的文本
512 int sub_item;
513 sub_item = pNMItemActivate->iSubItem;
514 m_selected_string = m_find_result_list.GetItemText(m_item_selected, sub_item);
515 //弹出右键菜单
516 CMenu* pContextMenu = theApp.m_menu_mgr.GetMenu(MenuMgr::LibRightMenu);
517 m_find_result_list.ShowPopupMenu(pContextMenu, pNMItemActivate->iItem, this);
518 }
519
520 *pResult = 0;
521 }
522
523
OnCopyText()524 void CFindDlg::OnCopyText()
525 {
526 // TODO: 在此添加命令处理程序代码
527 if (!CCommon::CopyStringToClipboard(wstring(m_selected_string)))
528 MessageBox(theApp.m_str_table.LoadText(L"MSG_COPY_CLIPBOARD_FAILED").c_str(), NULL, MB_ICONWARNING);
529 }
530
531
OnPlayItemInFolderMode()532 void CFindDlg::OnPlayItemInFolderMode()
533 {
534 // TODO: 在此添加命令处理程序代码
535 if (m_item_selected >= 0 && m_item_selected < static_cast<int>(m_find_result.size()))
536 {
537 if (!CPlayer::GetInstance().OpenASongInFolderMode(m_find_result[m_item_selected], true))
538 {
539 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
540 MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
541 }
542 else
543 OnCancel();
544 }
545
546 }
547
548
OnAddToNewPlaylist()549 void CFindDlg::OnAddToNewPlaylist()
550 {
551 // TODO: 在此添加命令处理程序代码
552 wstring playlist_path;
553 _OnAddToNewPlaylist(playlist_path);
554 }
555
556
OnExploreOnline()557 void CFindDlg::OnExploreOnline()
558 {
559 // TODO: 在此添加命令处理程序代码
560 if (m_item_selected >= 0 && m_item_selected < static_cast<int>(m_find_result.size()))
561 AfxBeginThread(ViewOnlineThreadFunc, (void*)this);
562 }
563
564
OnFormatConvert()565 void CFindDlg::OnFormatConvert()
566 {
567 // TODO: 在此添加命令处理程序代码
568 std::vector<SongInfo> songs;
569 GetSongsSelected(songs);
570 CMusicPlayerCmdHelper cmd_helper(this);
571 cmd_helper.FormatConvert(songs);
572 }
573
574
OnItemProperty()575 void CFindDlg::OnItemProperty()
576 {
577 // TODO: 在此添加命令处理程序代码
578 if (m_item_selected < 0 || m_item_selected >= static_cast<int>(m_find_result.size()))
579 return;
580 CPropertyDlg propertyDlg(m_find_result, m_item_selected, true);
581 propertyDlg.DoModal();
582 }
583
584
OnOK()585 void CFindDlg::OnOK()
586 {
587 // TODO: 在此添加专用代码和/或调用基类
588 if (m_item_selected < 0 || m_item_selected >= static_cast<int>(m_find_result.size())) return;
589
590 int selected_track = CPlayer::GetInstance().IsSongInPlayList(m_find_result[m_item_selected]);
591 if (selected_track != -1) //如果查找结果是当前播放列表中的曲目,则在当前播放列表中查找选中的曲目,并播放
592 {
593 if (!CPlayer::GetInstance().PlayTrack(selected_track))
594 {
595 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
596 MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
597 }
598 }
599 else
600 {
601 vector<SongInfo> songs;
602 GetSongsSelected(songs);
603 if (!songs.empty())
604 {
605 bool ok{};
606 if (songs.size() == 1)
607 ok = CPlayer::GetInstance().OpenSongsInDefaultPlaylist(songs);
608 else
609 ok = CPlayer::GetInstance().OpenSongsInTempPlaylist(songs);
610 if (!ok)
611 {
612 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
613 MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
614 }
615 }
616 }
617
618 CTabDlg::OnOK();
619 }
620
621
OnAddToNewPlaylistAndPlay()622 void CFindDlg::OnAddToNewPlaylistAndPlay()
623 {
624 // TODO: 在此添加命令处理程序代码
625 wstring playlist_path;
626 if (_OnAddToNewPlaylist(playlist_path))
627 {
628 if (!CPlayer::GetInstance().SetPlaylist(playlist_path, 0, 0, true))
629 {
630 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
631 MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
632 }
633 else
634 OnCancel();
635 }
636 }
637
638
OnInitMenu(CMenu * pMenu)639 void CFindDlg::OnInitMenu(CMenu* pMenu)
640 {
641 CTabDlg::OnInitMenu(pMenu);
642
643 // TODO: 在此处添加消息处理程序代码
644 vector<SongInfo> songs;
645 GetSongsSelected(songs);
646 bool select_all_in_playing_list = CPlayer::GetInstance().IsSongsInPlayList(songs);
647 // 选中歌曲全部为cue或osu!文件时禁用从磁盘删除菜单项
648 bool can_del = !theApp.m_media_lib_setting_data.disable_delete_from_disk &&
649 std::find_if(songs.begin(), songs.end(), [&](const SongInfo& song_info) { return song_info.is_cue || COSUPlayerHelper::IsOsuFile(song_info.file_path); }) != songs.end();
650
651 pMenu->EnableMenuItem(ID_PLAY_AS_NEXT, MF_BYCOMMAND | (select_all_in_playing_list ? MF_ENABLED : MF_GRAYED));
652 pMenu->EnableMenuItem(ID_DELETE_FROM_DISK, MF_BYCOMMAND | (can_del ? MF_ENABLED : MF_GRAYED));
653 }
654
655
OnCommand(WPARAM wParam,LPARAM lParam)656 BOOL CFindDlg::OnCommand(WPARAM wParam, LPARAM lParam)
657 {
658 // TODO: 在此添加专用代码和/或调用基类
659 WORD command = LOWORD(wParam);
660 auto getSelectedItems = [&](std::vector<SongInfo>& item_list)
661 {
662 GetSongsSelected(item_list);
663 };
664 //响应播放列表右键菜单中的“添加到播放列表”
665 CMusicPlayerCmdHelper cmd_helper;
666 cmd_helper.OnAddToPlaylistCommand(getSelectedItems, command);
667
668 return CTabDlg::OnCommand(wParam, lParam);
669 }
670
671
OnDeleteFromDisk()672 void CFindDlg::OnDeleteFromDisk()
673 {
674 // TODO: 在此添加命令处理程序代码
675 vector<SongInfo> songs_selected;
676 GetSongsSelected(songs_selected);
677 CMusicPlayerCmdHelper helper;
678 if (helper.DeleteSongsFromDisk(songs_selected))
679 {
680 //删除成功,则刷新列表
681 auto isRemoved = [&](const SongInfo& song)
682 {
683 for (const auto& item : songs_selected)
684 {
685 if (item.IsSameSong(song))
686 return true;
687 }
688 return false;
689 };
690 auto iter_removed = std::remove_if(m_find_result.begin(), m_find_result.end(), isRemoved);
691 m_find_result.erase(iter_removed, m_find_result.end());
692 ShowFindResult();
693 }
694 }
695
696
OnPlayAsNext()697 void CFindDlg::OnPlayAsNext()
698 {
699 // TODO: 在此添加命令处理程序代码
700 vector<SongInfo> songs;
701 GetSongsSelected(songs);
702 CPlayer::GetInstance().PlayAfterCurrentTrack(songs);
703 ::SendMessage(theApp.m_pMainWnd->GetSafeHwnd(), WM_SET_UI_FORCE_FRESH_FLAG, 0, 0); // 主动触发更新状态栏显示
704 }
705