1 // PropertyDlg.cpp : 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "PropertyTabDlg.h"
8 #include "COSUPlayerHelper.h"
9 #include "PropertyDlgHelper.h"
10 #include "SongDataManager.h"
11 #include "GetTagOnlineDlg.h"
12 #include "MusicPlayerCmdHelper.h"
13 #include "TagFromNameDlg.h"
14 #include "SongInfoHelper.h"
15
16 // CPropertyTabDlg 对话框
17
CopyMultiTagInfo(const wstring & str_src,wstring & str_dest)18 static void CopyMultiTagInfo(const wstring& str_src, wstring& str_dest)
19 {
20 static wstring str_multi_value = theApp.m_str_table.LoadText(L"TXT_MULTI_VALUE");
21 if (str_src != str_multi_value)
22 str_dest = str_src;
23 }
24
25 //更改标签信息后更新
UpdateSongInfo(SongInfo song)26 static void UpdateSongInfo(SongInfo song)
27 {
28 ////重新从文件读取该歌曲的标签
29 //HSTREAM hStream;
30 //hStream = BASS_StreamCreateFile(FALSE, song.file_path.c_str(), 0, 0, BASS_SAMPLE_FLOAT);
31 ////CAudioCommon::GetAudioTags(hStream, AudioType::AU_MP3, CPlayer::GetInstance().GetCurrentDir(), m_all_song_info[m_index]);
32 //CAudioTag audio_tag(song, hStream);
33 //audio_tag.GetAudioTag();
34 //BASS_StreamFree(hStream);
35 SongInfo song_info{ CSongDataManager::GetInstance().GetSongInfo3(song) };
36 song_info.CopyAudioTag(song);
37 CSongDataManager::GetInstance().AddItem(song_info);
38 }
39
IMPLEMENT_DYNAMIC(CPropertyTabDlg,CTabDlg)40 IMPLEMENT_DYNAMIC(CPropertyTabDlg, CTabDlg)
41
42 CPropertyTabDlg::CPropertyTabDlg(vector<SongInfo>& all_song_info, int& index, CWnd* pParent /*=NULL*/, bool read_only)
43 : CTabDlg(IDD_PROPERTY_DIALOG, pParent), m_all_song_info{ all_song_info }, m_index{ index }, m_read_only{ read_only },
44 m_batch_edit{ false }
45 {
46 m_song_num = static_cast<int>(all_song_info.size());
47 }
48
CPropertyTabDlg(vector<SongInfo> & song_info,CWnd * pParent)49 CPropertyTabDlg::CPropertyTabDlg(vector<SongInfo>& song_info, CWnd* pParent /*= NULL*/)
50 : CTabDlg(IDD_PROPERTY_DIALOG, pParent), m_all_song_info{ song_info }, m_index{ m_no_use }, m_batch_edit{ true }
51 {
52 m_song_num = static_cast<int>(song_info.size());
53 }
54
~CPropertyTabDlg()55 CPropertyTabDlg::~CPropertyTabDlg()
56 {
57 }
58
ShowInfo()59 void CPropertyTabDlg::ShowInfo()
60 {
61 if (m_batch_edit)
62 {
63 CPropertyDlgHelper helper(m_all_song_info);
64 m_file_name_edit.SetWindowText(helper.GetMultiFileName().c_str());
65 m_file_path_edit.SetWindowText(helper.GetMultiFilePath().c_str());
66 m_file_type_edit.SetWindowText(helper.GetMultiType().c_str());
67 wstring multi_length = helper.GetMultiLength();
68 if (multi_length == L"-:--")
69 multi_length = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_DURATION_UNKNOWN");
70 m_song_length_edit.SetWindowText(multi_length.c_str());
71 m_file_size_edit.SetWindowText(helper.GetMultiSize().c_str());
72 m_bit_rate_edit.SetWindowText(helper.GetMultiBitrate().c_str());
73 SetDlgItemText(IDC_SAMPLE_FREQ, helper.GetMultiFreq().c_str());
74 SetDlgItemText(IDC_BITS_DIPTH, helper.GetMultiBits().c_str());
75 SetDlgItemText(IDC_CHANNELS, helper.GetMultiChannels().c_str());
76 m_lyric_file_edit.SetWindowText(_T(""));
77 m_title_edit.SetWindowText(helper.GetMultiTitle().c_str());
78 m_artist_edit.SetWindowText(helper.GetMultiArtist().c_str());
79 m_album_edit.SetWindowText(helper.GetMultiAlbum().c_str());
80 m_year_edit.SetWindowText(helper.GetMultiYear().c_str());
81 m_track_edit.SetWindowText(helper.GetMultiTrack().c_str());
82 m_genre_combo.SetWindowText(helper.GetMultiGenre().c_str());
83 m_comment_edit.SetWindowText(helper.GetMultiComment().c_str());
84 SetDlgItemText(IDC_TAG_TYPE_STATIC, _T(""));
85 }
86 else
87 {
88 //显示文件名
89 m_file_name_edit.SetWindowText(m_all_song_info[m_index].GetFileName().c_str());
90
91 //显示文件路径
92 m_file_path_edit.SetWindowText((m_all_song_info[m_index].file_path).c_str());
93
94 //显示文件类型
95 wstring file_type;
96 CFilePathHelper file_path{ m_all_song_info[m_index].file_path };
97 file_type = file_path.GetFileExtension();
98 m_file_type_edit.SetWindowText((CAudioCommon::GetAudioDescriptionByExtension(file_type)).c_str());
99
100 //显示文件长度
101 wstring song_length;
102 if (m_all_song_info[m_index].length().isZero())
103 song_length = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_DURATION_UNKNOWN");
104 else
105 song_length = m_all_song_info[m_index].length().toString2();
106 m_song_length_edit.SetWindowText(song_length.c_str());
107
108 //显示文件大小
109 size_t file_size;
110 file_size = CCommon::GetFileSize(m_all_song_info[m_index].file_path);
111 m_file_size_edit.SetWindowText(CCommon::DataSizeToString(file_size));
112
113 //显示比特率
114 m_bit_rate_edit.SetWindowText(CSongInfoHelper::GetBitrateString(m_all_song_info[m_index]));
115
116 //显示采样频率
117 SetDlgItemText(IDC_SAMPLE_FREQ, CSongInfoHelper::GetFreqString(m_all_song_info[m_index]));
118
119 //显示位深度
120 SetDlgItemText(IDC_BITS_DIPTH, CSongInfoHelper::GetBitsString(m_all_song_info[m_index]));
121
122 //显示位声道数
123 SetDlgItemText(IDC_CHANNELS, CSongInfoHelper::GetChannelsString(m_all_song_info[m_index].channels).c_str());
124
125 //显示歌词路径
126 if(m_all_song_info[m_index].IsSameSong(CPlayer::GetInstance().GetCurrentSongInfo()) && CPlayer::GetInstance().IsInnerLyric())
127 m_lyric_file_edit.SetWindowText(theApp.m_str_table.LoadText(L"TXT_INNER_LYRIC").c_str());
128 else if(!m_all_song_info[m_index].lyric_file.empty())
129 m_lyric_file_edit.SetWindowText(m_all_song_info[m_index].lyric_file.c_str());
130 else
131 m_lyric_file_edit.SetWindowText(theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_LRC_FILE_NO_LINK").c_str());
132
133 //显示音频信息
134 //CString info;
135 m_title_edit.SetWindowText(m_all_song_info[m_index].GetTitle().c_str());
136 m_artist_edit.SetWindowText(m_all_song_info[m_index].GetArtist().c_str());
137 m_album_edit.SetWindowText(m_all_song_info[m_index].GetAlbum().c_str());
138 m_year_edit.SetWindowText(m_all_song_info[m_index].GetYear().c_str());
139 CString info;
140 if (m_all_song_info[m_index].track != 0)
141 info.Format(_T("%d"), m_all_song_info[m_index].track);
142 else
143 info = _T("");
144 m_track_edit.SetWindowText(info);
145 m_genre_combo.SetWindowText(m_all_song_info[m_index].GetGenre().c_str());
146 m_comment_edit.SetWindowText(m_all_song_info[m_index].comment.c_str());
147
148 //显示标签类型
149 auto tag_type = m_all_song_info[m_index].tag_type;
150 if (tag_type != 0)
151 {
152 wstring tag_type_str;
153 if (tag_type & T_ID3V1)
154 tag_type_str += _T("ID3v1 ");
155 if (tag_type & T_ID3V2)
156 tag_type_str += _T("ID3v2 ");
157 if (tag_type & T_APE)
158 tag_type_str += _T("APE ");
159 if (tag_type & T_RIFF)
160 tag_type_str += _T("RIFF ");
161 if (tag_type & T_MP4)
162 tag_type_str += _T("MP4 ");
163 tag_type_str.pop_back();
164 tag_type_str = theApp.m_str_table.LoadTextFormat(L"TXT_PROPERTY_DLG_TAG_TYPE", { tag_type_str });
165 SetDlgItemText(IDC_TAG_TYPE_STATIC, tag_type_str.c_str());
166 }
167 else
168 {
169 SetDlgItemText(IDC_TAG_TYPE_STATIC, _T(""));
170 }
171 }
172 }
173
SetEditReadOnly(bool read_only,bool is_cue)174 void CPropertyTabDlg::SetEditReadOnly(bool read_only, bool is_cue)
175 {
176 m_title_edit.SetReadOnly(read_only);
177 m_artist_edit.SetReadOnly(read_only);
178 m_album_edit.SetReadOnly(read_only);
179 m_track_edit.SetReadOnly(read_only || is_cue); //禁止修改cue的音轨号
180 m_year_edit.SetReadOnly(read_only);
181 //m_genre_edit.SetReadOnly(read_only);
182 //((CEdit*)m_genre_combo.GetWindow(GW_CHILD))->SetReadOnly(read_only); //将combo box设为只读
183 m_genre_combo.SetReadOnly(read_only);
184 m_comment_edit.SetReadOnly(read_only);
185 }
186
SetWreteEnable()187 void CPropertyTabDlg::SetWreteEnable()
188 {
189 if (m_batch_edit)
190 {
191 CPropertyDlgHelper helper(m_all_song_info);
192 m_write_enable = helper.IsMultiWritable();
193 }
194 else
195 {
196 CFilePathHelper file_path{ m_all_song_info[m_index].file_path };
197 m_write_enable = (m_all_song_info[m_index].is_cue || (!COSUPlayerHelper::IsOsuFile(file_path.GetFilePath()) && CAudioTag::IsFileTypeTagWriteSupport(file_path.GetFileExtension())/* && m_all_song_info[m_index].tag_type != 2*/));
198 }
199 m_write_enable &= !m_read_only;
200 SetEditReadOnly(!m_write_enable, m_all_song_info[m_index].is_cue);
201 SetSaveBtnEnable();
202 if (m_write_enable)
203 m_year_edit.SetLimitText(4);
204 else
205 m_year_edit.SetLimitText(-1);
206
207 EnableDlgCtrl(IDC_GET_TAG_FROM_LYRIC_BUTTON, m_write_enable);
208 EnableDlgCtrl(IDC_GET_TAG_ONLINE_BUTTON, m_write_enable);
209 EnableDlgCtrl(IDC_GET_TAG_FROM_FILE_NAME_BUTTON, m_write_enable);
210 }
211
212
SetSaveBtnEnable()213 void CPropertyTabDlg::SetSaveBtnEnable()
214 {
215 bool enable = m_write_enable && m_modified;
216 CWnd* pParent = GetParentWindow();
217 if (pParent != nullptr)
218 pParent->SendMessage(WM_PROPERTY_DIALOG_MODIFIED, enable);
219 }
220
ResetEditModified()221 void CPropertyTabDlg::ResetEditModified()
222 {
223 m_title_edit.ResetModified();
224 m_artist_edit.ResetModified();
225 m_album_edit.ResetModified();
226 m_track_edit.ResetModified();
227 m_year_edit.ResetModified();
228 m_comment_edit.ResetModified();
229 m_genre_combo.ResetModified();
230 }
231
OnTabEntered()232 void CPropertyTabDlg::OnTabEntered()
233 {
234 SetWreteEnable();
235 ShowInfo();
236 }
237
InitializeControls()238 bool CPropertyTabDlg::InitializeControls()
239 {
240 wstring temp;
241 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_INFO");
242 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_INFO_STATIC, temp.c_str());
243 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_NAME");
244 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_NAME_STATIC, temp.c_str());
245 // IDC_FILE_NAME_EDIT
246 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_PATH");
247 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_PATH_STATIC, temp.c_str());
248 // IDC_FILE_PATH_EDIT
249 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_TYPE");
250 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_TYPE_STATIC, temp.c_str());
251 // IDC_FILE_TYPE_EDIT
252 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_DURATION");
253 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_DURATION_STATIC, temp.c_str());
254 // IDC_SONG_LENGTH_EDIT
255 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_SIZE");
256 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_SIZE_STATIC, temp.c_str());
257 // IDC_FILE_SIZE_EDIT
258 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_BIT_RATE");
259 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_BIT_RATE_STATIC, temp.c_str());
260 // IDC_BIT_RATE_EDIT
261 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_CHANNELS");
262 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_CHANNELS_STATIC, temp.c_str());
263 // IDC_CHANNELS
264 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_FREQ");
265 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_FREQ_STATIC, temp.c_str());
266 // IDC_SAMPLE_FREQ
267 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_BIT_DEPTH");
268 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_FILE_BIT_DEPTH_STATIC, temp.c_str());
269 // IDC_BITS_DIPTH
270 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FILE_LRC_FILE");
271 SetDlgItemTextW(IDC_LYRIC_FILE_STATIC, temp.c_str());
272 // IDC_LYRIC_FILE_EDIT
273
274 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_INFO");
275 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_INFO_STATIC, temp.c_str());
276 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_TITLE");
277 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_TITLE_STATIC, temp.c_str());
278 // IDC_TITEL_EDIT
279 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_ARTIST");
280 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_ARTIST_STATIC, temp.c_str());
281 // IDC_ARTIST_EDIT
282 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_ALBUM");
283 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_ALBUM_STATIC, temp.c_str());
284 // IDC_ALBUM_EDIT
285 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_TRACK");
286 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_TRACK_STATIC, temp.c_str());
287 // IDC_TRACK_EDIT
288 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_YEAR");
289 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_YEAR_STATIC, temp.c_str());
290 // IDC_YEAR_EDIT
291 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_GENRE");
292 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_GENRE_STATIC, temp.c_str());
293 // IDC_GENRE_COMBO
294 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_TAG_COMMENT");
295 SetDlgItemTextW(IDC_TXT_PROPERTY_DLG_TAG_COMMENT_STATIC, temp.c_str());
296 // IDC_COMMENT_EDIT
297 // IDC_TAG_TYPE_STATIC
298 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FROM_FILE_NAME");
299 SetDlgItemTextW(IDC_GET_TAG_FROM_FILE_NAME_BUTTON, temp.c_str());
300 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FROM_LRC");
301 SetDlgItemTextW(IDC_GET_TAG_FROM_LYRIC_BUTTON, temp.c_str());
302 temp = theApp.m_str_table.LoadText(L"TXT_PROPERTY_DLG_FROM_ONLINE");
303 SetDlgItemTextW(IDC_GET_TAG_ONLINE_BUTTON, temp.c_str());
304
305 RepositionTextBasedControls({
306 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_NAME_STATIC },
307 { CtrlTextInfo::C0, IDC_FILE_NAME_EDIT },
308 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_PATH_STATIC },
309 { CtrlTextInfo::C0, IDC_FILE_PATH_EDIT },
310 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_TYPE_STATIC },
311 { CtrlTextInfo::C0, IDC_FILE_TYPE_EDIT },
312 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_DURATION_STATIC },
313 { CtrlTextInfo::C0, IDC_SONG_LENGTH_EDIT },
314 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_BIT_RATE_STATIC },
315 { CtrlTextInfo::C0, IDC_BIT_RATE_EDIT },
316 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_FREQ_STATIC },
317 { CtrlTextInfo::C0, IDC_SAMPLE_FREQ },
318 { CtrlTextInfo::L1, IDC_LYRIC_FILE_STATIC },
319 { CtrlTextInfo::C0, IDC_LYRIC_FILE_EDIT }
320 }, CtrlTextInfo::W64);
321 RepositionTextBasedControls({
322 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_SIZE_STATIC },
323 { CtrlTextInfo::C0, IDC_FILE_SIZE_EDIT },
324 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_CHANNELS_STATIC },
325 { CtrlTextInfo::C0, IDC_CHANNELS },
326 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_FILE_BIT_DEPTH_STATIC },
327 { CtrlTextInfo::C0, IDC_BITS_DIPTH }
328 }, CtrlTextInfo::W60);
329 RepositionTextBasedControls({
330 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_TITLE_STATIC },
331 { CtrlTextInfo::C0, IDC_TITEL_EDIT },
332 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_ARTIST_STATIC },
333 { CtrlTextInfo::C0, IDC_ARTIST_EDIT },
334 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_ALBUM_STATIC },
335 { CtrlTextInfo::C0, IDC_ALBUM_EDIT },
336 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_TRACK_STATIC },
337 { CtrlTextInfo::C0, IDC_TRACK_EDIT },
338 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_GENRE_STATIC },
339 { CtrlTextInfo::C0, IDC_GENRE_COMBO },
340 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_COMMENT_STATIC },
341 { CtrlTextInfo::C0, IDC_COMMENT_EDIT }
342 }, CtrlTextInfo::W32);
343 RepositionTextBasedControls({
344 { CtrlTextInfo::L1, IDC_TXT_PROPERTY_DLG_TAG_YEAR_STATIC },
345 { CtrlTextInfo::C0, IDC_YEAR_EDIT }
346 }, CtrlTextInfo::W40);
347 RepositionTextBasedControls({
348 { CtrlTextInfo::L3, IDC_GET_TAG_FROM_FILE_NAME_BUTTON, CtrlTextInfo::W32 },
349 { CtrlTextInfo::L2, IDC_GET_TAG_FROM_LYRIC_BUTTON, CtrlTextInfo::W32 },
350 { CtrlTextInfo::L1, IDC_GET_TAG_ONLINE_BUTTON, CtrlTextInfo::W32 }
351 });
352 return true;
353 }
354
DoDataExchange(CDataExchange * pDX)355 void CPropertyTabDlg::DoDataExchange(CDataExchange* pDX)
356 {
357 CTabDlg::DoDataExchange(pDX);
358 DDX_Control(pDX, IDC_FILE_NAME_EDIT, m_file_name_edit);
359 DDX_Control(pDX, IDC_FILE_PATH_EDIT, m_file_path_edit);
360 DDX_Control(pDX, IDC_FILE_TYPE_EDIT, m_file_type_edit);
361 DDX_Control(pDX, IDC_SONG_LENGTH_EDIT, m_song_length_edit);
362 DDX_Control(pDX, IDC_FILE_SIZE_EDIT, m_file_size_edit);
363 DDX_Control(pDX, IDC_BIT_RATE_EDIT, m_bit_rate_edit);
364 DDX_Control(pDX, IDC_TITEL_EDIT, m_title_edit);
365 DDX_Control(pDX, IDC_ARTIST_EDIT, m_artist_edit);
366 DDX_Control(pDX, IDC_ALBUM_EDIT, m_album_edit);
367 DDX_Control(pDX, IDC_TRACK_EDIT, m_track_edit);
368 DDX_Control(pDX, IDC_YEAR_EDIT, m_year_edit);
369 DDX_Control(pDX, IDC_COMMENT_EDIT, m_comment_edit);
370 DDX_Control(pDX, IDC_LYRIC_FILE_EDIT, m_lyric_file_edit);
371 DDX_Control(pDX, IDC_GENRE_COMBO, m_genre_combo);
372 }
373
374
BEGIN_MESSAGE_MAP(CPropertyTabDlg,CTabDlg)375 BEGIN_MESSAGE_MAP(CPropertyTabDlg, CTabDlg)
376 ON_WM_MOUSEWHEEL()
377 ON_EN_CHANGE(IDC_TITEL_EDIT, &CPropertyTabDlg::OnEnChangeTitelEdit)
378 ON_EN_CHANGE(IDC_ARTIST_EDIT, &CPropertyTabDlg::OnEnChangeArtistEdit)
379 ON_EN_CHANGE(IDC_ALBUM_EDIT, &CPropertyTabDlg::OnEnChangeAlbumEdit)
380 ON_EN_CHANGE(IDC_TRACK_EDIT, &CPropertyTabDlg::OnEnChangeTrackEdit)
381 ON_EN_CHANGE(IDC_YEAR_EDIT, &CPropertyTabDlg::OnEnChangeYearEdit)
382 ON_EN_CHANGE(IDC_COMMENT_EDIT, &CPropertyTabDlg::OnEnChangeCommentEdit)
383 //ON_CBN_EDITCHANGE(IDC_GENRE_COMBO, &CPropertyTabDlg::OnCbnEditchangeGenreCombo)
384 ON_CBN_SELCHANGE(IDC_GENRE_COMBO, &CPropertyTabDlg::OnCbnSelchangeGenreCombo)
385 //ON_BN_CLICKED(IDC_BUTTON3, &CPropertyTabDlg::OnBnClickedButton3)
386 ON_WM_MOUSEWHEEL()
387 ON_CBN_EDITCHANGE(IDC_GENRE_COMBO, &CPropertyTabDlg::OnCbnEditchangeGenreCombo)
388 ON_BN_CLICKED(IDC_GET_TAG_ONLINE_BUTTON, &CPropertyTabDlg::OnBnClickedGetTagOnlineButton)
389 ON_MESSAGE(WM_PORPERTY_ONLINE_INFO_ACQUIRED, &CPropertyTabDlg::OnPorpertyOnlineInfoAcquired)
390 ON_BN_CLICKED(IDC_GET_TAG_FROM_LYRIC_BUTTON, &CPropertyTabDlg::OnBnClickedGetTagFromLyricButton)
391 ON_BN_CLICKED(IDC_GET_TAG_FROM_FILE_NAME_BUTTON, &CPropertyTabDlg::OnBnClickedGetTagFromFileNameButton)
392 END_MESSAGE_MAP()
393
394
395 // CPropertyTabDlg 消息处理程序
396
397
398 BOOL CPropertyTabDlg::OnInitDialog()
399 {
400 CTabDlg::OnInitDialog();
401
402 // TODO: 在此添加额外的初始化
403 m_modified = false;
404 m_genre_modified = false;
405 m_list_refresh = false;
406
407 //初始化流派列表
408 CAudioCommon::EmulateGenre([&](const wstring& genre_str)
409 {
410 m_genre_combo.AddString(genre_str.c_str());
411 }, true);
412 CRect rect;
413 m_genre_combo.SetMinVisibleItems(15); //设置下拉列表的高度
414
415 //m_genre_combo.SetEditReadOnly();
416
417 ShowDlgCtrl(IDC_GET_TAG_ONLINE_BUTTON, !m_batch_edit && !m_read_only);
418 ShowDlgCtrl(IDC_GET_TAG_FROM_LYRIC_BUTTON, !m_read_only);
419 ShowDlgCtrl(IDC_GET_TAG_FROM_FILE_NAME_BUTTON, !m_read_only);
420
421 return TRUE; // return TRUE unless you set the focus to a control
422 // 异常: OCX 属性页应返回 FALSE
423 }
424
425
PagePrevious()426 void CPropertyTabDlg::PagePrevious()
427 {
428 m_modified = false;
429 m_genre_modified = false;
430 m_index--;
431 if (m_index < 0) m_index = m_song_num - 1;
432 if (m_index < 0) m_index = 0;
433 SetWreteEnable();
434 ShowInfo();
435 }
436
437
PageNext()438 void CPropertyTabDlg::PageNext()
439 {
440 m_modified = false;
441 m_genre_modified = false;
442 m_index++;
443 if (m_index >= m_song_num) m_index = 0;
444 SetWreteEnable();
445 ShowInfo();
446 }
447
448
PreTranslateMessage(MSG * pMsg)449 BOOL CPropertyTabDlg::PreTranslateMessage(MSG* pMsg)
450 {
451 // TODO: 在此添加专用代码和/或调用基类
452 //if (pMsg->message == WM_KEYDOWN)
453 //{
454 // if (pMsg->wParam == VK_UP)
455 // {
456 // PagePrevious();
457 // return TRUE;
458 // }
459 // if (pMsg->wParam == VK_DOWN)
460 // {
461 // PageNext();
462 // return TRUE;
463 // }
464 //}
465 return CTabDlg::PreTranslateMessage(pMsg);
466 }
467
468
OnEnChangeTitelEdit()469 void CPropertyTabDlg::OnEnChangeTitelEdit()
470 {
471 // TODO: 如果该控件是 RICHEDIT 控件,它将不
472 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
473 // 函数并调用 CRichEditCtrl().SetEventMask(),
474 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
475
476 // TODO: 在此添加控件通知处理程序代码
477 m_modified = (m_title_edit.GetModify() != 0);
478 SetSaveBtnEnable();
479 }
480
481
OnEnChangeArtistEdit()482 void CPropertyTabDlg::OnEnChangeArtistEdit()
483 {
484 // TODO: 如果该控件是 RICHEDIT 控件,它将不
485 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
486 // 函数并调用 CRichEditCtrl().SetEventMask(),
487 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
488
489 // TODO: 在此添加控件通知处理程序代码
490 m_modified = (m_artist_edit.GetModify() != 0);
491 SetSaveBtnEnable();
492 }
493
494
OnEnChangeAlbumEdit()495 void CPropertyTabDlg::OnEnChangeAlbumEdit()
496 {
497 // TODO: 如果该控件是 RICHEDIT 控件,它将不
498 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
499 // 函数并调用 CRichEditCtrl().SetEventMask(),
500 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
501
502 // TODO: 在此添加控件通知处理程序代码
503 m_modified = (m_album_edit.GetModify() != 0);
504 SetSaveBtnEnable();
505 }
506
507
OnEnChangeTrackEdit()508 void CPropertyTabDlg::OnEnChangeTrackEdit()
509 {
510 // TODO: 如果该控件是 RICHEDIT 控件,它将不
511 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
512 // 函数并调用 CRichEditCtrl().SetEventMask(),
513 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
514
515 // TODO: 在此添加控件通知处理程序代码
516 m_modified = (m_track_edit.GetModify() != 0);
517 SetSaveBtnEnable();
518 }
519
520
OnEnChangeYearEdit()521 void CPropertyTabDlg::OnEnChangeYearEdit()
522 {
523 // TODO: 如果该控件是 RICHEDIT 控件,它将不
524 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
525 // 函数并调用 CRichEditCtrl().SetEventMask(),
526 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
527
528 // TODO: 在此添加控件通知处理程序代码
529 m_modified = (m_year_edit.GetModify() != 0);
530 SetSaveBtnEnable();
531 }
532
533
OnEnChangeCommentEdit()534 void CPropertyTabDlg::OnEnChangeCommentEdit()
535 {
536 // TODO: 如果该控件是 RICHEDIT 控件,它将不
537 // 发送此通知,除非重写 CTabDlg::OnInitDialog()
538 // 函数并调用 CRichEditCtrl().SetEventMask(),
539 // 同时将 ENM_CHANGE 标志“或”运算到掩码中。
540
541 // TODO: 在此添加控件通知处理程序代码
542 m_modified = (m_comment_edit.GetModify() != 0);
543 SetSaveBtnEnable();
544 }
545
546
547 //void CPropertyTabDlg::OnCbnEditchangeGenreCombo()
548 //{
549 // // TODO: 在此添加控件通知处理程序代码
550 // m_modified = true;
551 //}
552
553
SaveModified()554 int CPropertyTabDlg::SaveModified()
555 {
556 if (!m_write_enable) return false;
557 CWaitCursor wait_cursor;
558 SongInfo song_info{ m_all_song_info[m_index] };
559 CString str_temp;
560 m_title_edit.GetWindowText(str_temp);
561 song_info.title = str_temp;
562 m_artist_edit.GetWindowText(str_temp);
563 song_info.artist = str_temp;
564 m_album_edit.GetWindowText(str_temp);
565 song_info.album = str_temp;
566 CString str_track;
567 m_track_edit.GetWindowText(str_track);
568 song_info.track = static_cast<BYTE>(_wtoi(str_track));
569 CString str_year;
570 m_year_edit.GetWindowText(str_year);
571 song_info.SetYear(str_year);
572 m_genre_combo.GetWindowText(str_temp);
573 song_info.genre = str_temp;
574 if (m_genre_modified)
575 song_info.genre_idx = CAudioCommon::GenreIndex(song_info.genre);
576 else
577 song_info.genre_idx = m_all_song_info[m_index].genre_idx; //如果流派没有修改,则将原来的流派号写回文件中
578 m_comment_edit.GetWindowText(str_temp);
579 song_info.comment = str_temp;
580
581 song_info.Normalize();
582
583 // 调用SaveModified的属性主窗口已进行ReOpen操作,此时程序没有打开任何歌曲
584 if (m_batch_edit)
585 {
586 int saved_count{};
587 for (int i{}; i < m_song_num; i++)
588 {
589 SongInfo& cur_song = m_all_song_info[i];
590 CopyMultiTagInfo(song_info.title, cur_song.title);
591 CopyMultiTagInfo(song_info.artist, cur_song.artist);
592 CopyMultiTagInfo(song_info.album, cur_song.album);
593 if (str_year != theApp.m_str_table.LoadText(L"TXT_MULTI_VALUE").c_str())
594 {
595 cur_song.SetYear(str_year);
596 }
597 CopyMultiTagInfo(song_info.genre, cur_song.genre);
598 CopyMultiTagInfo(song_info.comment, cur_song.comment);
599 if (str_track != theApp.m_str_table.LoadText(L"TXT_MULTI_VALUE").c_str())
600 {
601 cur_song.track = static_cast<BYTE>(_wtoi(str_track));
602 }
603 CAudioTag audio_tag(cur_song);
604 if (audio_tag.WriteAudioTag())
605 {
606 UpdateSongInfo(cur_song);
607 saved_count++;
608 }
609 }
610 if (saved_count > 0)
611 {
612 m_modified = false;
613 SetSaveBtnEnable();
614 ResetEditModified();
615 }
616 return saved_count;
617 }
618 else
619 {
620 CAudioTag audio_tag(song_info);
621 bool saved = audio_tag.WriteAudioTag();
622 if (saved)
623 {
624 //重新从文件读取该歌曲的标签
625 HSTREAM hStream;
626 hStream = BASS_StreamCreateFile(FALSE, song_info.file_path.c_str(), 0, 0, BASS_SAMPLE_FLOAT);
627 //CAudioCommon::GetAudioTags(hStream, AudioType::AU_MP3, CPlayer::GetInstance().GetCurrentDir(), m_all_song_info[m_index]);
628 CAudioTag audio_tag(m_all_song_info[m_index], hStream);
629 audio_tag.GetAudioTag();
630 BASS_StreamFree(hStream);
631 SongInfo song_info{ CSongDataManager::GetInstance().GetSongInfo3(m_all_song_info[m_index]) };
632 song_info.CopyAudioTag(m_all_song_info[m_index]);
633 CSongDataManager::GetInstance().AddItem(song_info);
634
635 m_modified = false;
636 SetSaveBtnEnable();
637 ResetEditModified();
638 m_list_refresh = true;
639 }
640 return saved;
641 }
642 }
643
644
OnCbnSelchangeGenreCombo()645 void CPropertyTabDlg::OnCbnSelchangeGenreCombo()
646 {
647 // TODO: 在此添加控件通知处理程序代码
648 m_modified = true;
649 m_genre_modified = true;
650 SetSaveBtnEnable();
651 }
652
653
654 //用于测试
655 //void CPropertyTabDlg::OnBnClickedButton3()
656 //{
657 // // TODO: 在此添加控件通知处理程序代码
658 // wstring str = CCommon::GetRandomString(32);
659 //
660 // //重新从文件读取该歌曲的标签
661 // wstring file_path;
662 // file_path = CPlayer::GetInstance().GetCurrentDir() + m_all_song_info[m_index].file_name;
663 // HSTREAM hStream;
664 // hStream = BASS_StreamCreateFile(FALSE, file_path.c_str(), 0, 0, BASS_SAMPLE_FLOAT);
665 // CAudioCommon::GetAudioTags(hStream, AudioType::AU_MP3, m_all_song_info[m_index]);
666 // BASS_StreamFree(hStream);
667 //}
668
669
OnMouseWheel(UINT nFlags,short zDelta,CPoint pt)670 BOOL CPropertyTabDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
671 {
672 // TODO: 在此添加消息处理程序代码和/或调用默认值
673
674 //return CTabDlg::OnMouseWheel(nFlags, zDelta, pt);
675 return TRUE;
676 }
677
678
OnCbnEditchangeGenreCombo()679 void CPropertyTabDlg::OnCbnEditchangeGenreCombo()
680 {
681 // TODO: 在此添加控件通知处理程序代码
682 CEdit* pEdit = m_genre_combo.GetEditCtrl();
683 if (pEdit!=nullptr)
684 m_modified = (pEdit->GetModify() != 0);
685 SetSaveBtnEnable();
686 }
687
688
OnBnClickedGetTagOnlineButton()689 void CPropertyTabDlg::OnBnClickedGetTagOnlineButton()
690 {
691 // TODO: 在此添加控件通知处理程序代码
692
693 CGetTagOnlineDlg dlg(m_all_song_info[m_index], this);
694 dlg.DoModal();
695 }
696
697
OnPorpertyOnlineInfoAcquired(WPARAM wParam,LPARAM lParam)698 afx_msg LRESULT CPropertyTabDlg::OnPorpertyOnlineInfoAcquired(WPARAM wParam, LPARAM lParam)
699 {
700 CInternetCommon::ItemInfo* pItem = (CInternetCommon::ItemInfo*)wParam;
701 if (pItem != nullptr)
702 {
703 SongInfo song;
704 song.title = pItem->title;
705 song.artist = pItem->artist;
706 song.album = pItem->album;
707 if (m_comment_edit.GetWindowTextLength() <= 0)
708 {
709 CString comment{ _T("id:") };
710 comment += pItem->id.c_str();
711 song.comment = comment;
712 }
713
714 ModifyTagInfo(song);
715 }
716 return 0;
717 }
718
719
OnBnClickedGetTagFromLyricButton()720 void CPropertyTabDlg::OnBnClickedGetTagFromLyricButton()
721 {
722 // TODO: 在此添加控件通知处理程序代码
723 CWaitCursor wait_cursor;
724 if (!m_batch_edit)
725 {
726 SongInfo& song{ m_all_song_info[m_index] };
727
728 SongInfo result;
729 if (GetTagFromLyrics(song, result))
730 ModifyTagInfo(result);
731 else
732 {
733 const wstring& info = theApp.m_str_table.LoadText(L"MSG_PROPERTY_DLG_NO_LYRICS_FOUND");
734 MessageBox(info.c_str(), NULL, MB_ICONWARNING | MB_OK);
735 }
736 }
737 else
738 {
739 int count{};
740 vector<SongInfo> list_ori = m_all_song_info; //保存修改前的曲目列表
741 for (auto& song : m_all_song_info)
742 {
743 SongInfo result;
744 if (GetTagFromLyrics(song, song))
745 {
746 count++;
747 }
748 if (count > 0)
749 {
750 ShowInfo();
751 m_modified = true;
752 SetSaveBtnEnable();
753
754 //判断哪些字段有修改
755 CPropertyDlgHelper helper(m_all_song_info);
756 if (helper.IsTitleModified(list_ori))
757 m_title_edit.SetModify();
758 if (helper.IsArtistModified(list_ori))
759 m_artist_edit.SetModify();
760 if (helper.IsAlbumModified(list_ori))
761 m_album_edit.SetModify();
762 }
763 }
764 }
765 }
766
767
OnBnClickedGetTagFromFileNameButton()768 void CPropertyTabDlg::OnBnClickedGetTagFromFileNameButton()
769 {
770 // TODO: 在此添加控件通知处理程序代码
771 CTagFromNameDlg dlg;
772 if (dlg.DoModal() == IDOK)
773 {
774 wstring formular = dlg.GetFormularSelected();
775 CWaitCursor wait_cursor;
776 if (!m_batch_edit)
777 {
778 SongInfo song;
779 wstring file_name = CFilePathHelper(m_all_song_info[m_index].file_path).GetFileNameWithoutExtension();
780 CTagFromNameDlg::GetTagFromFileName(formular, file_name, song);
781 ModifyTagInfo(song);
782 }
783 else
784 {
785 vector<SongInfo> list_ori = m_all_song_info; //保存修改前的曲目列表
786 for (auto& song : m_all_song_info)
787 {
788 wstring file_name = CFilePathHelper(song.file_path).GetFileNameWithoutExtension();
789 CTagFromNameDlg::GetTagFromFileName(formular, file_name, song);
790 }
791 ShowInfo();
792 m_modified = true;
793 SetSaveBtnEnable();
794
795 //判断哪些字段有修改
796 CPropertyDlgHelper helper(m_all_song_info);
797 if (helper.IsTitleModified(list_ori))
798 m_title_edit.SetModify();
799 if (helper.IsArtistModified(list_ori))
800 m_artist_edit.SetModify();
801 if (helper.IsAlbumModified(list_ori))
802 m_album_edit.SetModify();
803 if (helper.IsTrackModified(list_ori))
804 m_track_edit.SetModify();
805 if (helper.IsGenreModified(list_ori))
806 m_genre_combo.SetModify();
807 if (helper.IsYearModified(list_ori))
808 m_year_edit.SetModify();
809 if (helper.IsCommentModified(list_ori))
810 m_comment_edit.SetModify();
811 }
812 }
813 }
814
815
ModifyTagInfo(const SongInfo & song)816 void CPropertyTabDlg::ModifyTagInfo(const SongInfo& song)
817 {
818 bool modified{ false };
819 if (!song.title.empty() && m_title_edit.GetText() != song.title.c_str())
820 {
821 m_title_edit.SetWindowText(song.title.c_str());
822 m_title_edit.SetModify();
823 modified = true;
824 }
825 if (!song.artist.empty() && m_artist_edit.GetText() != song.artist.c_str())
826 {
827 m_artist_edit.SetWindowText(song.artist.c_str());
828 m_artist_edit.SetModify();
829 modified = true;
830 }
831 if (!song.album.empty() && m_album_edit.GetText() != song.album.c_str())
832 {
833 m_album_edit.SetWindowText(song.album.c_str());
834 m_album_edit.SetModify();
835 modified = true;
836 }
837 if (song.track != 0 && m_track_edit.GetText() != std::to_wstring(song.track).c_str())
838 {
839 m_track_edit.SetWindowText(std::to_wstring(song.track).c_str());
840 m_track_edit.SetModify();
841 modified = true;
842 }
843 if (!song.genre.empty() && m_genre_combo.GetText() != song.genre.c_str())
844 {
845 m_genre_combo.SetWindowText(song.genre.c_str());
846 m_genre_combo.SetModify();
847 modified = true;
848 }
849 if (!song.IsYearEmpty() && m_year_edit.GetText() != song.GetYear().c_str())
850 {
851 m_year_edit.SetWindowText(song.get_year().c_str());
852 m_year_edit.SetModify();
853 modified = true;
854 }
855 if (!song.comment.empty() && m_comment_edit.GetText() != song.comment.c_str())
856 {
857 m_comment_edit.SetWindowText(song.comment.c_str());
858 m_comment_edit.SetModify();
859 modified = true;
860 }
861
862 if (modified)
863 {
864 m_modified = true;
865 SetSaveBtnEnable();
866 }
867
868 }
869
GetTagFromLyrics(SongInfo & song,SongInfo & result)870 bool CPropertyTabDlg::GetTagFromLyrics(SongInfo& song, SongInfo& result)
871 {
872 //从歌词获取标签信息前,如果还未获取过歌词,从在这里获取一次歌词
873 if (!song.is_cue && song.lyric_file.empty()) // cue不能进行标签编辑
874 {
875 CMusicPlayerCmdHelper helper;
876 wstring lyric_path = helper.SearchLyricFile(song, theApp.m_lyric_setting_data.lyric_fuzzy_match);
877 song.lyric_file = lyric_path;
878 if (!lyric_path.empty())
879 {
880 //获取到歌词后同时更新song data
881 SongInfo song_info{ CSongDataManager::GetInstance().GetSongInfo3(song) };
882 song_info.lyric_file = lyric_path;
883 CSongDataManager::GetInstance().AddItem(song_info);
884 m_lyric_file_edit.SetWindowText(lyric_path.c_str());
885 }
886 }
887
888 if (!song.lyric_file.empty())
889 {
890 CLyrics lyrics{ song.lyric_file };
891 if (!lyrics.GetTitle().empty())
892 result.title = lyrics.GetTitle();
893 if (!lyrics.GetAritst().empty())
894 result.artist = lyrics.GetAritst();
895 if (!lyrics.GetAlbum().empty())
896 result.album = lyrics.GetAlbum();
897 return true;
898 }
899 return false;
900 }
901