using System; using System.Collections.Generic; using System.IO; using System.Linq; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; // The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236 namespace DrumKit { public sealed partial class DrumsSettingsControl : UserControl { #region Initialization /// /// Creates a new instance of DrumsSettingsControl /// public DrumsSettingsControl() { this.InitializeComponent(); this.Loaded += DrumsSettingsControl_Loaded; } /// /// Loads drum list at startup /// void DrumsSettingsControl_Loaded(object sender, RoutedEventArgs e) { ReloadDrums(); } #endregion #region Reloads the list of drums /// /// Reloads the list of drums /// async void ReloadDrums() { // Clear previous stuff listDrums.Items.Clear(); // Add new stuff foreach (var i in DataController.CurrentDrumkit.Drums) this.listDrums.Items.Add(i.Value); // Wait for containers to be generated await System.Threading.Tasks.Task.Delay(50); // Update visual stuff DrumConfig config = null; foreach (var i in this.listDrums.Items) { // Get drum and configuration var drum = i as Drum; if (drum != null) DataController.CurrentConfig.Drums.TryGetValue(drum.Id, out config); // No drum, no configuration? if (drum == null || config == null) continue; // Set up other properties var container = listDrums.ItemContainerGenerator.ContainerFromItem(i) as FrameworkElement; ToggleButton enabled = UIHelper.FindChildByName(container, "toggleEnabled") as ToggleButton; if (enabled != null) enabled.IsChecked = config.IsEnabled; Slider volumeL = UIHelper.FindChildByName(container, "sliderVolumeL") as Slider; if (volumeL != null) volumeL.Value = config.VolumeL; Slider volumeR = UIHelper.FindChildByName(container, "sliderVolumeR") as Slider; if (volumeR != null) volumeR.Value = config.VolumeR; } ReloadKeys(); } void ReloadKeys() { DrumConfig config = null; foreach (var i in this.listDrums.Items) { // Get drum and configuration var drum = i as Drum; if (drum != null) DataController.CurrentConfig.Drums.TryGetValue(drum.Id, out config); // No drum, no configuration? if (drum == null || config == null) continue; // Set up key var container = listDrums.ItemContainerGenerator.ContainerFromItem(i) as FrameworkElement; TextBox key = UIHelper.FindChildByName(container, "textKey") as TextBox; if (key != null) { if (Enum.IsDefined(typeof(VirtualKey), config.Key)) { // Get name string text = Enum.GetName(typeof(VirtualKey), config.Key); // Prettify the name if (text.StartsWith("Number")) text = text.Substring("Number".Length); text = System.Text.RegularExpressions.Regex.Replace(text, "([a-z])([A-Z])", "${1} ${2}"); // Set the text key.Text = text; } else key.Text = string.Format("Unnamed ({0})", (int)config.Key); } } } #endregion #region UI Handlers: Items /// /// Handles "Landscape" toggle button. /// private void ToggleEnabled_Click(object sender, RoutedEventArgs e) { // Get drum object var button = sender as ToggleButton; var drum = (sender as FrameworkElement).DataContext as Drum; // Change enabled property if (drum != null && DataController.CurrentConfig.Drums.ContainsKey(drum.Id)) { DataController.CurrentConfig.Drums[drum.Id].IsEnabled = button.IsChecked.HasValue && button.IsChecked.Value; DataController.SaveConfig(); } } /// /// Handles the "key press" event in the textbox /// /// /// private void TextKey_KeyUp(object sender, KeyRoutedEventArgs e) { // Get drum object var text = sender as TextBox; var drum = (sender as FrameworkElement).DataContext as Drum; // Set key if (text != null && drum != null && DataController.CurrentConfig.Drums.ContainsKey(drum.Id)) { // Remove duplicates RemoveKeys(e.Key, drum.Id); // Set key DataController.CurrentConfig.Drums[drum.Id].Key = e.Key; // Display ReloadKeys(); // Save DataController.SaveConfig(); } } private void sliderVolumeL_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) { // Get drum object var slider = sender as Slider; var drum = (sender as FrameworkElement).DataContext as Drum; // Set value if (slider != null && drum != null && DataController.CurrentConfig.Drums.ContainsKey(drum.Id)) { DataController.CurrentConfig.Drums[drum.Id].VolumeL = e.NewValue; DataController.SaveConfig(); } } private void sliderVolumeR_ValueChanged(object sender, RangeBaseValueChangedEventArgs e) { // Get drum object var slider = sender as Slider; var drum = (sender as FrameworkElement).DataContext as Drum; // Set value if (slider != null && drum != null && DataController.CurrentConfig.Drums.ContainsKey(drum.Id)) { DataController.CurrentConfig.Drums[drum.Id].VolumeR = e.NewValue; DataController.SaveConfig(); } } #endregion #region Misc /// /// Sets the keyboart shortcut to None for all the drums that have this key. /// /// The keyboard shortcut private void RemoveKeys(VirtualKey key, string exception_id=null) { // See if any other drum has the same key foreach (var i in DataController.CurrentConfig.Drums) if (i.Value.Key == key && i.Key != exception_id) { // Set to none i.Value.Key = VirtualKey.None; // Get drum var drum = DataController.CurrentDrumkit.Drums[i.Key]; // Get key text box var container = listDrums.ItemContainerGenerator.ContainerFromItem(drum) as FrameworkElement; TextBox keytxt = UIHelper.FindChildByName(container, "textKey") as TextBox; keytxt.Text = Enum.GetName(typeof(VirtualKey), i.Value.Key); } } #endregion } }