MainForm.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. using BeatLyrics.Common;
  2. using BeatLyrics.Tool.DataProvider.BeatMaps;
  3. using BeatLyrics.Tool.Dialogs;
  4. using BeatLyrics.Tool.Models;
  5. using BeatLyrics.Tool.Utils;
  6. using BrightIdeasSoftware;
  7. using System;
  8. using System.Diagnostics;
  9. using System.Drawing;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Threading.Tasks;
  13. using System.Windows.Forms;
  14. namespace BeatLyrics.Tool
  15. {
  16. public partial class MainForm : BaseForm
  17. {
  18. private Task _refreshTask;
  19. private LevelInfo[] _allLevelInfos;
  20. public MainForm()
  21. {
  22. InitializeComponent();
  23. }
  24. private void RefreshList()
  25. {
  26. if (_refreshTask != null) return;
  27. MainObjectListView.Items.Clear();
  28. MainImageList.Images.Clear();
  29. if (null != _allLevelInfos)
  30. foreach (var item in _allLevelInfos) item.CoverImage.Dispose();
  31. _refreshTask = Task.Factory.StartNew(() =>
  32. {
  33. RunOnUiThread(() =>
  34. {
  35. MainProgressBar.Visible = true;
  36. MainImageList.Images.Clear();
  37. MainObjectListView.Items.Clear();
  38. });
  39. var levels = LocalCustomLevelProvider.GetAlLevelInfos((l, i) => RunOnUiThread(() =>
  40. {
  41. MainProgressBar.Maximum = l;
  42. MainProgressBar.Value = i;
  43. })).OrderBy(p => p.SongName).ToArray();
  44. RunOnUiThread(() => MainProgressBar.Value = 0);
  45. Parallel.ForEach(levels, (p, s, i) =>
  46. {
  47. try
  48. {
  49. if (false == p.IsValid)
  50. {
  51. p.SongName = "[Error]";
  52. p.Description = p.Error;
  53. return;
  54. }
  55. p.CoverImage = Image.FromFile(p.CoverPath);
  56. RunOnUiThread(() => MainImageList.Images.Add(p.CoverPath, p.CoverImage));
  57. }
  58. catch (Exception e)
  59. {
  60. Debug.Print(e.ToString());
  61. }
  62. finally
  63. {
  64. RunOnUiThread(() => MainProgressBar.Value++);
  65. }
  66. });
  67. _allLevelInfos = levels;
  68. RunOnUiThread(() =>
  69. {
  70. MainProgressBar.Visible = false;
  71. Search();
  72. });
  73. _refreshTask = null;
  74. });
  75. }
  76. private void ClearDetails()
  77. {
  78. HashTextBox.Text = null;
  79. CoverPictureBox.BackgroundImage = null;
  80. DirTextBox.Text = null;
  81. DirTimeLabel.Text = null;
  82. SongNameTextBox.Text = null;
  83. SubNameTextBox.Text = null;
  84. SongAuthorTextBox.Text = null;
  85. LevelAuthorTextBox.Text = null;
  86. LocalLyricObjectListView.ClearObjects();
  87. }
  88. private void BindDetails(LevelInfo item)
  89. {
  90. ClearDetails();
  91. VerifyCheckBox.Checked = File.Exists(DirProvider.GetVerifyFile(item.Hash));
  92. CoverPictureBox.BackgroundImage = item.CoverImage;
  93. DirTextBox.Text = item.Directory;
  94. DirTimeLabel.Text = item.DirectoryTimeText;
  95. SongNameTextBox.Text = item.SongName;
  96. SubNameTextBox.Text = item.SongSubName;
  97. SongAuthorTextBox.Text = item.SongAuthor;
  98. LevelAuthorTextBox.Text = item.LevelAuthor;
  99. HashTextBox.Text = item.Hash;
  100. if (false == item.IsValid) SubNameTextBox.Text = item.Error;
  101. LocalLyricObjectListView.SetObjects(item.LocalLyrics);
  102. }
  103. private void Search()
  104. {
  105. if (_allLevelInfos == null) return;
  106. var pattern = SearchTextBox.Text.ToLower();
  107. var items = _allLevelInfos;
  108. if (false == string.IsNullOrWhiteSpace(pattern))
  109. {
  110. items = items.Where(p =>
  111. true == p.SongName?.ToLower().Contains(pattern) ||
  112. true == p.SongSubName?.ToLower().Contains(pattern) ||
  113. true == p.SongAuthor?.ToLower().Contains(pattern) ||
  114. true == p.LevelAuthor?.ToLower().Contains(pattern) ||
  115. true == p.Description?.ToLower().Contains(pattern) ||
  116. true == p.Hash?.ToLower().Contains(pattern) ||
  117. true == p.Directory?.ToLower().Contains(pattern)).ToArray();
  118. }
  119. if (false == AllRadioButton.Checked)
  120. {
  121. items = items
  122. .Where(p => SetOnlyRadioButton.Checked == (true == p.LocalLyrics?.Any(q => q.IsDefault)))
  123. .ToArray();
  124. }
  125. if (false == All2RadioButton.Checked)
  126. {
  127. items = items
  128. .Where(p => p.IsVerify == VerifyRadioButton.Checked)
  129. .ToArray();
  130. }
  131. MainObjectListView.SetObjects(items);
  132. if (MainObjectListView.Items.Count == 1) MainObjectListView.SelectedIndex = 0;
  133. }
  134. private void MainForm_Shown(object sender, EventArgs e)
  135. {
  136. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.SongName), nameof(LevelInfo.SongName))
  137. {
  138. Width = 128,
  139. ImageAspectName = nameof(LevelInfo.CoverPath),
  140. });
  141. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.SongAuthor), nameof(LevelInfo.SongAuthor)) { Width = 128, IsTileViewColumn = true });
  142. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.LevelAuthor), nameof(LevelInfo.LevelAuthor)) { Width = 128, IsTileViewColumn = true });
  143. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.DirectoryTime), nameof(LevelInfo.DirectoryTimeText)) { Width = 128, IsTileViewColumn = true });
  144. MainObjectListView.RebuildColumns();
  145. RefreshList();
  146. SearchTextBox.Focus();
  147. }
  148. private void MainForm_KeyDown(object sender, KeyEventArgs e)
  149. {
  150. if (e.KeyCode == Keys.F5) RefreshList();
  151. }
  152. private void SearchTextBox_TextChanged(object sender, EventArgs e) => Search();
  153. private void AllRadioButton_CheckedChanged(object sender, EventArgs e)
  154. {
  155. if (((RadioButton)sender).Checked) Search();
  156. }
  157. private void MainObjectListView_SelectedIndexChanged(object sender, EventArgs e)
  158. {
  159. var selectedObject = MainObjectListView.SelectedObject;
  160. if (null == selectedObject)
  161. {
  162. ClearDetails();
  163. }
  164. else
  165. {
  166. BindDetails((LevelInfo)selectedObject);
  167. }
  168. }
  169. private void DirExploreHereLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) => Process.Start("explorer.exe", DirTextBox.Text);
  170. private void HashExploreHereLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) => Process.Start("explorer.exe", DirProvider.GetLyricDir(HashTextBox.Text));
  171. private void OnlineButton_Click(object sender, EventArgs e)
  172. {
  173. var selectedObject = MainObjectListView.SelectedObject;
  174. if (null == selectedObject) return;
  175. var nfo = (LevelInfo)selectedObject;
  176. new OnlineLyricsForm(nfo).ShowDialog(this);
  177. nfo.ReloadLocalLyricInfo();
  178. BindDetails(nfo);
  179. }
  180. private void LocalLyricObjectListView_DoubleClick(object sender, EventArgs e) => ShowEditForm();
  181. private void EditButton_Click(object sender, EventArgs e) => ShowEditForm();
  182. private void ShowEditForm()
  183. {
  184. var selectedObject = LocalLyricObjectListView.SelectedObject;
  185. if (selectedObject == null) return;
  186. var ctx = new ContextMenuStrip();
  187. ctx.Items.Add("Text Mode").Click += delegate
  188. {
  189. var lli = (LocalLyricInfo)selectedObject;
  190. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  191. new TextEditForm(nfo, lli.FileName).ShowDialog(this);
  192. };
  193. ctx.Items.Add("Timeline Mode").Click += delegate
  194. {
  195. var lli = (LocalLyricInfo)selectedObject;
  196. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  197. new TimelineEditForm(nfo, lli.FileName).ShowDialog(this);
  198. };
  199. ctx.Show(MousePosition);
  200. }
  201. private void NewButton_Click(object sender, EventArgs e)
  202. {
  203. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  204. ContextDialog.ShowInput(MousePosition, "Create New Lyric", nfo.SongName + ".json", (dr, input) =>
  205. {
  206. if (dr == DialogResult.OK) new TimelineEditForm(nfo, input).ShowDialog(this);
  207. });
  208. }
  209. private void SetButton_Click(object sender, EventArgs e)
  210. {
  211. var selectedObject = LocalLyricObjectListView.SelectedObject;
  212. if (selectedObject == null) return;
  213. var lli = (LocalLyricInfo)selectedObject;
  214. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  215. var defaultFilePath = DirProvider.GetDefaultFile(nfo.Hash);
  216. File.WriteAllText(defaultFilePath, lli.FileName);
  217. nfo.ReloadLocalLyricInfo();
  218. BindDetails(nfo);
  219. }
  220. private void VerifyCheckBox_CheckedChanged(object sender, EventArgs e)
  221. {
  222. if (string.IsNullOrWhiteSpace(HashTextBox.Text)) return;
  223. var verifyFilePath = DirProvider.GetVerifyFile(HashTextBox.Text);
  224. if (VerifyCheckBox.Checked && !File.Exists(verifyFilePath))
  225. {
  226. using var _ = File.Create(verifyFilePath);
  227. }
  228. else if (File.Exists(verifyFilePath))
  229. {
  230. File.Delete(verifyFilePath);
  231. }
  232. }
  233. }
  234. }