xref: /MusicPlayer2/MusicPlayer2/LyricEditDlg.cpp (revision e51d77514999ce70db10740029cbbfec98e7c854)
1 // LyricEditDlg.cpp : 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "LyricEditDlg.h"
8 #include "FilterHelper.h"
9 #include "COSUPlayerHelper.h"
10 
11 // CLyricEditDlg 对话框
12 
IMPLEMENT_DYNAMIC(CLyricEditDlg,CBaseDialog)13 IMPLEMENT_DYNAMIC(CLyricEditDlg, CBaseDialog)
14 
15 CLyricEditDlg::CLyricEditDlg(CWnd* pParent /*=NULL*/)
16     : CBaseDialog(IDD_LYRIC_EDIT_DIALOG, pParent)
17 {
18 
19 }
20 
~CLyricEditDlg()21 CLyricEditDlg::~CLyricEditDlg()
22 {
23 }
24 
OpreateTag(TagOpreation operation)25 void CLyricEditDlg::OpreateTag(TagOpreation operation)
26 {
27     if (m_lyric_type == CLyrics::LyricType::LY_KSC)
28         return;
29     int start, end;			//光标选中的起始的结束位置
30     m_view->GetSel(start, end);
31     size_t line_start;		    //当前行的起始位置
32     line_start = m_lyric_string.rfind(L"\r\n", start - 1);	//从光标位置向前查找\r\n的位置
33     if (line_start == string::npos || start == 0)
34         line_start = 0;									//如果没有找到,则插入点的位置是最前面
35     else
36         line_start += 2;
37     size_t line_end;           //当前行的结束位置
38     line_end = m_lyric_string.find(L"\r\n", end);
39 
40     Time time_tag{ CPlayer::GetInstance().GetCurrentPosition() };		//获取当前播放时间
41     wchar_t time_tag_str[16];
42     swprintf_s(time_tag_str, L"[%.2d:%.2d.%.2d]", time_tag.min, time_tag.sec, time_tag.msec / 10);
43 
44     //查找当前行时间标签的位置
45     size_t tag_start = m_lyric_string.find(L'[', line_start);   //查找时间标签的开始位置
46     if (tag_start > line_end)
47         tag_start = wstring::npos;
48     size_t tag_end = m_lyric_string.find(L']', line_start);     //查找时间标签的结束位置
49     if (tag_end < tag_start || tag_end > line_end)
50         tag_end = wstring::npos;
51 
52     switch (operation)
53     {
54     case TagOpreation::INSERT:			//插入时间标签(在光标所在行的最左边插入)
55     {
56         m_lyric_string.insert(line_start, time_tag_str);
57         break;
58     }
59     case TagOpreation::REPLACE:			//替换时间标签(替换光标所在行的左边的标签)
60     {
61         //如果当前行没有时间标签,则插入时间标签
62         if (tag_start == wstring::npos || tag_end == wstring::npos) //如果当前行没有时间标签,则插入时间标签
63             m_lyric_string.insert(line_start, time_tag_str);
64         //替换时间标签
65         else
66             m_lyric_string.replace(tag_start, tag_end - tag_start + 1, time_tag_str, wcslen(time_tag_str));
67         break;
68     }
69     case TagOpreation::DELETE_:			//删除时间标签(删除光标所在处的标签)
70     {
71         if (tag_start == wstring::npos || tag_end == wstring::npos)
72             break;
73         m_lyric_string.erase(tag_start, tag_end - tag_start + 1);
74         break;
75     }
76     }
77 
78 
79     int next_index;			//下一行的起始位置
80     next_index = m_lyric_string.find(L"\r\n", start);
81     if (next_index == string::npos)
82     {
83         if (operation != TagOpreation::DELETE_)
84             m_lyric_string += L"\r\n";				//如果没有找到,说明当前已经是最后一行了,在末尾加上换行符
85         next_index = m_lyric_string.size() - 1;
86     }
87     else
88     {
89         next_index += 2;
90     }
91 
92     {
93         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
94         m_view->SetTextW(m_lyric_string);
95     }
96     if (operation != TagOpreation::DELETE_)
97         m_view->SetSel(next_index, next_index, m_lyric_string);
98     else
99         m_view->SetSel(line_start, line_start, m_lyric_string);
100     m_view->SetFocus();
101     m_modified = true;
102     UpdateStatusbarInfo();
103 }
104 
SaveLyric(wstring path,CodeType code_type)105 bool CLyricEditDlg::SaveLyric(wstring path, CodeType code_type)
106 {
107     // 这里不应当依赖播放实例,因为当前播放与启动歌词编辑的SongInfo不一定是同一个
108     CFilePathHelper song_path(m_current_edit_song.file_path);
109     bool lyric_write_support = CAudioTag::IsFileTypeLyricWriteSupport(song_path.GetFileExtension());
110     if (m_inner_lyric && lyric_write_support)
111     {
112         //写入内嵌歌词
113         bool saved{ false };
114         CPlayer::ReOpen reopen(true);
115         if (reopen.IsLockSuccess())
116         {
117             CAudioTag audio_tag(m_current_edit_song);
118             saved = audio_tag.WriteAudioLyric(m_lyric_string);
119         }
120         else
121         {
122             const wstring& info = theApp.m_str_table.LoadText(L"MSG_WAIT_AND_RETRY");
123             MessageBox(info.c_str(), NULL, MB_ICONINFORMATION | MB_OK);
124         }
125         if (saved)
126         {
127             m_modified = false;
128             m_lyric_saved = true;
129             UpdateStatusbarInfo();
130         }
131         else
132         {
133             const wstring& info = theApp.m_str_table.LoadText(L"MSG_LYRIC_SAVE_FAILED");
134             MessageBox(info.c_str(), NULL, MB_ICONWARNING | MB_OK);
135         }
136         return saved;
137     }
138     else
139     {
140         //写入歌词文件
141         if (path.empty())		//如果保存时传递的路径的空字符串,则将保存路径设置为当前歌曲所在路径
142         {
143             if (!m_current_edit_song.is_cue && !COSUPlayerHelper::IsOsuFile(m_current_edit_song.file_path))
144             {
145                 m_lyric_path = song_path.ReplaceFileExtension(L"lrc");
146             }
147             else
148             {
149                 m_lyric_path = song_path.GetDir() + m_current_edit_song.artist + L" - " + m_current_edit_song.title + L".lrc";
150                 CCommon::FileNameNormalize(m_lyric_path);
151             }
152             m_original_lyric_path = m_lyric_path;
153             SetLyricPathEditText();
154             path = m_lyric_path;
155         }
156         std::wstring saved_lyric_contents;
157         //如果是将非lrc格式歌词保存为lrc格式
158         std::wstring saved_extension = CFilePathHelper(path).GetFileExtension();
159         if (m_lyric_type != CLyrics::LyricType::LY_LRC && m_lyric_type != CLyrics::LyricType::LY_LRC_NETEASE && saved_extension == L"lrc")
160         {
161             CLyrics lyrics;
162             lyrics.LyricsFromRowString(m_lyric_string, m_lyric_type);
163             saved_lyric_contents = lyrics.GetLyricsString2(theApp.m_general_setting_data.download_lyric_text_and_translation_in_same_line, CLyrics::LyricType::LY_LRC);
164         }
165         else
166         {
167             saved_lyric_contents = m_lyric_string;
168         }
169 
170         bool char_connot_convert;
171         string lyric_str = CCommon::UnicodeToStr(saved_lyric_contents, code_type, &char_connot_convert);
172         if (char_connot_convert)	//当文件中包含Unicode字符时,询问用户是否要选择一个Unicode编码格式再保存
173         {
174             const wstring& info = theApp.m_str_table.LoadText(L"MSG_UNICODE_WARNING");
175             if (MessageBox(info.c_str(), NULL, MB_OKCANCEL | MB_ICONWARNING) != IDOK)
176                 return false;       //如果用户点击了取消按钮,则返回false
177         }
178         ofstream out_put{ path, std::ios::binary };
179         bool failed = out_put.fail();
180         out_put << lyric_str;
181         out_put.close();
182         if (!failed)
183         {
184             m_modified = false;
185             m_lyric_saved = true;
186             UpdateStatusbarInfo();
187         }
188         else
189         {
190             const wstring& info = theApp.m_str_table.LoadText(L"MSG_LYRIC_SAVE_FAILED");
191             MessageBox(info.c_str(), NULL, MB_ICONWARNING | MB_OK);
192         }
193         return !failed;
194     }
195 }
196 
UpdateStatusbarInfo()197 void CLyricEditDlg::UpdateStatusbarInfo()
198 {
199     //显示字符数
200     wstring total_char = theApp.m_str_table.LoadTextFormat(L"TXT_LYRIC_EDIT_TOTAL_CHARACTER", { m_lyric_string.size() });
201     //显示是否修改
202     wstring modified_info = m_modified ? theApp.m_str_table.LoadText(L"TXT_LYRIC_EDIT_MODIFIED") : theApp.m_str_table.LoadText(L"TXT_LYRIC_EDIT_UNMODIFIED");
203     //显示编码格式
204     wstring str;
205     switch (m_code_type)
206     {
207     case CodeType::ANSI: str = L"ANSI"; break;
208     case CodeType::UTF8: str = L"UTF8"; break;
209     case CodeType::UTF8_NO_BOM: str = theApp.m_str_table.LoadText(L"TXT_LYRIC_EDIT_UTF8NOBOM"); break;
210     case CodeType::UTF16LE: str = L"UTF16LE"; break;
211     case CodeType::UTF16BE: str = L"UTF16BE"; break;
212     default: str = L"<encode format error>";
213     }
214     wstring encode_info = theApp.m_str_table.LoadTextFormat(L"TXT_LYRIC_EDIT_ENCODE_FORMAT", { str });
215 
216     m_status_bar.SetText(total_char.c_str(), 0, 0);
217     m_status_bar.SetText(modified_info.c_str(), 1, 0);
218     m_status_bar.SetText(encode_info.c_str(), 2, 0);
219 }
220 
StatusBarSetParts(int width)221 void CLyricEditDlg::StatusBarSetParts(int width)
222 {
223     int nParts[3] = { width - theApp.DPI(240), width - theApp.DPI(160), -1 }; //分割尺寸
224     m_status_bar.SetParts(3, nParts); //分割状态栏
225 }
226 
OpenLyric(const wchar_t * path)227 void CLyricEditDlg::OpenLyric(const wchar_t* path)
228 {
229     m_lyric_path = path;
230     CLyrics lyrics{ m_lyric_path };					//打开文件
231     m_lyric_string = lyrics.GetLyricsString();
232     m_code_type = lyrics.GetCodeType();
233     m_inner_lyric = false;
234     m_lyric_type = lyrics.GetLyricType();
235     SetToolbarCmdEnable();
236 }
237 
SaveInquiry()238 bool CLyricEditDlg::SaveInquiry()
239 {
240     if (m_modified)
241     {
242         const wstring& info = theApp.m_str_table.LoadText(L"MSG_LYRIC_SAVE_INRUARY");
243         int rtn = MessageBox(info.c_str(), NULL, MB_YESNOCANCEL | MB_ICONQUESTION);
244         switch (rtn)
245         {
246         case IDYES: if (!SaveLyric(m_lyric_path.c_str(), m_code_type)) return false;
247         case IDNO: m_modified = false; break;
248         default: return false;
249         }
250     }
251     return true;
252 }
253 
SetLyricPathEditText()254 void CLyricEditDlg::SetLyricPathEditText()
255 {
256     if (m_inner_lyric)
257         SetDlgItemText(IDC_LYRIC_PATH_EDIT2, theApp.m_str_table.LoadText(L"TXT_INNER_LYRIC").c_str());
258     else
259         SetDlgItemText(IDC_LYRIC_PATH_EDIT2, m_lyric_path.c_str());
260 }
261 
CalculateEditCtrlRect()262 CRect CLyricEditDlg::CalculateEditCtrlRect()
263 {
264     CRect edit_rect;
265     GetClientRect(edit_rect);
266 
267     CRect path_edit_rect;
268     GetDlgItem(IDC_LYRIC_PATH_EDIT2)->GetWindowRect(path_edit_rect);
269     ScreenToClient(path_edit_rect);
270 
271     edit_rect.top = path_edit_rect.bottom + theApp.DPI(4);
272     //edit_rect.left += MARGIN;
273     //edit_rect.right -= MARGIN;
274     edit_rect.bottom -= (STATUSBAR_HEIGHT + theApp.DPI(4));
275     return edit_rect;
276 }
277 
GetDialogName() const278 CString CLyricEditDlg::GetDialogName() const
279 {
280     return _T("LyricEditDlg");
281 }
282 
InitializeControls()283 bool CLyricEditDlg::InitializeControls()
284 {
285     CBaseDialog::SetMinSize(theApp.DPI(300), theApp.DPI(300));
286     wstring temp;
287     temp = theApp.m_str_table.LoadText(L"TITLE_LYRIC_EDIT");
288     SetWindowTextW(temp.c_str());
289     temp = theApp.m_str_table.LoadText(L"TXT_LYRIC_EDIT_LYRIC_PATH");
290     SetDlgItemTextW(IDC_STATIC1, temp.c_str());
291     // IDC_LYRIC_PATH_EDIT2
292 
293     RepositionTextBasedControls({
294         { CtrlTextInfo::L1, IDC_STATIC1 },
295         { CtrlTextInfo::C0, IDC_LYRIC_PATH_EDIT2 }
296         }, CtrlTextInfo::W128);
297     return true;
298 }
299 
DoDataExchange(CDataExchange * pDX)300 void CLyricEditDlg::DoDataExchange(CDataExchange* pDX)
301 {
302     CBaseDialog::DoDataExchange(pDX);
303 }
304 
305 
BEGIN_MESSAGE_MAP(CLyricEditDlg,CBaseDialog)306 BEGIN_MESSAGE_MAP(CLyricEditDlg, CBaseDialog)
307     ON_WM_DESTROY()
308     ON_WM_CLOSE()
309     ON_COMMAND(ID_LYRIC_OPEN, &CLyricEditDlg::OnLyricOpen)
310     ON_COMMAND(ID_LYRIC_SAVE, &CLyricEditDlg::OnLyricSave)
311     ON_COMMAND(ID_LYRIC_SAVE_AS, &CLyricEditDlg::OnLyricSaveAs)
312     ON_COMMAND(ID_LYRIC_FIND, &CLyricEditDlg::OnLyricFind)
313     ON_COMMAND(ID_LYRIC_REPLACE, &CLyricEditDlg::OnLyricReplace)
314     ON_REGISTERED_MESSAGE(WM_FINDREPLACE, &CLyricEditDlg::OnFindReplace)
315     ON_COMMAND(ID_FIND_NEXT, &CLyricEditDlg::OnFindNext)
316     ON_WM_GETMINMAXINFO()
317     ON_WM_SIZE()
318     ON_COMMAND(ID_LE_TRANSLATE_TO_SIMPLIFIED_CHINESE, &CLyricEditDlg::OnLeTranslateToSimplifiedChinese)
319     ON_COMMAND(ID_LE_TRANSLATE_TO_TRANDITIONAL_CHINESE, &CLyricEditDlg::OnLeTranslateToTranditionalChinese)
320     ON_COMMAND(ID_LYRIC_INSERT_TAG, &CLyricEditDlg::OnLyricInsertTag)
321     ON_COMMAND(ID_LYRIC_REPLACE_TAG, &CLyricEditDlg::OnLyricReplaceTag)
322     ON_COMMAND(ID_LYRIC_DELETE_TAG, &CLyricEditDlg::OnLyricDeleteTag)
323     ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)
324     ON_COMMAND(ID_LRYIC_MERGE_SAME_TIME_TAG, &CLyricEditDlg::OnLryicMergeSameTimeTag)
325     ON_COMMAND(ID_LYRIC_SWAP_TEXT_AND_TRANSLATION, &CLyricEditDlg::OnLyricSwapTextAndTranslation)
326     ON_COMMAND(ID_LYRIC_TIME_TAG_FORWARD, &CLyricEditDlg::OnLyricTimeTagForward)
327     ON_COMMAND(ID_LYRIC_TIME_TAG_DELAY, &CLyricEditDlg::OnLyricTimeTagDelay)
328     ON_COMMAND(ID_SEEK_TO_CUR_LINE, &CLyricEditDlg::OnSeekToCurLine)
329     ON_WM_INITMENU()
330     ON_COMMAND(ID_LYRIC_AND_TRANSLATION_IN_SAME_LINE, &CLyricEditDlg::OnLyricAndTranslationInSameLine)
331     ON_COMMAND(ID_LYRIC_AND_TRANSLATION_IN_DIFFERENT_LINE, &CLyricEditDlg::OnLyricAndTranslationInDifferentLine)
332 END_MESSAGE_MAP()
333 
334 
335 // CLyricEditDlg 消息处理程序
336 
337 
338 BOOL CLyricEditDlg::OnInitDialog()
339 {
340     CBaseDialog::OnInitDialog();
341 
342     // TODO:  在此添加额外的初始化
343     CenterWindow();
344 
345     SetIcon(IconMgr::IconType::IT_Edit, FALSE);
346     SetIcon(IconMgr::IconType::IT_Edit, TRUE);
347 
348     m_view = (CScintillaEditView*)RUNTIME_CLASS(CScintillaEditView)->CreateObject();
349     m_view->Create(NULL, NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL, CalculateEditCtrlRect(), this, 3000);
350     m_view->OnInitialUpdate();
351     m_view->ShowWindow(SW_SHOW);
352 
353     //获取歌词信息
354     //m_lyric_string = CPlayer::GetInstance().m_Lyrics.GetLyricsString();
355     //m_lyric_path = CPlayer::GetInstance().m_Lyrics.GetPathName();
356     if (CPlayer::GetInstance().IsInnerLyric())
357     {
358         CLyrics lyrics = CPlayer::GetInstance().m_Lyrics;
359         m_lyric_string = lyrics.GetLyricsString();
360         m_code_type = lyrics.GetCodeType();
361         m_inner_lyric = true;
362         m_lyric_type = lyrics.GetLyricType();
363     }
364     else
365     {
366         OpenLyric(CPlayer::GetInstance().m_Lyrics.GetPathName().c_str());
367         m_inner_lyric = false;
368     }
369     m_original_lyric_path = m_lyric_path;
370     //m_code_type = CPlayer::GetInstance().m_Lyrics.GetCodeType();
371     m_current_edit_song = CPlayer::GetInstance().GetCurrentSongInfo();
372 
373     //初始化编辑区字体
374     m_view->SetFontFace(theApp.m_str_table.GetDefaultFontName().c_str());
375     m_view->SetFontSize(10);
376 
377     m_view->SetTextW(m_lyric_string);
378     m_view->EmptyUndoBuffer();
379 
380     m_view->SetLexerLyric(theApp.m_app_setting_data.theme_color);
381 
382     SetLyricPathEditText();
383 
384     // 设置窗口菜单 (窗口销毁前记得先分离菜单句柄)
385     ::SetMenu(m_hWnd, theApp.m_menu_mgr.GetSafeHmenu(MenuMgr::LeMenu));
386 
387     //初始化工具栏
388     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE/* | CBRS_TOP*/ | CBRS_ALIGN_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_TOP
389         /*| CBRS_GRIPPER*/ | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
390         !m_wndToolBar.LoadToolBar(IDR_LYRIC_EDIT_TOOLBAR))  //指定工具栏ID号
391     {
392         TRACE0("Failed to create toolbar/n");
393         return -1;      // fail to create
394     }
395     RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
396 
397     CSize icon_size = IconMgr::GetIconSize(IconMgr::IconSize::IS_DPI_20);
398     CImageList ImageList;
399     ImageList.Create(icon_size.cx, icon_size.cy, ILC_COLOR32 | ILC_MASK, 2, 2);
400 
401     //通过ImageList对象加载图标作为工具栏的图标
402     //添加图标
403     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Le_Tag_Insert, IconMgr::IconStyle::IS_Color, IconMgr::IconSize::IS_DPI_20));
404     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Le_Tag_Replace, IconMgr::IconStyle::IS_Color, IconMgr::IconSize::IS_DPI_20));
405     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Le_Tag_Delete, IconMgr::IconStyle::IS_Color, IconMgr::IconSize::IS_DPI_20));
406     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Le_Save, IconMgr::IconStyle::IS_Color, IconMgr::IconSize::IS_DPI_20));
407     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Play_Pause, IconMgr::IconStyle::IS_Filled, IconMgr::IconSize::IS_DPI_20));
408     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Rewind, IconMgr::IconStyle::IS_Filled, IconMgr::IconSize::IS_DPI_20));
409     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Fast_Forward, IconMgr::IconStyle::IS_Filled, IconMgr::IconSize::IS_DPI_20));
410     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Locate, IconMgr::IconStyle::IS_OutlinedDark, IconMgr::IconSize::IS_DPI_20));
411     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Le_Find, IconMgr::IconStyle::IS_Color, IconMgr::IconSize::IS_DPI_20));
412     ImageList.Add(theApp.m_icon_mgr.GetHICON(IconMgr::IconType::IT_Le_Replace, IconMgr::IconStyle::IS_Color, IconMgr::IconSize::IS_DPI_20));
413     m_wndToolBar.GetToolBarCtrl().SetImageList(&ImageList);
414     ImageList.Detach();
415     SetToolbarCmdEnable();
416 
417     //设置工具栏高度
418     CRect rect1;
419     m_wndToolBar.GetClientRect(rect1);
420     rect1.bottom = rect1.top + TOOLBAR_HEIGHT;
421     m_wndToolBar.MoveWindow(rect1);
422 
423     //初始化状态栏
424     CRect rect;
425     GetClientRect(&rect);
426     rect.top = rect.bottom - theApp.DPI(20);
427     m_status_bar.Create(WS_VISIBLE | CBRS_BOTTOM, rect, this, 3);
428 
429     StatusBarSetParts(rect.Width());
430     UpdateStatusbarInfo();
431 
432     m_dlg_exist = true;
433 
434     m_view->SetFocus();
435     return FALSE;  // return TRUE unless you set the focus to a control
436                   // 异常: OCX 属性页应返回 FALSE
437 }
438 
439 
OnCancel()440 void CLyricEditDlg::OnCancel()
441 {
442     // TODO: 在此添加专用代码和/或调用基类
443     if (!SaveInquiry())
444         return;
445 
446     DestroyWindow();
447 
448     //CBaseDialog::OnCancel();
449 }
450 
451 
452 //void CLyricEditDlg::OnBnClickedInsertTagButton()
453 //{
454 //	// TODO: 在此添加控件通知处理程序代码
455 //	OpreateTag(TagOpreation::INSERT);
456 //}
457 //
458 //
459 //void CLyricEditDlg::OnBnClickedReplaceTagButton()
460 //{
461 //	// TODO: 在此添加控件通知处理程序代码
462 //	OpreateTag(TagOpreation::REPLACE);
463 //}
464 //
465 //
466 //void CLyricEditDlg::OnBnClickedDeleteTag()
467 //{
468 //	// TODO: 在此添加控件通知处理程序代码
469 //	OpreateTag(TagOpreation::DELETE_);
470 //}
471 
472 
473 //void CLyricEditDlg::OnBnClickedSaveLyricButton()
474 //{
475 //	// TODO: 在此添加控件通知处理程序代码
476 //	OnLyricSave();
477 //}
478 
479 
480 //void CLyricEditDlg::OnBnClickedSaveAsButton5()
481 //{
482 //	// TODO: 在此添加控件通知处理程序代码
483 //}
484 
485 
OnDestroy()486 void CLyricEditDlg::OnDestroy()
487 {
488     // TODO: 在此处添加消息处理程序代码
489     ::SetMenu(m_hWnd, NULL);    // 菜单对象/句柄由MenuMgr管理,这里分离菜单以免句柄被销毁
490 
491     CBaseDialog::OnDestroy();
492 
493     m_dlg_exist = false;
494     if (m_current_edit_song.IsSameSong(CPlayer::GetInstance().GetCurrentSongInfo()) && m_lyric_saved)       // 关闭歌词编辑窗口时如果正在播放的歌曲没有变,且执行过保存操作,就重新初始化歌词
495     {
496         if (CPlayer::GetInstance().IsInnerLyric())
497         {
498             CPlayer::GetInstance().IniLyrics();
499         }
500         else
501         {
502             CPlayer::GetInstance().IniLyrics(m_original_lyric_path);
503         }
504     }
505 }
506 
507 
508 //void CLyricEditDlg::OnEnChangeEdit1()
509 //{
510 //	// TODO:  如果该控件是 RICHEDIT 控件,它将不
511 //	// 发送此通知,除非重写 CBaseDialog::OnInitDialog()
512 //	// 函数并调用 CRichEditCtrl().SetEventMask(),
513 //	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
514 //
515 //	// TODO:  在此添加控件通知处理程序代码
516 //	CString lyric_str;
517 //	m_lyric_edit.GetWindowText(lyric_str);
518 //	m_lyric_string = lyric_str;
519 //	m_modified = true;
520 //	UpdateStatusbarInfo();
521 //}
522 
523 
PreTranslateMessage(MSG * pMsg)524 BOOL CLyricEditDlg::PreTranslateMessage(MSG* pMsg)
525 {
526     // TODO: 在此添加专用代码和/或调用基类
527 
528     if (pMsg->message == WM_KEYDOWN)
529     {
530         if (pMsg->wParam == VK_ESCAPE)
531             return TRUE;
532         if (pMsg->wParam == VK_F8)
533         {
534             OpreateTag(TagOpreation::INSERT);
535             return TRUE;
536         }
537         if (pMsg->wParam == VK_F9)
538         {
539             OpreateTag(TagOpreation::REPLACE);
540             return TRUE;
541         }
542         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == VK_DELETE)
543         {
544             OpreateTag(TagOpreation::DELETE_);
545             return TRUE;
546         }
547         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == 'S')
548         {
549             OnLyricSave();
550             return TRUE;
551         }
552         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == 'P')
553         {
554             SendMessage(WM_COMMAND, ID_PLAY_PAUSE);
555             return TRUE;
556         }
557         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == VK_LEFT)
558         {
559             SendMessage(WM_COMMAND, ID_REW);
560             return TRUE;
561         }
562         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == VK_RIGHT)
563         {
564             SendMessage(WM_COMMAND, ID_FF);
565             return TRUE;
566         }
567         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == 'F')
568         {
569             OnLyricFind();
570             return TRUE;
571         }
572         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == 'H')
573         {
574             OnLyricReplace();
575             return TRUE;
576         }
577         if ((GetKeyState(VK_CONTROL) & 0x80) && pMsg->wParam == 'G')
578         {
579             OnSeekToCurLine();
580             return TRUE;
581         }
582         if (pMsg->wParam == VK_F3)
583         {
584             OnFindNext();
585             return TRUE;
586         }
587     }
588 
589     //按下F10时pMsg->message的值是WM_SYSKEYDOWN而不是WM_KEYDOWN
590     if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_F10)
591     {
592         OpreateTag(TagOpreation::DELETE_);
593         return TRUE;
594     }
595 
596     //if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
597     //	return TRUE;
598     //if (pMsg->message == WM_MOUSEMOVE)
599     //	m_Mytip.RelayEvent(pMsg);
600 
601     return CBaseDialog::PreTranslateMessage(pMsg);
602 }
603 
604 
OnClose()605 void CLyricEditDlg::OnClose()
606 {
607     // TODO: 在此添加消息处理程序代码和/或调用默认值
608     if (!SaveInquiry())
609         return;
610 
611     CBaseDialog::OnClose();
612 }
613 
614 
615 //void CLyricEditDlg::OnBnClickedOpenLyricButton()
616 //{
617 //	// TODO: 在此添加控件通知处理程序代码
618 //}
619 
620 
OnLyricOpen()621 void CLyricEditDlg::OnLyricOpen()
622 {
623     // TODO: 在此添加命令处理程序代码
624     if (m_modified)
625     {
626         const wstring& info = theApp.m_str_table.LoadText(L"MSG_LYRIC_SAVE_INRUARY");
627         int rtn = MessageBox(info.c_str(), NULL, MB_YESNOCANCEL | MB_ICONQUESTION);
628         switch (rtn)
629         {
630         case IDYES:
631             if (!SaveLyric(m_lyric_path.c_str(), m_code_type))
632                 return;
633             m_modified = false;
634             break;
635         case IDNO:
636             break;
637         default:
638             return;
639         }
640     }
641 
642     //设置过滤器
643     wstring filter = FilterHelper::GetLyricFileFilter();
644     //构造打开文件对话框
645     CFileDialog fileDlg(TRUE, _T("txt"), NULL, 0, filter.c_str(), this);
646     //显示打开文件对话框
647     if (IDOK == fileDlg.DoModal())
648     {
649         //m_lyric_path = fileDlg.GetPathName();	//获取打开的文件路径
650         OpenLyric(fileDlg.GetPathName());
651         SetDlgItemText(IDC_LYRIC_PATH_EDIT2, m_lyric_path.c_str());
652         m_view->SetTextW(m_lyric_string);
653         m_view->EmptyUndoBuffer();
654     }
655 }
656 
657 
OnLyricSave()658 void CLyricEditDlg::OnLyricSave()
659 {
660     // TODO: 在此添加命令处理程序代码
661     if (m_modified)
662         SaveLyric(m_lyric_path.c_str(), m_code_type);
663 }
664 
665 
OnLyricSaveAs()666 void CLyricEditDlg::OnLyricSaveAs()
667 {
668     // TODO: 在此添加命令处理程序代码
669     //构造保存文件对话框
670     wstring default_path = m_lyric_path;
671     if (m_inner_lyric)
672         default_path = CFilePathHelper(CPlayer::GetInstance().GetCurrentFilePath()).ReplaceFileExtension(L"lrc").c_str();
673     wstring filter = FilterHelper::GetLyricFileFilter();
674     CFileDialog fileDlg(FALSE, _T("txt"), default_path.c_str(), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter.c_str(), this);
675     //为“另存为”对话框添加一个组合选择框
676     fileDlg.AddComboBox(IDC_SAVE_COMBO_BOX);
677     //为组合选择框添加项目
678     fileDlg.AddControlItem(IDC_SAVE_COMBO_BOX, 0, theApp.m_str_table.LoadText(L"TXT_SAVE_AS_ANSI").c_str());
679     fileDlg.AddControlItem(IDC_SAVE_COMBO_BOX, 1, theApp.m_str_table.LoadText(L"TXT_SAVE_AS_UTF8").c_str());
680     //为组合选择框设置默认选中的项目
681     DWORD default_selected{ 0 };
682     if (m_code_type == CodeType::UTF8 || m_code_type == CodeType::UTF8_NO_BOM)
683         default_selected = 1;
684     fileDlg.SetSelectedControlItem(IDC_SAVE_COMBO_BOX, default_selected);
685 
686     //显示保存文件对话框
687     if (IDOK == fileDlg.DoModal())
688     {
689         DWORD selected_item;
690         fileDlg.GetSelectedControlItem(IDC_SAVE_COMBO_BOX, selected_item);	//获取“编码格式”中选中的项目
691         CodeType save_code{};
692         switch (selected_item)
693         {
694         case 0: save_code = CodeType::ANSI; break;
695         case 1: save_code = CodeType::UTF8; break;
696         default: break;
697         }
698         SaveLyric(fileDlg.GetPathName().GetString(), save_code);
699     }
700 }
701 
702 
OnLyricFind()703 void CLyricEditDlg::OnLyricFind()
704 {
705     // TODO: 在此添加命令处理程序代码
706     if (m_pFindDlg == nullptr)
707     {
708         m_pFindDlg = new CFindReplaceDialog;
709         m_pFindDlg->Create(TRUE, NULL, NULL, FR_DOWN | FR_HIDEWHOLEWORD | FR_HIDEMATCHCASE, this);
710     }
711     m_pFindDlg->ShowWindow(SW_SHOW);
712     m_pFindDlg->SetActiveWindow();
713 }
714 
715 
OnLyricReplace()716 void CLyricEditDlg::OnLyricReplace()
717 {
718     // TODO: 在此添加命令处理程序代码
719     if (m_pReplaceDlg == nullptr)
720     {
721         m_pReplaceDlg = new CFindReplaceDialog;
722         m_pReplaceDlg->Create(FALSE, NULL, NULL, FR_DOWN | FR_HIDEWHOLEWORD | FR_HIDEMATCHCASE, this);
723     }
724     m_pReplaceDlg->ShowWindow(SW_SHOW);
725     m_pReplaceDlg->SetActiveWindow();
726 }
727 
728 
OnFindReplace(WPARAM wParam,LPARAM lParam)729 afx_msg LRESULT CLyricEditDlg::OnFindReplace(WPARAM wParam, LPARAM lParam)
730 {
731     if (m_pFindDlg != nullptr)
732     {
733         m_find_str = m_pFindDlg->GetFindString();
734         m_find_down = (m_pFindDlg->SearchDown() != 0);
735         if (m_pFindDlg->FindNext())		//查找下一个时
736         {
737             OnFindNext();
738         }
739         if (m_pFindDlg->IsTerminating())	//关闭窗口时
740         {
741             //m_pFindDlg->DestroyWindow();
742             m_pFindDlg = nullptr;
743         }
744     }
745     //delete m_pFindDlg;
746 
747     if (m_pReplaceDlg != nullptr)
748     {
749         m_find_str = m_pReplaceDlg->GetFindString();
750         m_replace_str = m_pReplaceDlg->GetReplaceString();
751         if (m_pReplaceDlg->FindNext())		//查找下一个时
752         {
753             OnFindNext();
754         }
755         if (m_pReplaceDlg->ReplaceCurrent())	//替换当前时
756         {
757             if (m_find_flag)
758             {
759                 m_lyric_string.replace(m_find_index, m_find_str.size(), m_replace_str.c_str(), m_replace_str.size());	//替换找到的字符串
760                 {
761                     CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
762                     m_view->SetTextW(m_lyric_string);
763                 }
764                 m_modified = true;
765                 UpdateStatusbarInfo();
766                 OnFindNext();
767                 m_view->SetSel(m_find_index, m_find_index + m_replace_str.size(), m_lyric_string);	//选中替换的字符串
768                 SetActiveWindow();		//将编辑器窗口设置活动窗口
769             }
770             else
771             {
772                 OnFindNext();
773             }
774         }
775         if (m_pReplaceDlg->ReplaceAll())		//替换全部时
776         {
777             int replace_count{};	//统计替换的字符串的个数
778             while (true)
779             {
780                 int index_offset = m_replace_str.size() - m_find_str.size();
781                 if (index_offset < 0)
782                     index_offset = 0;
783                 m_find_index = m_lyric_string.find(m_find_str, m_find_index + index_offset + 1);	//查找字符串
784                 if (m_find_index == string::npos)
785                     break;
786                 m_lyric_string.replace(m_find_index, m_find_str.size(), m_replace_str.c_str(), m_replace_str.size());	//替换找到的字符串
787                 replace_count++;
788             }
789             {
790                 CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
791                 m_view->SetTextW(m_lyric_string);
792             }
793             m_modified = true;
794             UpdateStatusbarInfo();
795             if (replace_count != 0)
796             {
797                 wstring info = theApp.m_str_table.LoadTextFormat(L"MSG_LYRIC_EDIT_STRING_REPLACE_COMPLETE", { replace_count });
798                 MessageBox(info.c_str(), NULL, MB_ICONINFORMATION);
799             }
800         }
801         if (m_pReplaceDlg->IsTerminating())
802         {
803             m_pReplaceDlg = nullptr;
804         }
805     }
806     return 0;
807 }
808 
809 
OnFindNext()810 void CLyricEditDlg::OnFindNext()
811 {
812     // TODO: 在此添加命令处理程序代码
813     if (m_find_down)
814         m_find_index = m_lyric_string.find(m_find_str, m_find_index + 1);	//向后查找
815     else
816         m_find_index = m_lyric_string.rfind(m_find_str, m_find_index - 1);	//向前查找
817     if (m_find_index == string::npos)
818     {
819         wstring info = theApp.m_str_table.LoadTextFormat(L"MSG_LYRIC_EDIT_STRING_CANNOT_FIND", { m_find_str });
820         MessageBox(info.c_str(), NULL, MB_OK | MB_ICONINFORMATION);
821         m_find_flag = false;
822     }
823     else
824     {
825         m_view->SetSel(m_find_index, m_find_index + m_find_str.size(), m_lyric_string);		//选中找到的字符串
826         SetActiveWindow();		//将编辑器窗口设为活动窗口
827         m_view->SetFocus();
828         m_find_flag = true;
829     }
830 }
831 
832 //
833 //void CLyricEditDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
834 //{
835 //	// TODO: 在此添加消息处理程序代码和/或调用默认值
836 //	//限制窗口最小大小
837 //	lpMMI->ptMinTrackSize.x = theApp.DPI(300);		//设置最小宽度
838 //	lpMMI->ptMinTrackSize.y = theApp.DPI(300);		//设置最小高度
839 //
840 //	CBaseDialog::OnGetMinMaxInfo(lpMMI);
841 //}
842 
843 
OnSize(UINT nType,int cx,int cy)844 void CLyricEditDlg::OnSize(UINT nType, int cx, int cy)
845 {
846     CBaseDialog::OnSize(nType, cx, cy);
847 
848     // TODO: 在此处添加消息处理程序代码
849     //窗口大小变化时调整状态栏的大小和位置
850     if (nType != SIZE_MINIMIZED && m_status_bar.m_hWnd)
851     {
852         CRect rect;
853         rect.right = cx;
854         rect.bottom = cy;
855         rect.top = rect.bottom - STATUSBAR_HEIGHT;
856         m_status_bar.MoveWindow(rect);
857         StatusBarSetParts(cx);
858     }
859 
860     //调整窗口的大小和位置
861     if (nType != SIZE_MINIMIZED)
862     {
863         if (m_view->GetSafeHwnd() != NULL)
864         {
865             m_view->MoveWindow(CalculateEditCtrlRect());
866         }
867 
868         if (m_wndToolBar.m_hWnd != NULL)
869         {
870             CRect rect;
871             rect.left = 0;
872             rect.top = 0;
873             rect.right = cx;
874             rect.bottom = TOOLBAR_HEIGHT;
875             m_wndToolBar.MoveWindow(rect);
876         }
877     }
878 }
879 
880 
OnLeTranslateToSimplifiedChinese()881 void CLyricEditDlg::OnLeTranslateToSimplifiedChinese()
882 {
883     // TODO: 在此添加命令处理程序代码
884     m_lyric_string = CCommon::TranslateToSimplifiedChinese(m_lyric_string);
885     {
886         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
887         m_view->SetTextW(m_lyric_string);
888     }
889     m_modified = true;
890     UpdateStatusbarInfo();
891 }
892 
893 
OnLeTranslateToTranditionalChinese()894 void CLyricEditDlg::OnLeTranslateToTranditionalChinese()
895 {
896     // TODO: 在此添加命令处理程序代码
897     m_lyric_string = CCommon::TranslateToTranditionalChinese(m_lyric_string);
898     {
899         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
900         m_view->SetTextW(m_lyric_string);
901     }
902     m_modified = true;
903     UpdateStatusbarInfo();
904 }
905 
906 
OnLyricInsertTag()907 void CLyricEditDlg::OnLyricInsertTag()
908 {
909     // TODO: 在此添加命令处理程序代码
910     OpreateTag(TagOpreation::INSERT);
911 }
912 
913 
OnLyricReplaceTag()914 void CLyricEditDlg::OnLyricReplaceTag()
915 {
916     // TODO: 在此添加命令处理程序代码
917     OpreateTag(TagOpreation::REPLACE);
918 }
919 
920 
OnLyricDeleteTag()921 void CLyricEditDlg::OnLyricDeleteTag()
922 {
923     // TODO: 在此添加命令处理程序代码
924     OpreateTag(TagOpreation::DELETE_);
925 }
926 
OnToolTipText(UINT,NMHDR * pNMHDR,LRESULT * pResult)927 BOOL CLyricEditDlg::OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult)
928 {
929     TOOLTIPTEXT* pT = (TOOLTIPTEXT*)pNMHDR; //将pNMHDR转换成TOOLTIPTEXT指针类型数据
930     UINT nID = pNMHDR->idFrom;  //获取工具条上按钮的ID
931     wstring tipInfo;
932     switch (nID)
933     {
934     case ID_LYRIC_INSERT_TAG:
935         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_INSERT_TIME_TAG") + L" (F8)";
936         break;
937     case ID_LYRIC_REPLACE_TAG:
938         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_REPLACE_TIME_TAG") + L" (F9)";
939         break;
940     case ID_LYRIC_DELETE_TAG:
941         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_DELETE_TIME_TAG") + L" (F10)";
942         break;
943     case ID_LYRIC_SAVE:
944         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_SAVE") + L" (Ctrl+S)";
945         break;
946     case ID_PLAY_PAUSE:
947         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_PLAY_PAUSE") + L" (Ctrl+P)";
948         break;
949     case ID_REW:
950         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_REWIND") + L" (Ctrl+←)";
951         break;
952     case ID_FF:
953         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_FAST_FOWARD") + L" (Ctrl+→)";
954         break;
955     case ID_LYRIC_FIND:
956         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_FIND") + L" (Ctrl+F)";
957         break;
958     case ID_LYRIC_REPLACE:
959         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_REPLACE") + L" (Ctrl+H)";
960         break;
961     case ID_SEEK_TO_CUR_LINE:
962         tipInfo = theApp.m_str_table.LoadText(L"TIP_LYRIC_EDIT_SEEK_TO_LINE") + L" (Ctrl+G)";
963         break;
964     }
965 
966     CCommon::WStringCopy(pT->szText, 80, tipInfo.c_str());
967 
968     return 0;
969 }
970 
971 
OnLryicMergeSameTimeTag()972 void CLyricEditDlg::OnLryicMergeSameTimeTag()
973 {
974     // TODO: 在此添加命令处理程序代码
975     CLyrics lyrics;
976     lyrics.LyricsFromRowString(m_lyric_string);
977     lyrics.CombineSameTimeLyric();
978     m_lyric_string = lyrics.GetLyricsString2();
979     {
980         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
981         m_view->SetTextW(m_lyric_string);
982     }
983     m_modified = true;
984     UpdateStatusbarInfo();
985 }
986 
987 
OnLyricSwapTextAndTranslation()988 void CLyricEditDlg::OnLyricSwapTextAndTranslation()
989 {
990     // TODO: 在此添加命令处理程序代码
991     CLyrics lyrics;
992     if (lyrics.IsTranslated())
993     {
994         lyrics.LyricsFromRowString(m_lyric_string);
995         lyrics.SwapTextAndTranslation();
996         m_lyric_string = lyrics.GetLyricsString2(lyrics.IsTextAndTranslationInSameLine());
997         {
998             CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
999             m_view->SetTextW(m_lyric_string);
1000         }
1001         m_modified = true;
1002         UpdateStatusbarInfo();
1003     }
1004 }
1005 
1006 
OnLyricTimeTagForward()1007 void CLyricEditDlg::OnLyricTimeTagForward()
1008 {
1009     // TODO: 在此添加命令处理程序代码
1010     CLyrics lyrics;
1011     lyrics.LyricsFromRowString(m_lyric_string);
1012     lyrics.TimeTagForward();
1013     m_lyric_string = lyrics.GetLyricsString2(lyrics.IsTextAndTranslationInSameLine());
1014     {
1015         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
1016         m_view->SetTextW(m_lyric_string);
1017     }
1018     m_modified = true;
1019     UpdateStatusbarInfo();
1020 }
1021 
1022 
OnLyricTimeTagDelay()1023 void CLyricEditDlg::OnLyricTimeTagDelay()
1024 {
1025     // TODO: 在此添加命令处理程序代码
1026     CLyrics lyrics;
1027     lyrics.LyricsFromRowString(m_lyric_string);
1028     lyrics.TimeTagDelay();
1029     m_lyric_string = lyrics.GetLyricsString2(lyrics.IsTextAndTranslationInSameLine());
1030     {
1031         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
1032         m_view->SetTextW(m_lyric_string);
1033     }
1034     m_modified = true;
1035     UpdateStatusbarInfo();
1036 }
1037 
1038 
OnNotify(WPARAM wParam,LPARAM lParam,LRESULT * pResult)1039 BOOL CLyricEditDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
1040 {
1041     // TODO: 在此添加专用代码和/或调用基类
1042     SCNotification* notification = reinterpret_cast<SCNotification*>(lParam);
1043     if (notification->nmhdr.hwndFrom == m_view->GetSafeHwnd())
1044     {
1045         //响应编辑器文本变化
1046         if (notification->nmhdr.code == SCN_MODIFIED && m_view->IsEditChangeNotificationEnable())
1047         {
1048             UINT marsk = (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT | SC_PERFORMED_UNDO | SC_PERFORMED_REDO);
1049             if ((notification->modificationType & marsk) != 0)
1050             {
1051                 m_view->GetTextW(m_lyric_string);
1052                 m_modified = true;
1053                 UpdateStatusbarInfo();
1054             }
1055         }
1056     }
1057 
1058     return CBaseDialog::OnNotify(wParam, lParam, pResult);
1059 }
1060 
1061 
OnSeekToCurLine()1062 void CLyricEditDlg::OnSeekToCurLine()
1063 {
1064     // TODO: 在此添加命令处理程序代码
1065     std::wstring cur_line = m_view->GetCurrentLineTextW();
1066     Time t;
1067     int pos_start{}, pos_end{};
1068     wchar_t bracket_left{ L'[' };
1069     wchar_t bracket_right{ L']' };
1070     if (m_lyric_type == CLyrics::LyricType::LY_KSC)
1071     {
1072         bracket_left = L'\'';
1073         bracket_right = L'\'';
1074     }
1075     if (m_original_lyric_path == CPlayer::GetInstance().GetCurrentSongInfo().lyric_file && CLyrics::ParseLyricTimeTag(cur_line, t, pos_start, pos_end, bracket_left, bracket_right))
1076     {
1077         if (CPlayer::GetInstance().GetPlayStatusMutex().try_lock_for(std::chrono::milliseconds(1000)))
1078         {
1079             CPlayer::GetInstance().SeekTo(t.toInt());
1080             CPlayer::GetInstance().GetPlayStatusMutex().unlock();
1081         }
1082     }
1083 }
1084 
1085 
OnInitMenu(CMenu * pMenu)1086 void CLyricEditDlg::OnInitMenu(CMenu* pMenu)
1087 {
1088     CBaseDialog::OnInitMenu(pMenu);
1089 
1090     // TODO: 在此处添加消息处理程序代码
1091     bool is_lrc{ m_lyric_type == CLyrics::LyricType::LY_LRC };
1092     bool is_vtt{ m_lyric_type == CLyrics::LyricType::LY_VTT };
1093     pMenu->EnableMenuItem(ID_LYRIC_INSERT_TAG, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1094     pMenu->EnableMenuItem(ID_LYRIC_REPLACE_TAG, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1095     pMenu->EnableMenuItem(ID_LYRIC_DELETE_TAG, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1096     pMenu->EnableMenuItem(ID_LRYIC_MERGE_SAME_TIME_TAG, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1097     pMenu->EnableMenuItem(ID_LYRIC_SWAP_TEXT_AND_TRANSLATION, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1098     pMenu->EnableMenuItem(ID_LYRIC_TIME_TAG_FORWARD, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1099     pMenu->EnableMenuItem(ID_LYRIC_TIME_TAG_DELAY, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1100     pMenu->EnableMenuItem(ID_SEEK_TO_CUR_LINE, MF_BYCOMMAND | (!is_vtt ? MF_ENABLED : MF_GRAYED));
1101     pMenu->EnableMenuItem(ID_LYRIC_AND_TRANSLATION_IN_SAME_LINE, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1102     pMenu->EnableMenuItem(ID_LYRIC_AND_TRANSLATION_IN_DIFFERENT_LINE, MF_BYCOMMAND | (is_lrc ? MF_ENABLED : MF_GRAYED));
1103 }
1104 
OnLyricAndTranslationInSameLine()1105 void CLyricEditDlg::OnLyricAndTranslationInSameLine()
1106 {
1107     CLyrics lyrics;
1108     lyrics.LyricsFromRowString(m_lyric_string);
1109     m_lyric_string = lyrics.GetLyricsString2(true);
1110     {
1111         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
1112         m_view->SetTextW(m_lyric_string);
1113     }
1114     m_modified = true;
1115     UpdateStatusbarInfo();
1116 }
1117 
OnLyricAndTranslationInDifferentLine()1118 void CLyricEditDlg::OnLyricAndTranslationInDifferentLine()
1119 {
1120     CLyrics lyrics;
1121     lyrics.LyricsFromRowString(m_lyric_string);
1122     m_lyric_string = lyrics.GetLyricsString2(false);
1123     {
1124         CScintillaEditView::KeepCurrentLine keep_cur_line(m_view);
1125         m_view->SetTextW(m_lyric_string);
1126     }
1127     m_modified = true;
1128     UpdateStatusbarInfo();
1129 }
1130 
SetToolbarCmdEnable()1131 void CLyricEditDlg::SetToolbarCmdEnable()
1132 {
1133     if (m_wndToolBar.m_hWnd != NULL)
1134     {
1135         bool is_lrc{ m_lyric_type == CLyrics::LyricType::LY_LRC };
1136         bool is_vtt{ m_lyric_type == CLyrics::LyricType::LY_VTT };
1137         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LYRIC_INSERT_TAG, is_lrc);
1138         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LYRIC_REPLACE_TAG, is_lrc);
1139         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LYRIC_DELETE_TAG, is_lrc);
1140         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LRYIC_MERGE_SAME_TIME_TAG, is_lrc);
1141         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LYRIC_SWAP_TEXT_AND_TRANSLATION, is_lrc);
1142         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LYRIC_TIME_TAG_FORWARD, is_lrc);
1143         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_LYRIC_TIME_TAG_DELAY, is_lrc);
1144         m_wndToolBar.GetToolBarCtrl().EnableButton(ID_SEEK_TO_CUR_LINE, !is_vtt);
1145     }
1146 }
1147