xref: /MusicPlayer2/MusicPlayer2/PropertyTabDlg.cpp (revision 86e2c9c227ea58a4f87dda2d9ffa8cbe422b3071)
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