/Application/GUI/Windows/Equalizer.xaml.cs

http://yet-another-music-application.googlecode.com/ · C# · 385 lines · 242 code · 41 blank · 102 comment · 29 complexity · 949e58e760eaa9713dad6c4204b15b07 MD5 · raw file

  1. /**
  2. * Equalizer.xaml.cs
  3. *
  4. * The equalizer window.
  5. *
  6. * * * * * * * * *
  7. *
  8. * This code is part of the Stoffi Music Player Project.
  9. * Visit our website at: stoffiplayer.com
  10. *
  11. * This program is free software; you can redistribute it and/or
  12. * modify it under the terms of the GNU General Public License
  13. * as published by the Free Software Foundation; either version
  14. * 3 of the License, or (at your option) any later version.
  15. *
  16. * See stoffiplayer.com/license for more information.
  17. **/
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Linq;
  21. using System.Text;
  22. using System.Text.RegularExpressions;
  23. using System.Windows;
  24. using System.Windows.Controls;
  25. using System.Windows.Data;
  26. using System.Windows.Documents;
  27. using System.Windows.Input;
  28. using System.Windows.Media;
  29. using System.Windows.Media.Imaging;
  30. using System.Windows.Shapes;
  31. namespace Stoffi
  32. {
  33. /// <summary>
  34. /// Interaction logic for Equalizer.xaml
  35. /// </summary>
  36. public partial class Equalizer : Window
  37. {
  38. #region Constructor
  39. /// <summary>
  40. /// Creates an instance of the Equalizer window
  41. /// </summary>
  42. public Equalizer()
  43. {
  44. U.L(LogLevel.Debug, "EQUALIZER", "Initialize");
  45. InitializeComponent();
  46. U.L(LogLevel.Debug, "EQUALIZER", "Initialized");
  47. SettingsManager.PropertyChanged += new PropertyChangedWithValuesEventHandler(SettingsManager_PropertyChanged);
  48. foreach (EqualizerProfile profile in SettingsManager.EqualizerProfiles)
  49. Profiles.Items.Add(profile.IsProtected ? U.T("EqualizerProfile" + profile.Name) : profile.Name);
  50. Refresh();
  51. if (System.Windows.Forms.VisualStyles.VisualStyleInformation.DisplayName != "")
  52. Background = Brushes.WhiteSmoke;
  53. U.L(LogLevel.Debug, "EQUALIZER", "Created");
  54. }
  55. #endregion
  56. #region Methods
  57. #region Private
  58. /// <summary>
  59. /// Loads all values from the current profile
  60. /// </summary>
  61. private void Refresh()
  62. {
  63. F125.Value = SettingsManager.CurrentEqualizerProfile.Levels[0] * 10f;
  64. F250.Value = SettingsManager.CurrentEqualizerProfile.Levels[1] * 10f;
  65. F500.Value = SettingsManager.CurrentEqualizerProfile.Levels[2] * 10f;
  66. F1K.Value = SettingsManager.CurrentEqualizerProfile.Levels[3] * 10f;
  67. F2K.Value = SettingsManager.CurrentEqualizerProfile.Levels[4] * 10f;
  68. F4K.Value = SettingsManager.CurrentEqualizerProfile.Levels[5] * 10f;
  69. F8K.Value = SettingsManager.CurrentEqualizerProfile.Levels[6] * 10f;
  70. F16K.Value = SettingsManager.CurrentEqualizerProfile.Levels[7] * 10f;
  71. Echo.Value = SettingsManager.CurrentEqualizerProfile.EchoLevel;
  72. Profiles.SelectedItem = SettingsManager.CurrentEqualizerProfile.IsProtected ?
  73. U.T("EqualizerProfile" + SettingsManager.CurrentEqualizerProfile.Name) :
  74. SettingsManager.CurrentEqualizerProfile.Name;
  75. RefreshButtons();
  76. }
  77. /// <summary>
  78. /// Checks if any values has been changed.
  79. /// </summary>
  80. /// <param name="profile">The profile to compare to</param>
  81. /// <returns>True if any values has been changed, otherwise false</returns>
  82. private bool AnyChanged(EqualizerProfile profile = null)
  83. {
  84. if (profile == null)
  85. profile = SettingsManager.CurrentEqualizerProfile;
  86. float[] levels = new float[]
  87. {
  88. (float)F125.Value / 10f,
  89. (float)F250.Value / 10f,
  90. (float)F500.Value / 10f,
  91. (float)F1K.Value / 10f,
  92. (float)F2K.Value / 10f,
  93. (float)F4K.Value / 10f,
  94. (float)F8K.Value / 10f,
  95. (float)F16K.Value / 10f,
  96. };
  97. for (int i = 0; i < levels.Count(); i++)
  98. {
  99. float a = profile.Levels[i];
  100. float b = levels[i];
  101. if (Math.Round(a, 2) != Math.Round(b, 2)) return true;
  102. }
  103. return (Math.Round(profile.EchoLevel, 2) != Math.Round(Echo.Value, 2));
  104. }
  105. /// <summary>
  106. /// Refreshes the buttons depending on whether anything has changed or not
  107. /// </summary>
  108. private void RefreshButtons()
  109. {
  110. bool changed = AnyChanged();
  111. bool protect = SettingsManager.CurrentEqualizerProfile.IsProtected;
  112. OK.Visibility = changed ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  113. Apply.Visibility = changed ? System.Windows.Visibility.Visible : System.Windows.Visibility.Collapsed;
  114. Cancel.Content = changed ? U.T("ButtonCancel", "Content") : U.T("ButtonClose", "Content");
  115. Remove.Visibility = protect ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
  116. Rename.Visibility = protect ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
  117. }
  118. /// <summary>
  119. /// Save the settings
  120. /// </summary>
  121. private void Save()
  122. {
  123. EqualizerProfile profile = SettingsManager.CurrentEqualizerProfile;
  124. float[] levels = new float[]
  125. {
  126. (float)F125.Value / 10f,
  127. (float)F250.Value / 10f,
  128. (float)F500.Value / 10f,
  129. (float)F1K.Value / 10f,
  130. (float)F2K.Value / 10f,
  131. (float)F4K.Value / 10f,
  132. (float)F8K.Value / 10f,
  133. (float)F16K.Value / 10f,
  134. };
  135. float echo = (float)Echo.Value;
  136. // create new profile
  137. if (profile.IsProtected)
  138. {
  139. List<string> occupied = new List<string>();
  140. foreach (EqualizerProfile p in SettingsManager.EqualizerProfiles)
  141. {
  142. occupied.Add(p.Name);
  143. if (p.IsProtected)
  144. occupied.Add(U.T("EqualizerProfile" + p.Name));
  145. }
  146. NameDialog dialog = new NameDialog(occupied);
  147. dialog.ShowDialog();
  148. if (dialog.DialogResult == true)
  149. {
  150. profile = SettingsManager.CreateEqualizerLevel(U.CleanXMLString(dialog.ProfileName.Text), levels, echo);
  151. SettingsManager.EqualizerProfiles.Add(profile);
  152. Profiles.Items.Add(profile.Name);
  153. SettingsManager.CurrentEqualizerProfile = profile;
  154. }
  155. }
  156. // update profile
  157. else
  158. {
  159. profile.Levels = levels;
  160. profile.EchoLevel = echo;
  161. }
  162. Refresh();
  163. }
  164. /// <summary>
  165. /// Asks the user if she wants to save the current values
  166. /// </summary>
  167. private void AskToSave()
  168. {
  169. if (AnyChanged(SettingsManager.CurrentEqualizerProfile))
  170. {
  171. if (MessageBox.Show(
  172. U.T("MessageSaveProfile", "Title"),
  173. U.T("MessageSaveProfile", "Message"),
  174. MessageBoxButton.YesNo,
  175. MessageBoxImage.Question) == MessageBoxResult.Yes)
  176. Save();
  177. }
  178. }
  179. #endregion
  180. #region Event handlers
  181. /// <summary>
  182. /// Invoked when the value of a slider changes
  183. /// </summary>
  184. /// <param name="sender">The sender of the event</param>
  185. /// <param name="e">The event data</param>
  186. private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  187. {
  188. RefreshButtons();
  189. }
  190. /// <summary>
  191. /// Invoked when the user changes the echo level
  192. /// </summary>
  193. /// <param name="sender">The sender of the event</param>
  194. /// <param name="e">The event data</param>
  195. private void Echo_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  196. {
  197. RefreshButtons();
  198. }
  199. /// <summary>
  200. /// Invoked when the user resizes the window
  201. /// </summary>
  202. /// <param name="sender">The sender of the event</param>
  203. /// <param name="e">The event data</param>
  204. private void EqualizerDialog_SizeChanged(object sender, SizeChangedEventArgs e)
  205. {
  206. SettingsManager.EqualizerWidth = Width;
  207. SettingsManager.EqualizerHeight = Height;
  208. }
  209. /// <summary>
  210. /// Invoked when the user moves the window
  211. /// </summary>
  212. /// <param name="sender">The sender of the event</param>
  213. /// <param name="e">The event data</param>
  214. private void EqualizerDialog_LocationChanged(object sender, EventArgs e)
  215. {
  216. SettingsManager.EqualizerTop = Top;
  217. SettingsManager.EqualizerLeft = Left;
  218. }
  219. /// <summary>
  220. /// Invoked when the user changes profile
  221. /// </summary>
  222. /// <param name="sender">The sender of the event</param>
  223. /// <param name="e">The event data</param>
  224. private void Profiles_SelectionChanged(object sender, SelectionChangedEventArgs e)
  225. {
  226. EqualizerProfile profile = SettingsManager.GetEqualizerProfile(Profiles.SelectedItem as string);
  227. AskToSave();
  228. SettingsManager.CurrentEqualizerProfile = profile;
  229. }
  230. /// <summary>
  231. /// Invoked when the user clicks "Apply"
  232. /// </summary>
  233. /// <param name="sender">The sender of the event</param>
  234. /// <param name="e">The event data</param>
  235. private void Apply_Click(object sender, RoutedEventArgs e)
  236. {
  237. Save();
  238. }
  239. /// <summary>
  240. /// Invoked when the user clicks "Cancel" or "Close"
  241. /// </summary>
  242. /// <param name="sender">The sender of the event</param>
  243. /// <param name="e">The event data</param>
  244. private void Cancel_Click(object sender, RoutedEventArgs e)
  245. {
  246. Close();
  247. }
  248. /// <summary>
  249. /// Invoked when the user clicks "OK"
  250. /// </summary>
  251. /// <param name="sender">The sender of the event</param>
  252. /// <param name="e">The event data</param>
  253. private void OK_Click(object sender, RoutedEventArgs e)
  254. {
  255. Save();
  256. Close();
  257. }
  258. /// <summary>
  259. /// Invoked when the user clicks "New"
  260. /// </summary>
  261. /// <param name="sender">The sender of the event</param>
  262. /// <param name="e">The event data</param>
  263. private void New_Click(object sender, RoutedEventArgs e)
  264. {
  265. List<string> occupied = new List<string>();
  266. foreach (EqualizerProfile p in SettingsManager.EqualizerProfiles)
  267. {
  268. occupied.Add(p.Name);
  269. if (p.IsProtected)
  270. occupied.Add(U.T("EqualizerProfile" + p.Name));
  271. }
  272. NameDialog dialog = new NameDialog(occupied);
  273. dialog.ShowDialog();
  274. if (dialog.DialogResult == true)
  275. {
  276. EqualizerProfile profile = SettingsManager.CreateEqualizerLevel(U.CleanXMLString(dialog.ProfileName.Text), new float[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0);
  277. SettingsManager.EqualizerProfiles.Add(profile);
  278. Profiles.Items.Add(profile.Name);
  279. AskToSave();
  280. SettingsManager.CurrentEqualizerProfile = profile;
  281. }
  282. }
  283. /// <summary>
  284. /// Invoked when the user clicks "Remove"
  285. /// </summary>
  286. /// <param name="sender">The sender of the event</param>
  287. /// <param name="e">The event data</param>
  288. private void Remove_Click(object sender, RoutedEventArgs e)
  289. {
  290. EqualizerProfile profile = SettingsManager.CurrentEqualizerProfile;
  291. string itemToRemove = Profiles.SelectedItem as string;
  292. int index = Profiles.Items.IndexOf(itemToRemove) - 1;
  293. if (index < 0) index = 0;
  294. SettingsManager.EqualizerProfiles.Remove(profile);
  295. Profiles.SelectedIndex = index;
  296. Profiles.Items.Remove(itemToRemove);
  297. }
  298. /// <summary>
  299. /// Invoked when the user clicks "Rename"
  300. /// </summary>
  301. /// <param name="sender">The sender of the event</param>
  302. /// <param name="e">The event data</param>
  303. private void Rename_Click(object sender, RoutedEventArgs e)
  304. {
  305. List<string> occupied = new List<string>();
  306. foreach (EqualizerProfile p in SettingsManager.EqualizerProfiles)
  307. {
  308. occupied.Add(p.Name);
  309. if (p.IsProtected)
  310. occupied.Add(U.T("EqualizerProfile" + p.Name));
  311. }
  312. EqualizerProfile profile = SettingsManager.CurrentEqualizerProfile;
  313. NameDialog dialog = new NameDialog(occupied, profile.Name);
  314. dialog.ShowDialog();
  315. if (dialog.DialogResult == true)
  316. {
  317. string oldName = profile.Name;
  318. string newName = U.CleanXMLString(dialog.ProfileName.Text);
  319. for (int i = 0; i < Profiles.Items.Count; i++)
  320. if (Profiles.Items[i] as string == oldName)
  321. Profiles.Items[i] = newName;
  322. foreach (EqualizerProfile p in SettingsManager.EqualizerProfiles)
  323. if (p.Name == oldName)
  324. p.Name = newName;
  325. profile.Name = newName;
  326. SettingsManager.CurrentEqualizerProfile = profile;
  327. }
  328. }
  329. /// <summary>
  330. /// Invoked when a property of SettingsManager changes.
  331. /// </summary>
  332. /// <param name="sender">The sender of the event</param>
  333. /// <param name="e">The event data</param>
  334. private void SettingsManager_PropertyChanged(object sender, PropertyChangedWithValuesEventArgs e)
  335. {
  336. if (e.PropertyName == "CurrentEqualizerProfile")
  337. {
  338. Refresh();
  339. }
  340. }
  341. #endregion
  342. #endregion
  343. }
  344. }