xref: /MusicPlayer2/MusicPlayer2/LyricRelateDlg.cpp (revision a87de17200448923cd61634f894b94d41827fa4c)
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