123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- using BeatLyrics.Common.Models;
- using BeatLyrics.Tool.Dialogs;
- using BeatLyrics.Tool.Models;
- using BeatLyrics.Tool.Utils;
- using BrightIdeasSoftware;
- using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
- using System;
- using System.Linq;
- using System.Text.RegularExpressions;
- using System.Windows.Forms;
- namespace BeatLyrics.Tool.UserControls
- {
- internal partial class TextArrangeUserControl : UserControl
- {
- private static readonly Regex RegRemoveRuby1 = new Regex("([(\\(]\\p{IsHiragana}+[\\))])", RegexOptions.Compiled);
- private static readonly Regex RegRemoveRuby2 = new Regex("(<ruby=\\p{IsHiragana}+>)", RegexOptions.Compiled);
- private static readonly Regex RegRemoveRuby3 = new Regex("(</ruby>)", RegexOptions.Compiled);
- private static readonly Regex RegRubyConvert = new Regex("(<(.+?)=(\\p{IsHiragana}+)>)", RegexOptions.Compiled);
- private LyricFileExt _file;
- public TextArrangeUserControl()
- {
- InitializeComponent();
- }
- public void SetMediaInfo(int totalMilliseconds) => PlayPosTrackBar.Maximum = totalMilliseconds;
- public void SetLyricFile(LyricFileExt file)
- {
- _file = file;
- LeftLyricsObjectListView.SetObjects(file.Main);
- RightLyricsObjectListView.SetObjects(file.Subtitle);
- LeftTextButton.Enabled = !string.IsNullOrWhiteSpace(file.MainText);
- RightTextButton.Enabled = !string.IsNullOrWhiteSpace(file.SubtitleText);
- UpdateTimer.Start();
- }
- public void ClearData()
- {
- UpdateTimer.Stop();
- OggAudioPlayer.Unload();
- }
- private void MovePos(int ms)
- {
- foreach (LyricDetail item in LeftLyricsObjectListView.SelectedObjects)
- {
- item.TimeMs += ms;
- }
- LeftLyricsObjectListView.UpdateObjects(LeftLyricsObjectListView.SelectedObjects);
- foreach (LyricDetail item in RightLyricsObjectListView.SelectedObjects)
- {
- item.TimeMs += ms;
- }
- RightLyricsObjectListView.UpdateObjects(RightLyricsObjectListView.SelectedObjects);
- }
- private void SetPos(int ms)
- {
- foreach (LyricDetail item in LeftLyricsObjectListView.SelectedObjects)
- {
- item.TimeMs = ms;
- }
- LeftLyricsObjectListView.UpdateObjects(LeftLyricsObjectListView.SelectedObjects);
- foreach (LyricDetail item in RightLyricsObjectListView.SelectedObjects)
- {
- item.TimeMs = ms;
- }
- RightLyricsObjectListView.UpdateObjects(RightLyricsObjectListView.SelectedObjects);
- }
- private void SetEnd(int ms)
- {
- foreach (LyricDetail item in LeftLyricsObjectListView.SelectedObjects)
- {
- item.DurationMs = ms - item.TimeMs;
- }
- LeftLyricsObjectListView.UpdateObjects(LeftLyricsObjectListView.SelectedObjects);
- foreach (LyricDetail item in RightLyricsObjectListView.SelectedObjects)
- {
- item.DurationMs = ms - item.TimeMs;
- }
- RightLyricsObjectListView.UpdateObjects(RightLyricsObjectListView.SelectedObjects);
- }
- protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
- {
- if (false == ActiveControl is TextBox && (keyData == Keys.Space || keyData == Keys.ProcessKey))
- {
- if (OggAudioPlayer.IsPlaying) OggAudioPlayer.Stop();
- else OggAudioPlayer.Play();
- return true;
- }
- return base.ProcessCmdKey(ref msg, keyData);
- }
- private void PlayButton_Click(object sender, EventArgs e)
- {
- if (OggAudioPlayer.IsPlaying) OggAudioPlayer.Stop();
- else OggAudioPlayer.Play();
- }
- private void UpdateTimer_Tick(object sender, EventArgs e)
- {
- var timeSpan = OggAudioPlayer.Position;
- PosLabel.Text = timeSpan.FormatToTotalMinuteAndSecondsAndMs();
- var milliseconds = (int)timeSpan.TotalMilliseconds;
- PlayPosTrackBar.Value = milliseconds > PlayPosTrackBar.Maximum
- ? PlayPosTrackBar.Maximum
- : milliseconds;
- if (_file == null)
- {
- CurrentLabel.Text = null;
- CurrentTranslatedLabel.Text = null;
- }
- else
- {
- CurrentLabel.Text = _file.Main?.FirstOrDefault(p => p.TimeMs <= milliseconds && p.TimeMs + p.DurationMs >= milliseconds)?.Text;
- CurrentTranslatedLabel.Text = _file.Subtitle?.FirstOrDefault(p => p.TimeMs <= milliseconds && p.TimeMs + p.DurationMs >= milliseconds)?.Text;
- }
- }
- private void PlayPosTrackBar_Scroll(object sender, EventArgs e)
- {
- OggAudioPlayer.Position = TimeSpan.FromMilliseconds(PlayPosTrackBar.Value);
- }
- private void PlayPosTrackBar_MouseDown(object sender, MouseEventArgs e)
- {
- if (OggAudioPlayer.IsPlaying) return;
- OggAudioPlayer.Play();
- PlayPosTrackBar.Tag = "Stop";
- }
- private void PlayPosTrackBar_MouseUp(object sender, MouseEventArgs e)
- {
- if (PlayPosTrackBar.Tag is string tag && tag == "Stop")
- {
- OggAudioPlayer.Stop();
- PlayPosTrackBar.Tag = null;
- }
- }
- private void LeftSelectAllButton_Click(object sender, EventArgs e) => LeftLyricsObjectListView.SelectAll();
- private void LeftDeleteButton_Click(object sender, EventArgs e)
- {
- foreach (LyricDetailExt item in LeftLyricsObjectListView.SelectedObjects)
- {
- _file.Main.Remove(item);
- }
- LeftLyricsObjectListView.SetObjects(_file.Main);
- }
- private void RemoveRubyButton_Click(object sender, EventArgs e)
- {
- foreach (LyricDetailExt item in LeftLyricsObjectListView.SelectedObjects)
- {
- item.Text = RegRemoveRuby1.Replace(item.Text, "");
- item.Text = RegRemoveRuby2.Replace(item.Text, "");
- item.Text = RegRemoveRuby3.Replace(item.Text, "");
- item.Text = RegRubyConvert.Replace(item.Text, match => match.Groups[2].Value);
- item.TextWithRuby = null;
- LeftLyricsObjectListView.UpdateObject(item);
- }
- }
- private void InsertRubyButton_Click(object sender, EventArgs e)
- {
- foreach (LyricDetailExt item in LeftLyricsObjectListView.SelectedObjects)
- {
- var arr = JapanesePhonetic.GetWords(item.Text);
- item.Text = string.Join("", arr.Select(p => p.ToString()));
- item.TextWithRuby = string.Join("", arr.Select(p => p.ToRubyTmpString()));
- LeftLyricsObjectListView.UpdateObject(item);
- }
- }
- private void LeftTextButton_Click(object sender, EventArgs e)
- {
- new TextDialog { TextRichTextBox = { Text = _file.MainText } }.ShowDialog(this);
- }
- private void SetBeginButton_Click(object sender, EventArgs e) => SetPos(PlayPosTrackBar.Value);
- private void MoveForwardButton_Click(object sender, EventArgs e) => MovePos((int)MoveMsUpDown.Value);
- private void MoveBackwardButton_Click(object sender, EventArgs e) => MovePos(-(int)MoveMsUpDown.Value);
- private void SetEndButton_Click(object sender, EventArgs e) => SetEnd(PlayPosTrackBar.Value);
- private void RightTextButton_Click(object sender, EventArgs e)
- {
- new TextDialog { TextRichTextBox = { Text = _file.SubtitleText } }.ShowDialog(this);
- }
- private void TrimButton_Click(object sender, EventArgs e)
- {
- if (_file.Subtitle == null) return;
- foreach (var detail in _file.Subtitle)
- {
- detail.Text = detail.Text
- .Trim()
- .Trim('【', '】')
- .Trim('(', ')')
- .Trim('(', ')');
- }
- RightLyricsObjectListView.UpdateObjects(_file.Subtitle);
- }
- private void ZhCnButton_Click(object sender, EventArgs e)
- {
- foreach (LyricDetailExt item in RightLyricsObjectListView.SelectedObjects)
- {
- item.Text = ChineseConverter.Convert(item.Text, ChineseConversionDirection.TraditionalToSimplified);
- }
- RightLyricsObjectListView.UpdateObjects(RightLyricsObjectListView.SelectedObjects);
- }
- private void RightSelectAllButton_Click(object sender, EventArgs e) => RightLyricsObjectListView.SelectAll();
- private void RightDeleteButton_Click(object sender, EventArgs e)
- {
- foreach (LyricDetailExt item in RightLyricsObjectListView.SelectedObjects)
- {
- _file.Subtitle.Remove(item);
- }
- RightLyricsObjectListView.SetObjects(_file.Subtitle);
- }
- private void LyricsObjectListView_DoubleClick(object sender, EventArgs e)
- {
- var olv = (ObjectListView)sender;
- if (olv.SelectedObject != null)
- OggAudioPlayer.Position = TimeSpan.FromMilliseconds(((LyricDetail)olv.SelectedObject).TimeMs);
- }
- private void LyricsObjectListView_KeyDown(object sender, KeyEventArgs e)
- {
- var olv = (ObjectListView)sender;
- if (e.KeyCode == Keys.F2 && olv.SelectedObject != null)
- {
- var item = (LyricDetailExt)olv.SelectedObject;
- if (ModifierKeys == Keys.Shift) //TODO: Double Line Input Box
- {
- ContextDialog.PopTextBox(MousePosition, item.TextWithRuby, (r, s) =>
- {
- if (r == DialogResult.OK)
- {
- item.TextWithRuby = s;
- }
- });
- }
- else
- {
- ContextDialog.PopTextBox(MousePosition, item.Text, (r, s) =>
- {
- if (r == DialogResult.OK)
- {
- item.Text = s;
- olv.UpdateObject(item);
- }
- });
- }
- }
- }
- }
- }
|