MainForm.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. _refreshTask = Task.Factory.StartNew(() =>
  28. {
  29. RunOnUiThread(() =>
  30. {
  31. MainProgressBar.Visible = true;
  32. MainImageList.Images.Clear();
  33. MainObjectListView.Items.Clear();
  34. });
  35. var levels = LocalCustomLevelProvider.GetAlLevelInfos((l, i) => RunOnUiThread(() =>
  36. {
  37. MainProgressBar.Maximum = l;
  38. MainProgressBar.Value = i;
  39. }));
  40. RunOnUiThread(() => MainProgressBar.Value = 0);
  41. Parallel.ForEach(levels, (p, s, i) =>
  42. {
  43. try
  44. {
  45. if (false == p.IsValid)
  46. {
  47. p.SongName = "[Error]";
  48. p.Description = p.Error;
  49. return;
  50. }
  51. p.CoverImage = Image.FromFile(p.CoverPath);
  52. RunOnUiThread(() => MainImageList.Images.Add(p.CoverPath, p.CoverImage));
  53. }
  54. catch (Exception e)
  55. {
  56. Debug.Print(e.ToString());
  57. }
  58. finally
  59. {
  60. RunOnUiThread(() => MainProgressBar.Value++);
  61. }
  62. });
  63. RunOnUiThread(() =>
  64. {
  65. MainProgressBar.Visible = false;
  66. _allLevelInfos = levels;
  67. Search();
  68. });
  69. _refreshTask = null;
  70. });
  71. }
  72. private void ClearDetails()
  73. {
  74. HashTextBox.Text = null;
  75. CoverPictureBox.BackgroundImage = null;
  76. DirTextBox.Text = null;
  77. SongNameTextBox.Text = null;
  78. SubNameTextBox.Text = null;
  79. SongAuthorTextBox.Text = null;
  80. LevelAuthorTextBox.Text = null;
  81. LocalLyricObjectListView.ClearObjects();
  82. }
  83. private void BindDetails(LevelInfo item)
  84. {
  85. ClearDetails();
  86. VerifyCheckBox.Checked = File.Exists(DirProvider.GetVerifyFile(item.Hash));
  87. CoverPictureBox.BackgroundImage = item.CoverImage;
  88. DirTextBox.Text = item.Directory;
  89. SongNameTextBox.Text = item.SongName;
  90. SubNameTextBox.Text = item.SongSubName;
  91. SongAuthorTextBox.Text = item.SongAuthor;
  92. LevelAuthorTextBox.Text = item.LevelAuthor;
  93. HashTextBox.Text = item.Hash;
  94. if (false == item.IsValid) SubNameTextBox.Text = item.Error;
  95. LocalLyricObjectListView.SetObjects(item.LocalLyrics);
  96. }
  97. private void Search()
  98. {
  99. if (_allLevelInfos == null) return;
  100. var pattern = SearchTextBox.Text.ToLower();
  101. var items = _allLevelInfos;
  102. if (false == string.IsNullOrWhiteSpace(pattern))
  103. {
  104. items = items.Where(p =>
  105. true == p.SongName?.ToLower().Contains(pattern) ||
  106. true == p.SongSubName?.ToLower().Contains(pattern) ||
  107. true == p.SongAuthor?.ToLower().Contains(pattern) ||
  108. true == p.LevelAuthor?.ToLower().Contains(pattern) ||
  109. true == p.Description?.ToLower().Contains(pattern) ||
  110. true == p.Hash?.ToLower().Contains(pattern) ||
  111. true == p.Directory?.ToLower().Contains(pattern)).ToArray();
  112. }
  113. if (false == AllRadioButton.Checked)
  114. {
  115. items = items
  116. .Where(p => SetOnlyRadioButton.Checked == (true == p.LocalLyrics?.Any(q => q.IsDefault)))
  117. .ToArray();
  118. }
  119. items = items.Where(p => p.IsVerify == SearchVerifyCheckBox.Checked).ToArray();
  120. MainObjectListView.SetObjects(items);
  121. if (MainObjectListView.Items.Count == 1) MainObjectListView.SelectedIndex = 0;
  122. }
  123. private void MainForm_Shown(object sender, EventArgs e)
  124. {
  125. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.SongName), nameof(LevelInfo.SongName))
  126. {
  127. Width = 128,
  128. ImageAspectName = nameof(LevelInfo.CoverPath),
  129. });
  130. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.SongAuthor), nameof(LevelInfo.SongAuthor)) { Width = 128, IsTileViewColumn = true });
  131. MainObjectListView.AllColumns.Add(new OLVColumn(nameof(LevelInfo.LevelAuthor), nameof(LevelInfo.LevelAuthor)) { Width = 128, IsTileViewColumn = true });
  132. MainObjectListView.RebuildColumns();
  133. RefreshList();
  134. SearchTextBox.Focus();
  135. }
  136. private void MainForm_KeyDown(object sender, KeyEventArgs e)
  137. {
  138. if (e.KeyCode == Keys.F5) RefreshList();
  139. }
  140. private void SearchTextBox_TextChanged(object sender, EventArgs e) => Search();
  141. private void SearchVerifyCheckBox_CheckedChanged(object sender, EventArgs e) => Search();
  142. private void AllRadioButton_CheckedChanged(object sender, EventArgs e)
  143. {
  144. if (((RadioButton)sender).Checked) Search();
  145. }
  146. private void MainObjectListView_SelectedIndexChanged(object sender, EventArgs e)
  147. {
  148. var selectedObject = MainObjectListView.SelectedObject;
  149. if (null == selectedObject)
  150. {
  151. ClearDetails();
  152. }
  153. else
  154. {
  155. BindDetails((LevelInfo)selectedObject);
  156. }
  157. }
  158. private void DirExploreHereLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) => Process.Start("explorer.exe", DirTextBox.Text);
  159. private void HashExploreHereLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) => Process.Start("explorer.exe", DirProvider.GetLyricDir(HashTextBox.Text));
  160. private void OnlineButton_Click(object sender, EventArgs e)
  161. {
  162. var selectedObject = MainObjectListView.SelectedObject;
  163. if (null == selectedObject) return;
  164. var nfo = (LevelInfo)selectedObject;
  165. new OnlineLyricsForm(nfo).ShowDialog(this);
  166. nfo.ReloadLocalLyricInfo();
  167. BindDetails(nfo);
  168. }
  169. private void LocalLyricObjectListView_DoubleClick(object sender, EventArgs e) => ShowEditForm();
  170. private void EditButton_Click(object sender, EventArgs e) => ShowEditForm();
  171. private void ShowEditForm()
  172. {
  173. var selectedObject = LocalLyricObjectListView.SelectedObject;
  174. if (selectedObject == null) return;
  175. var ctx = new ContextMenuStrip();
  176. ctx.Items.Add("Text Mode").Click += delegate
  177. {
  178. var lli = (LocalLyricInfo)selectedObject;
  179. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  180. new TextEditForm(nfo, lli.FileName).ShowDialog(this);
  181. };
  182. ctx.Items.Add("Timeline Mode").Click += delegate
  183. {
  184. var lli = (LocalLyricInfo)selectedObject;
  185. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  186. new TimelineEditForm(nfo, lli.FileName).ShowDialog(this);
  187. };
  188. ctx.Show(MousePosition);
  189. }
  190. private void SetButton_Click(object sender, EventArgs e)
  191. {
  192. var selectedObject = LocalLyricObjectListView.SelectedObject;
  193. if (selectedObject == null) return;
  194. var lli = (LocalLyricInfo)selectedObject;
  195. var nfo = (LevelInfo)MainObjectListView.SelectedObject;
  196. var defaultFilePath = DirProvider.GetDefaultFile(nfo.Hash);
  197. File.WriteAllText(defaultFilePath, lli.FileName);
  198. nfo.ReloadLocalLyricInfo();
  199. BindDetails(nfo);
  200. }
  201. private void VerifyCheckBox_CheckedChanged(object sender, EventArgs e)
  202. {
  203. if (string.IsNullOrWhiteSpace(HashTextBox.Text)) return;
  204. var verifyFilePath = DirProvider.GetVerifyFile(HashTextBox.Text);
  205. if (VerifyCheckBox.Checked && !File.Exists(verifyFilePath))
  206. {
  207. using var _ = File.Create(verifyFilePath);
  208. }
  209. else if (File.Exists(verifyFilePath))
  210. {
  211. File.Delete(verifyFilePath);
  212. }
  213. }
  214. }
  215. }