xref: /MusicPlayer2/MusicPlayer2/SetPathDlg.cpp (revision c9c6fab2e4bf92c783dec6aeb510d14f71b9a7fe)
1 // SetPathDlg.cpp : 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "SetPathDlg.h"
8 #include "MusicPlayerCmdHelper.h"
9 #include "FolderPropertiesDlg.h"
10 #include "COSUPlayerHelper.h"
11 #include "CRecentList.h"
12 
13 
14 // CSetPathDlg 对话框
15 
IMPLEMENT_DYNAMIC(CSetPathDlg,CTabDlg)16 IMPLEMENT_DYNAMIC(CSetPathDlg, CTabDlg)
17 
18 CSetPathDlg::CSetPathDlg(CWnd* pParent /*=NULL*/)
19     : CTabDlg(IDD_SET_PATH_DIALOG, pParent)
20     , m_list_cache(LT_FOLDER)
21 {
22 
23 }
24 
~CSetPathDlg()25 CSetPathDlg::~CSetPathDlg()
26 {
27 }
28 
QuickSearch(const wstring & key_word)29 void CSetPathDlg::QuickSearch(const wstring & key_word)
30 {
31     m_search_result.clear();
32     for (size_t i{}; i < m_list_cache.size(); ++i)
33     {
34         if (theApp.m_chinese_pingyin_res.IsStringMatchWithPingyin(key_word, m_list_cache.at(i).path))
35             m_search_result.push_back(i);
36     }
37 }
38 
AdjustColumnWidth()39 void CSetPathDlg::AdjustColumnWidth()
40 {
41     vector<int> width;
42     CalculateColumeWidth(width);
43     for (size_t i{}; i < width.size(); i++)
44         m_path_list.SetColumnWidth(i, width[i]);
45 }
46 
RefreshTabData()47 void CSetPathDlg::RefreshTabData()
48 {
49     ShowPathList();
50     SetButtonsEnable();
51 }
52 
SetCurSel(const wstring & folder_path)53 bool CSetPathDlg::SetCurSel(const wstring& folder_path)
54 {
55     if (!m_searched)
56     {
57         int index{ -1 };
58         for (size_t i{}; i < m_list_cache.size(); i++)
59         {
60             if (m_list_cache.at(i).path == folder_path)
61                 index = i;
62         }
63 
64         if (index >= 0)
65         {
66             m_path_list.SetCurSel(index);
67             m_path_list.EnsureVisible(index, FALSE);
68             return true;
69         }
70         return false;
71     }
72     return true;
73 }
74 
SelectValid() const75 bool CSetPathDlg::SelectValid() const
76 {
77     int index{ m_list_selected };
78     if (m_searched && index >= 0 && index < static_cast<int>(m_search_result.size()))
79         index = m_search_result[index];
80     return index >= 0 && index < static_cast<int>(m_list_cache.size());
81 }
82 
GetSelPath() const83 const ListItem& CSetPathDlg::GetSelPath() const
84 {
85     if (SelectValid())
86         if (m_searched)
87             return m_list_cache.at(m_search_result[m_list_selected]);
88         else
89             return m_list_cache.at(m_list_selected);
90     static ListItem empty{};
91     return empty;
92 }
93 
SelectedCanPlay() const94 bool CSetPathDlg::SelectedCanPlay() const
95 {
96     return SelectValid() && !CRecentList::Instance().IsCurrentList(GetSelPath());
97 }
98 
SetButtonsEnable()99 void CSetPathDlg::SetButtonsEnable()
100 {
101     bool enable = SelectedCanPlay();
102     CWnd* pParent = GetParentWindow();
103     if (pParent != nullptr)
104         ::SendMessage(pParent->GetSafeHwnd(), WM_PLAY_SELECTED_BTN_ENABLE, WPARAM(enable), 0);
105 }
106 
ShowPathList()107 void CSetPathDlg::ShowPathList()
108 {
109     m_list_cache.reload();
110 
111     m_path_list.EnableWindow(TRUE);
112     m_path_list.DeleteAllItems();
113     if (!m_searched)        //显示所有项目
114     {
115         for (size_t i{}; i < m_list_cache.size(); ++i)
116         {
117             m_path_list.InsertItem(i, std::to_wstring(i + 1).c_str());
118             SetListRowData(i, m_list_cache.at(i));
119         }
120         m_path_list.SetHightItem(m_list_cache.playing_index());
121     }
122     else        //只显示搜索结果的曲目
123     {
124         // 进行搜索
125         QuickSearch(m_searched_str);
126         // 显示搜索结果
127         if (m_search_result.empty())
128         {
129             m_path_list.InsertItem(0, _T(""));
130             m_path_list.SetItemText(0, 1, theApp.m_str_table.LoadText(L"TXT_PLAYLIST_CTRL_NO_RESULT_TO_SHOW").c_str());
131             m_path_list.EnableWindow(FALSE);
132             return;
133         }
134         int index{};
135         int highlight_index_searched{ -1 };
136         for (size_t i : m_search_result)
137         {
138             m_path_list.InsertItem(index, std::to_wstring(i + 1).c_str());
139             SetListRowData(index, m_list_cache.at(i));
140             if (m_list_cache.playing_index() == i)
141                 highlight_index_searched = index;
142             ++index;
143         }
144         m_path_list.SetHightItem(highlight_index_searched);
145     }
146 }
147 
CalculateColumeWidth(vector<int> & width)148 void CSetPathDlg::CalculateColumeWidth(vector<int>& width)
149 {
150     CRect rect;
151     m_path_list.GetWindowRect(rect);
152     width.resize(7);
153 
154     width[3] = rect.Width() / 12;
155     width[4] = width[5] = rect.Width() / 10;
156     width[6] = rect.Width() / 8;
157 
158     width[0] = theApp.DPI(40);
159     width[1] = rect.Width() / 4;
160     width[2] = rect.Width() - width[1] - width[3] - width[4] - width[5] - width[6] - width[0] - theApp.DPI(20) - 1;
161 }
162 
SetListRowData(int index,const ListItem & list_item)163 void CSetPathDlg::SetListRowData(int index, const ListItem& list_item)
164 {
165     CFilePathHelper path_helper(list_item.path);
166     m_path_list.SetItemText(index, 1, path_helper.GetFolderName().c_str());
167     m_path_list.SetItemText(index, 2, list_item.path.c_str());
168 
169     if (list_item.contain_sub_folder)
170         m_path_list.SetItemText(index, 3, theApp.m_str_table.LoadText(L"TXT_LIB_PATH_IS_CONTAIN_SUB_FOLDER_YES").c_str());
171     else
172         m_path_list.SetItemText(index, 3, _T(""));
173 
174     m_path_list.SetItemText(index, 4, list_item.GetLastTrackDisplayName().c_str());
175     m_path_list.SetItemText(index, 5, std::to_wstring(list_item.total_num).c_str());
176     m_path_list.SetItemText(index, 6, Time(list_item.total_time).toString3().c_str());
177 }
178 
OnTabEntered()179 void CSetPathDlg::OnTabEntered()
180 {
181     if (CPlayer::GetInstance().IsFolderMode())
182         m_path_name.SetWindowText(CPlayer::GetInstance().GetCurrentDir2().c_str());
183     ShowPathList();
184     m_list_selected = m_path_list.GetCurSel();
185     SetButtonsEnable();
186 }
187 
InitializeControls()188 bool CSetPathDlg::InitializeControls()
189 {
190     SetDlgControlText(IDC_TXT_LIB_PATH_CURRENT_FOLDER_STATIC, L"TXT_LIB_PATH_CURRENT_FOLDER");
191     // IDC_PATH_EDIT
192     SetDlgControlText(IDC_OPEN_FOLDER, L"TXT_LIB_PATH_OPEN_NEW_FOLDER");
193     SetDlgControlText(IDC_SORT_BUTTON, L"TXT_LIB_PLAYLIST_SORT");
194     // IDC_SEARCH_EDIT
195     // IDC_PATH_LIST
196 
197     RepositionTextBasedControls({
198         { CtrlTextInfo::L1, IDC_TXT_LIB_PATH_CURRENT_FOLDER_STATIC },
199         { CtrlTextInfo::C0, IDC_PATH_EDIT },
200         { CtrlTextInfo::R1, IDC_OPEN_FOLDER, CtrlTextInfo::W32 },
201         { CtrlTextInfo::R2, IDC_SORT_BUTTON, CtrlTextInfo::W32 }
202         });
203     return true;
204 }
205 
DoDataExchange(CDataExchange * pDX)206 void CSetPathDlg::DoDataExchange(CDataExchange* pDX)
207 {
208     CTabDlg::DoDataExchange(pDX);
209     DDX_Control(pDX, IDC_PATH_EDIT, m_path_name);
210     //DDX_Control(pDX, IDC_LIST1, m_path_list);
211     DDX_Control(pDX, IDC_PATH_LIST, m_path_list);
212     DDX_Control(pDX, IDC_SEARCH_EDIT, m_search_edit);
213 }
214 
215 
BEGIN_MESSAGE_MAP(CSetPathDlg,CTabDlg)216 BEGIN_MESSAGE_MAP(CSetPathDlg, CTabDlg)
217     ON_NOTIFY(NM_CLICK, IDC_PATH_LIST, &CSetPathDlg::OnNMClickPathList)
218     ON_NOTIFY(NM_RCLICK, IDC_PATH_LIST, &CSetPathDlg::OnNMRClickPathList)
219     ON_NOTIFY(NM_DBLCLK, IDC_PATH_LIST, &CSetPathDlg::OnNMDblclkPathList)
220     ON_WM_SIZE()
221     ON_BN_CLICKED(IDC_OPEN_FOLDER, &CSetPathDlg::OnBnClickedOpenFolder)
222     ON_COMMAND(ID_PLAY_PATH, &CSetPathDlg::OnPlayPath)
223     ON_COMMAND(ID_DELETE_PATH, &CSetPathDlg::OnDeletePath)
224     ON_COMMAND(ID_BROWSE_PATH, &CSetPathDlg::OnBrowsePath)
225     ON_COMMAND(ID_CLEAR_INVALID_PATH, &CSetPathDlg::OnClearInvalidPath)
226     ON_WM_INITMENU()
227     ON_EN_CHANGE(IDC_SEARCH_EDIT, &CSetPathDlg::OnEnChangeSearchEdit)
228     //ON_BN_CLICKED(IDC_CLEAR_BUTTON, &CSetPathDlg::OnBnClickedClearButton)
229     ON_MESSAGE(WM_SEARCH_EDIT_BTN_CLICKED, &CSetPathDlg::OnSearchEditBtnClicked)
230     ON_COMMAND(ID_CONTAIN_SUB_FOLDER, &CSetPathDlg::OnContainSubFolder)
231     ON_BN_CLICKED(IDC_SORT_BUTTON, &CSetPathDlg::OnBnClickedSortButton)
232     ON_COMMAND(ID_LIB_FOLDER_SORT_RECENT_PLAYED, &CSetPathDlg::OnLibFolderSortRecentPlayed)
233     ON_COMMAND(ID_LIB_FOLDER_SORT_RECENT_ADDED, &CSetPathDlg::OnLibFolderSortRecentAdded)
234     ON_COMMAND(ID_LIB_FOLDER_SORT_PATH, &CSetPathDlg::OnLibFolderSortPath)
235     ON_COMMAND(ID_LIB_FOLDER_PROPERTIES, &CSetPathDlg::OnLibFolderProperties)
236     ON_COMMAND(ID_FILE_OPEN_FOLDER, &CSetPathDlg::OnFileOpenFolder)
237     ON_COMMAND(ID_ADD_TO_NEW_PLAYLIST, &CSetPathDlg::OnAddToNewPlaylist)
238 END_MESSAGE_MAP()
239 
240 
241 // CSetPathDlg 消息处理程序
242 
243 
244 BOOL CSetPathDlg::OnInitDialog()
245 {
246     CTabDlg::OnInitDialog();
247 
248     // TODO:  在此添加额外的初始化
249 
250     //设置列表控件主题颜色
251     //m_path_list.SetColor(theApp.m_app_setting_data.theme_color);
252 
253     SetButtonIcon(IDC_OPEN_FOLDER, IconMgr::IconType::IT_NewFolder);
254     SetButtonIcon(IDC_SORT_BUTTON, IconMgr::IconType::IT_Sort_Mode);
255 
256     //初始化播放列表控件
257     vector<int> width;
258     CalculateColumeWidth(width);
259     m_path_list.SetExtendedStyle(m_path_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_LABELTIP);
260     m_path_list.InsertColumn(0, theApp.m_str_table.LoadText(L"TXT_SERIAL_NUMBER").c_str(), LVCFMT_LEFT, width[0]);
261     m_path_list.InsertColumn(1, theApp.m_str_table.LoadText(L"TXT_FOLDER").c_str(), LVCFMT_LEFT, width[1]);
262     m_path_list.InsertColumn(2, theApp.m_str_table.LoadText(L"TXT_PATH").c_str(), LVCFMT_LEFT, width[2]);
263     m_path_list.InsertColumn(3, theApp.m_str_table.LoadText(L"TXT_LIB_PATH_IS_CONTAIN_SUB_FOLDER").c_str(), LVCFMT_LEFT, width[3]);
264     m_path_list.InsertColumn(4, theApp.m_str_table.LoadText(L"TXT_LAST_PLAYED_TRACK").c_str(), LVCFMT_LEFT, width[4]);
265     m_path_list.InsertColumn(5, theApp.m_str_table.LoadText(L"TXT_NUM_OF_TRACK").c_str(), LVCFMT_LEFT, width[5]);
266     m_path_list.InsertColumn(6, theApp.m_str_table.LoadText(L"TXT_TOTAL_LENGTH").c_str(), LVCFMT_LEFT, width[6]);
267 
268     wstring prompt_str = theApp.m_str_table.LoadText(L"TXT_SEARCH_PROMPT") + L"(F)";
269     m_search_edit.SetCueBanner(prompt_str.c_str(), TRUE);
270 
271     ////设置列表控件的提示总是置顶,用于解决如果弹出此窗口的父窗口具有置顶属性时,提示信息在窗口下面的问题
272     //m_path_list.GetToolTips()->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
273     //m_Mytip.SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
274 
275     return FALSE;  // return TRUE unless you set the focus to a control
276                   // 异常: OCX 属性页应返回 FALSE
277 }
278 
279 
OnNMClickPathList(NMHDR * pNMHDR,LRESULT * pResult)280 void CSetPathDlg::OnNMClickPathList(NMHDR *pNMHDR, LRESULT *pResult)
281 {
282     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
283     // TODO: 在此添加控件通知处理程序代码
284     m_list_selected = pNMItemActivate->iItem;
285     SetButtonsEnable();
286 
287     *pResult = 0;
288 }
289 
290 
OnNMRClickPathList(NMHDR * pNMHDR,LRESULT * pResult)291 void CSetPathDlg::OnNMRClickPathList(NMHDR *pNMHDR, LRESULT *pResult)
292 {
293     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
294     // TODO: 在此添加控件通知处理程序代码
295     m_list_selected = pNMItemActivate->iItem;
296     SetButtonsEnable();
297 
298     //弹出右键菜单
299     CMenu* pContextMenu = theApp.m_menu_mgr.GetMenu(MenuMgr::LibSetPathMenu);
300     m_path_list.ShowPopupMenu(pContextMenu, pNMItemActivate->iItem, this);
301 
302     *pResult = 0;
303 }
304 
305 
OnNMDblclkPathList(NMHDR * pNMHDR,LRESULT * pResult)306 void CSetPathDlg::OnNMDblclkPathList(NMHDR *pNMHDR, LRESULT *pResult)
307 {
308     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
309     // TODO: 在此添加控件通知处理程序代码
310     m_list_selected = pNMItemActivate->iItem;
311     OnOK();
312 
313     *pResult = 0;
314 }
315 
316 
OnSize(UINT nType,int cx,int cy)317 void CSetPathDlg::OnSize(UINT nType, int cx, int cy)
318 {
319     CTabDlg::OnSize(nType, cx, cy);
320 
321     // TODO: 在此处添加消息处理程序代码
322 }
323 
324 
OnOK()325 void CSetPathDlg::OnOK()
326 {
327     // TODO: 在此添加专用代码和/或调用基类
328     if (SelectedCanPlay())
329     {
330         if (!CPlayer::GetInstance().SetList(GetSelPath()))
331         {
332             const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
333             MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
334         }
335         else
336         {
337             CTabDlg::OnOK();
338             CWnd* pParent = GetParentWindow();
339             if (pParent != nullptr)
340                 ::PostMessage(pParent->GetSafeHwnd(), WM_COMMAND, IDOK, 0);
341         }
342     }
343 }
344 
345 
OnBnClickedOpenFolder()346 void CSetPathDlg::OnBnClickedOpenFolder()
347 {
348     // TODO: 在此添加控件通知处理程序代码
349     CMusicPlayerCmdHelper helper(this);
350     if (helper.OnOpenFolder())
351     {
352         CTabDlg::OnOK();
353         CWnd* pParent = GetParentWindow();
354         if (pParent != nullptr)
355             ::PostMessage(pParent->GetSafeHwnd(), WM_COMMAND, IDOK, 0);
356     }
357 }
358 
359 
OnPlayPath()360 void CSetPathDlg::OnPlayPath()
361 {
362     // TODO: 在此添加命令处理程序代码
363     OnOK();
364 }
365 
366 
OnDeletePath()367 void CSetPathDlg::OnDeletePath()
368 {
369     // TODO: 在此添加命令处理程序代码
370     if (SelectValid())
371     {
372         CMusicPlayerCmdHelper helper(this);
373         if (helper.OnDeleteRecentListItem(GetSelPath()))
374         {
375             ShowPathList();                 // 重新显示路径列表
376         }
377     }
378 }
379 
380 
OnBrowsePath()381 void CSetPathDlg::OnBrowsePath()
382 {
383     // TODO: 在此添加命令处理程序代码
384     if (SelectValid())
385         ShellExecute(NULL, _T("open"), _T("explorer"), GetSelPath().path.c_str(), NULL, SW_SHOWNORMAL);
386 }
387 
388 
OnClearInvalidPath()389 void CSetPathDlg::OnClearInvalidPath()
390 {
391     // TODO: 在此添加命令处理程序代码
392     const wstring& inquiry_info = theApp.m_str_table.LoadText(L"MSG_LIB_PATH_CLEAR_INQUIRY");
393     if (MessageBox(inquiry_info.c_str(), NULL, MB_ICONQUESTION | MB_OKCANCEL) == IDCANCEL)
394         return;
395     int cleard_cnt = CMusicPlayerCmdHelper::CleanUpRecentFolders();
396     ShowPathList();     // 重新显示路径列表
397     wstring complete_info = theApp.m_str_table.LoadTextFormat(L"MSG_LIB_PATH_CLEAR_COMPLETE", { cleard_cnt });
398     MessageBox(complete_info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
399 }
400 
401 
OnInitMenu(CMenu * pMenu)402 void CSetPathDlg::OnInitMenu(CMenu* pMenu)
403 {
404     CTabDlg::OnInitMenu(pMenu);
405 
406     // TODO: 在此处添加消息处理程序代码
407     bool select_valid{ SelectValid() };
408     pMenu->EnableMenuItem(ID_PLAY_PATH, MF_BYCOMMAND | (SelectedCanPlay() ? MF_ENABLED : MF_GRAYED));
409     pMenu->EnableMenuItem(ID_DELETE_PATH, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
410     pMenu->EnableMenuItem(ID_BROWSE_PATH, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
411     pMenu->EnableMenuItem(ID_CONTAIN_SUB_FOLDER, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
412     bool contain_sub_folder{ select_valid && GetSelPath().contain_sub_folder };
413     pMenu->CheckMenuItem(ID_CONTAIN_SUB_FOLDER, MF_BYCOMMAND | (contain_sub_folder ? MF_CHECKED : MF_UNCHECKED));
414 
415     switch (CRecentList::Instance().GetSortMode(LT_FOLDER))
416     {
417     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;
418     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;
419     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;
420     }
421 
422     for (UINT id = ID_ADD_TO_DEFAULT_PLAYLIST; id < ID_ADD_TO_MY_FAVOURITE + ADD_TO_PLAYLIST_MAX_SIZE + 1; id++)
423     {
424         pMenu->EnableMenuItem(id, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
425     }
426     pMenu->EnableMenuItem(ID_ADD_TO_NEW_PLAYLIST, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
427     pMenu->EnableMenuItem(ID_ADD_TO_OTHER_PLAYLIST, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
428     pMenu->EnableMenuItem(ID_LIB_FOLDER_PROPERTIES, MF_BYCOMMAND | (select_valid ? MF_ENABLED : MF_GRAYED));
429 }
430 
431 
OnEnChangeSearchEdit()432 void CSetPathDlg::OnEnChangeSearchEdit()
433 {
434     // TODO:  如果该控件是 RICHEDIT 控件,它将不
435     // 发送此通知,除非重写 CTabDlg::OnInitDialog()
436     // 函数并调用 CRichEditCtrl().SetEventMask(),
437     // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
438 
439     // TODO:  在此添加控件通知处理程序代码
440     CString key_word;
441     m_search_edit.GetWindowText(key_word);
442     m_searched_str = key_word;
443     m_searched = !m_searched_str.empty();
444     ShowPathList();
445 
446 }
447 
448 
PreTranslateMessage(MSG * pMsg)449 BOOL CSetPathDlg::PreTranslateMessage(MSG* pMsg)
450 {
451     // TODO: 在此添加专用代码和/或调用基类
452     if (pMsg->message == WM_KEYDOWN && pMsg->hwnd != m_search_edit.GetSafeHwnd())
453     {
454         if (pMsg->wParam == 'F')    //按F键快速查找
455         {
456             m_search_edit.SetFocus();
457             return TRUE;
458         }
459     }
460 
461     //if (pMsg->message == WM_MOUSEMOVE)
462     //  m_Mytip.RelayEvent(pMsg);
463 
464     return CTabDlg::PreTranslateMessage(pMsg);
465 }
466 
467 
OnSearchEditBtnClicked(WPARAM wParam,LPARAM lParam)468 afx_msg LRESULT CSetPathDlg::OnSearchEditBtnClicked(WPARAM wParam, LPARAM lParam)
469 {
470     if (m_searched)
471     {
472         //清除搜索结果
473         m_searched = false;
474         m_search_edit.SetWindowText(_T(""));
475         ShowPathList();
476     }
477     return 0;
478 }
479 
480 
OnContainSubFolder()481 void CSetPathDlg::OnContainSubFolder()
482 {
483     // TODO: 在此添加命令处理程序代码
484     if (SelectValid())
485     {
486         // 如果是当前播放则使用CPlayer成员方法更改(会启动播放列表初始化)不需要操作CPlayer::GetInstance().GetRecentPath()
487         if (CRecentList::Instance().IsCurrentList(GetSelPath()))
488         {
489             if (!CPlayer::GetInstance().SetContainSubFolder())
490             {
491                 const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
492                 MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
493             }
494         }
495         else
496         {
497             if (CRecentList::Instance().SetContainSubFolder(GetSelPath()))
498             {
499                 ShowPathList();     // 重新显示路径列表
500             }
501         }
502     }
503 }
504 
505 
OnBnClickedSortButton()506 void CSetPathDlg::OnBnClickedSortButton()
507 {
508     CWnd* pBtn = GetDlgItem(IDC_SORT_BUTTON);
509     CPoint point;
510     if (pBtn != nullptr)
511     {
512         CRect rect;
513         pBtn->GetWindowRect(rect);
514         point.x = rect.left;
515         point.y = rect.bottom;
516         CMenu* pMenu = theApp.m_menu_mgr.GetMenu(MenuMgr::LibFolderSortMenu);
517         if (pMenu != NULL)
518             pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
519     }
520 }
521 
522 
OnLibFolderSortRecentPlayed()523 void CSetPathDlg::OnLibFolderSortRecentPlayed()
524 {
525     if (CRecentList::Instance().SetSortMode(LT_FOLDER, CRecentList::listSortMode::SM_RECENT_PLAYED))
526     {
527         ShowPathList();
528     }
529 }
530 
531 
OnLibFolderSortRecentAdded()532 void CSetPathDlg::OnLibFolderSortRecentAdded()
533 {
534     if (CRecentList::Instance().SetSortMode(LT_FOLDER, CRecentList::listSortMode::SM_RECENT_CREATED))
535     {
536         ShowPathList();
537     }
538 }
539 
540 
OnLibFolderSortPath()541 void CSetPathDlg::OnLibFolderSortPath()
542 {
543     if (CRecentList::Instance().SetSortMode(LT_FOLDER, CRecentList::listSortMode::SM_PATH))
544     {
545         ShowPathList();
546     }
547 }
548 
549 
OnLibFolderProperties()550 void CSetPathDlg::OnLibFolderProperties()
551 {
552     CFolderPropertiesDlg dlg(GetSelPath());
553     dlg.DoModal();
554 }
555 
556 
OnFileOpenFolder()557 void CSetPathDlg::OnFileOpenFolder()
558 {
559     OnBnClickedOpenFolder();
560 }
561 
562 
OnCommand(WPARAM wParam,LPARAM lParam)563 BOOL CSetPathDlg::OnCommand(WPARAM wParam, LPARAM lParam)
564 {
565     WORD command = LOWORD(wParam);
566     const ListItem& list_item = GetSelPath();
567     auto getSelectedItems = [&](std::vector<SongInfo>& song_list) {
568         CAudioCommon::GetAudioFiles(list_item.path, song_list, MAX_SONG_NUM, list_item.contain_sub_folder);
569         int cnt{};
570         bool flag{};
571         CAudioCommon::GetCueTracks(song_list, cnt, flag, MR_MIN_REQUIRED);
572     };
573     CMusicPlayerCmdHelper helper(this);
574     helper.OnAddToPlaylistCommand(getSelectedItems, command);
575 
576     return CTabDlg::OnCommand(wParam, lParam);
577 }
578 
579 
OnAddToNewPlaylist()580 void CSetPathDlg::OnAddToNewPlaylist()
581 {
582     const ListItem& list_item = GetSelPath();
583     auto getSelectedItems = [&](std::vector<SongInfo>& song_list) {
584         CAudioCommon::GetAudioFiles(list_item.path, song_list, MAX_SONG_NUM, list_item.contain_sub_folder);
585         int cnt{};
586         bool flag{};
587         CAudioCommon::GetCueTracks(song_list, cnt, flag, MR_MIN_REQUIRED);
588         };
589     CMusicPlayerCmdHelper cmd_helper(this);
590     wstring playlist_path;
591     cmd_helper.OnAddToNewPlaylist(getSelectedItems, playlist_path, CFilePathHelper(list_item.path).GetFolderName());
592 }
593