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