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