xref: /MusicPlayer2/MusicPlayer2/FindDlg.cpp (revision 712a83a9cca07d5d69225dcdbc551221f491d761)
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