1 // LyricRelateDlg.cpp: 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "LyricRelateDlg.h"
8 #include "SongInfoHelper.h"
9 #include "MusicPlayerCmdHelper.h"
10 #include "SongDataManager.h"
11 #include "FilterHelper.h"
12 #include "CommonDialogMgr.h"
13
14
15 // CLyricRelateDlg 对话框
16
IMPLEMENT_DYNAMIC(CLyricRelateDlg,CBaseDialog)17 IMPLEMENT_DYNAMIC(CLyricRelateDlg, CBaseDialog)
18
19 CLyricRelateDlg::CLyricRelateDlg(CWnd* pParent /*=nullptr*/)
20 : CBaseDialog(IDD_LYRIC_RELATE_DIALOG, pParent)
21 {
22
23 }
24
~CLyricRelateDlg()25 CLyricRelateDlg::~CLyricRelateDlg()
26 {
27 }
28
ShowSearchResult()29 void CLyricRelateDlg::ShowSearchResult()
30 {
31 m_result_list.DeleteAllItems();
32 m_result_list.SetHightItem(-1);
33 wstring current_lyric_file{ CPlayer::GetInstance().GetCurrentSongInfo().lyric_file };
34 AddListRow(current_lyric_file);
35 for (const auto& lyric_file : m_search_result)
36 {
37 if (current_lyric_file != lyric_file)
38 AddListRow(lyric_file);
39 }
40 }
41
AddListRow(const wstring & lyric_path)42 void CLyricRelateDlg::AddListRow(const wstring& lyric_path)
43 {
44 if (lyric_path.empty() || lyric_path == NO_LYRIC_STR)
45 return;
46
47 CFilePathHelper helper(lyric_path);
48 int index = m_result_list.GetItemCount();
49 m_result_list.InsertItem(index, std::to_wstring(index + 1).c_str());
50 m_result_list.SetItemText(index, 1, helper.GetFileName().c_str());
51 m_result_list.SetItemText(index, 2, helper.GetDir().c_str());
52 bool is_related{ lyric_path == CPlayer::GetInstance().GetCurrentSongInfo().lyric_file };
53 if(is_related)
54 {
55 m_result_list.SetItemText(index, 3, theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_IS_RELATED_YES").c_str());
56 m_result_list.SetHightItem(index);
57 }
58 }
59
GetListRow(int index)60 wstring CLyricRelateDlg::GetListRow(int index)
61 {
62 if(index >= 0 && index < m_result_list.GetItemCount())
63 {
64 CString file_name, file_path;
65 file_name = m_result_list.GetItemText(index, 1);
66 file_path = m_result_list.GetItemText(index, 2);
67 return wstring(file_path + file_name);
68 }
69 else
70 {
71 return wstring();
72 }
73 }
74
SearchLyrics()75 void CLyricRelateDlg::SearchLyrics()
76 {
77 bool fuzzy_match{ m_fuzzy_match_chk.GetCheck() != 0 };
78 CString lyric_name;
79 GetDlgItemText(IDC_LYRIC_NAME_EDIT, lyric_name);
80 CMusicPlayerCmdHelper helper;
81 helper.SearchLyricFiles(wstring(lyric_name), CPlayer::GetInstance().GetCurrentDir(), m_search_result, fuzzy_match);
82 }
83
EnableControls(bool enable)84 void CLyricRelateDlg::EnableControls(bool enable)
85 {
86 CWnd* pWnd = GetDlgItem(IDC_DELETE_FILE_BUTTON);
87 if (pWnd != nullptr)
88 pWnd->EnableWindow(enable);
89 pWnd = GetDlgItem(IDOK);
90 if (pWnd != nullptr)
91 pWnd->EnableWindow(enable);
92 }
93
GetDialogName() const94 CString CLyricRelateDlg::GetDialogName() const
95 {
96 return _T("LyricRelateDlg");
97 }
98
InitializeControls()99 bool CLyricRelateDlg::InitializeControls()
100 {
101 wstring temp;
102 temp = theApp.m_str_table.LoadText(L"TITLE_LRC_RELATE");
103 SetWindowTextW(temp.c_str());
104 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_LRC_TITLE");
105 SetDlgItemTextW(IDC_TXT_LRC_RELATE_LRC_TITLE_STATIC, temp.c_str());
106 // IDC_LYRIC_NAME_EDIT
107 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_FUZZY_MATCH");
108 SetDlgItemTextW(IDC_FUZZY_MATCH_CHECK, temp.c_str());
109 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_SEARCH_LOCAL");
110 SetDlgItemTextW(IDC_LOCAL_SEARCH_BUTTON, temp.c_str());
111 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_SEARCH_RESULT");
112 SetDlgItemTextW(IDC_TXT_LRC_RELATE_SEARCH_RESULT_STATIC, temp.c_str());
113 // IDC_SEARCH_RESULT_LIST
114 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_BROWSE");
115 SetDlgItemTextW(IDC_BROWSE_BUTTON1, temp.c_str());
116 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_DEL_FILE");
117 SetDlgItemTextW(IDC_DELETE_FILE_BUTTON, temp.c_str());
118 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_UNLINK");
119 SetDlgItemTextW(IDC_DONOT_RELATE_BUTTON, temp.c_str());
120 temp = theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_SEL_LINK");
121 SetDlgItemTextW(IDOK, temp.c_str());
122 // IDCANCEL
123
124 RepositionTextBasedControls({
125 { CtrlTextInfo::L1, IDC_TXT_LRC_RELATE_LRC_TITLE_STATIC },
126 { CtrlTextInfo::C0, IDC_LYRIC_NAME_EDIT },
127 { CtrlTextInfo::R1, IDC_FUZZY_MATCH_CHECK, CtrlTextInfo::W16 },
128 { CtrlTextInfo::R2, IDC_LOCAL_SEARCH_BUTTON, CtrlTextInfo::W32 }
129 }, CtrlTextInfo::W128);
130 RepositionTextBasedControls({
131 { CtrlTextInfo::C0, IDC_SEARCH_RESULT_LIST },
132 { CtrlTextInfo::R1, IDC_BROWSE_BUTTON1, CtrlTextInfo::W32 },
133 { CtrlTextInfo::R1, IDC_DELETE_FILE_BUTTON, CtrlTextInfo::W32 }
134 }, CtrlTextInfo::W256);
135 RepositionTextBasedControls({
136 { CtrlTextInfo::L1, IDC_DONOT_RELATE_BUTTON, CtrlTextInfo::W32 },
137 { CtrlTextInfo::R1, IDOK, CtrlTextInfo::W32 },
138 { CtrlTextInfo::R2, IDCANCEL, CtrlTextInfo::W32 }
139 });
140 return true;
141 }
142
DoDataExchange(CDataExchange * pDX)143 void CLyricRelateDlg::DoDataExchange(CDataExchange* pDX)
144 {
145 CBaseDialog::DoDataExchange(pDX);
146 DDX_Control(pDX, IDC_FUZZY_MATCH_CHECK, m_fuzzy_match_chk);
147 DDX_Control(pDX, IDC_SEARCH_RESULT_LIST, m_result_list);
148 }
149
150
BEGIN_MESSAGE_MAP(CLyricRelateDlg,CBaseDialog)151 BEGIN_MESSAGE_MAP(CLyricRelateDlg, CBaseDialog)
152 ON_BN_CLICKED(IDC_LOCAL_SEARCH_BUTTON, &CLyricRelateDlg::OnBnClickedLocalSearchButton)
153 ON_BN_CLICKED(IDC_BROWSE_BUTTON1, &CLyricRelateDlg::OnBnClickedBrowseButton1)
154 ON_BN_CLICKED(IDC_DELETE_FILE_BUTTON, &CLyricRelateDlg::OnBnClickedDeleteFileButton)
155 ON_BN_CLICKED(IDC_DONOT_RELATE_BUTTON, &CLyricRelateDlg::OnBnClickedDonotRelateButton)
156 ON_NOTIFY(LVN_ITEMCHANGED, IDC_SEARCH_RESULT_LIST, &CLyricRelateDlg::OnLvnItemchangedSearchResultList)
157 ON_WM_GETMINMAXINFO()
158 END_MESSAGE_MAP()
159
160
161 // CLyricRelateDlg 消息处理程序
162
163
164 BOOL CLyricRelateDlg::OnInitDialog()
165 {
166 CBaseDialog::OnInitDialog();
167
168 // TODO: 在此添加额外的初始化
169 SetIcon(IconMgr::IconType::IT_Lyric, FALSE);
170 SetButtonIcon(IDC_LOCAL_SEARCH_BUTTON, IconMgr::IconType::IT_Find);
171 SetButtonIcon(IDC_BROWSE_BUTTON1, IconMgr::IconType::IT_Folder_Explore);
172 SetButtonIcon(IDC_DELETE_FILE_BUTTON, IconMgr::IconType::IT_Cancel);
173 SetButtonIcon(IDC_DONOT_RELATE_BUTTON, IconMgr::IconType::IT_Unlink);
174
175 wstring lyric_name;
176 if (CPlayer::GetInstance().GetCurrentSongInfo().is_cue || CPlayer::GetInstance().IsOsuFile())
177 lyric_name = CSongInfoHelper::GetDisplayStr(CPlayer::GetInstance().GetCurrentSongInfo(), DF_ARTIST_TITLE);
178 else
179 lyric_name = CFilePathHelper(CPlayer::GetInstance().GetCurrentFilePath()).GetFileNameWithoutExtension();
180 SetDlgItemText(IDC_LYRIC_NAME_EDIT, lyric_name.c_str());
181
182 EnableControls(false);
183
184 //初始化列表控件
185 CRect rect;
186 m_result_list.GetWindowRect(rect);
187 int width[4]{};
188 width[0] = theApp.DPI(40);
189 width[1] = rect.Width() * 3 / 10;
190 width[2] = rect.Width() * 2 / 5;
191 width[3] = rect.Width() - width[0] - width[1] - width[2] - theApp.DPI(20) - 1;
192 m_result_list.InsertColumn(0, theApp.m_str_table.LoadText(L"TXT_SERIAL_NUMBER").c_str(), LVCFMT_LEFT, width[0]);
193 m_result_list.InsertColumn(1, theApp.m_str_table.LoadText(L"TXT_FILE_NAME").c_str(), LVCFMT_LEFT, width[1]);
194 m_result_list.InsertColumn(2, theApp.m_str_table.LoadText(L"TXT_FILE_PATH").c_str(), LVCFMT_LEFT, width[2]);
195 m_result_list.InsertColumn(3, theApp.m_str_table.LoadText(L"TXT_LRC_RELATE_IS_RELATED").c_str(), LVCFMT_LEFT, width[3]);
196
197 SearchLyrics();
198 ShowSearchResult();
199
200 return TRUE; // return TRUE unless you set the focus to a control
201 // 异常: OCX 属性页应返回 FALSE
202 }
203
204
OnBnClickedLocalSearchButton()205 void CLyricRelateDlg::OnBnClickedLocalSearchButton()
206 {
207 // TODO: 在此添加控件通知处理程序代码
208 SearchLyrics();
209 ShowSearchResult();
210 }
211
212
OnBnClickedBrowseButton1()213 void CLyricRelateDlg::OnBnClickedBrowseButton1()
214 {
215 // TODO: 在此添加控件通知处理程序代码
216 wstring filter = FilterHelper::GetLyricFileFilter();
217 //构造打开文件对话框
218 CFileDialog fileDlg(TRUE, NULL, NULL, 0, filter.c_str(), this);
219 //显示打开文件对话框
220 if (IDOK == fileDlg.DoModal())
221 {
222 CPlayer::GetInstance().IniLyrics(wstring(fileDlg.GetPathName()));
223 OnCancel();
224 }
225 }
226
227
OnBnClickedDeleteFileButton()228 void CLyricRelateDlg::OnBnClickedDeleteFileButton()
229 {
230 // TODO: 在此添加控件通知处理程序代码
231 int index_selected = m_result_list.GetCurSel();
232 wstring lyric_file = GetListRow(index_selected);
233 CommonDialogMgr::DeleteAFile(m_hWnd, lyric_file);
234 if (lyric_file == CPlayer::GetInstance().GetCurrentSongInfo().lyric_file)
235 {
236 //如果删除的是正在显示的歌词,则将其清除
237 CPlayer::GetInstance().ClearLyric();
238 }
239 SearchLyrics();
240 ShowSearchResult();
241 }
242
243
OnBnClickedDonotRelateButton()244 void CLyricRelateDlg::OnBnClickedDonotRelateButton()
245 {
246 // TODO: 在此添加控件通知处理程序代码
247 CPlayer::GetInstance().ClearLyric(); //清除歌词
248 SongInfo song_info{ CSongDataManager::GetInstance().GetSongInfo3(CPlayer::GetInstance().GetCurrentSongInfo()) };
249 song_info.lyric_file = NO_LYRIC_STR; //将该歌曲设置为不关联歌词
250 song_info.SetNoOnlineLyric(true);
251 CSongDataManager::GetInstance().AddItem(song_info);
252 //ShowSearchResult();
253 OnCancel();
254 }
255
256
OnOK()257 void CLyricRelateDlg::OnOK()
258 {
259 // TODO: 在此添加专用代码和/或调用基类
260
261 int index_selected = m_result_list.GetCurSel();
262 wstring related_lyric = GetListRow(index_selected);
263 CPlayer::GetInstance().IniLyrics(related_lyric);
264
265 CBaseDialog::OnOK();
266 }
267
268
OnLvnItemchangedSearchResultList(NMHDR * pNMHDR,LRESULT * pResult)269 void CLyricRelateDlg::OnLvnItemchangedSearchResultList(NMHDR *pNMHDR, LRESULT *pResult)
270 {
271 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
272 // TODO: 在此添加控件通知处理程序代码
273 int index = m_result_list.GetCurSel();
274 bool selected_valid = (index >= 0 && index < m_result_list.GetItemCount());
275 EnableControls(selected_valid);
276 *pResult = 0;
277 }
278