184 lines
5.8 KiB
C#
184 lines
5.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Windows.System;
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
using Windows.UI.Xaml.Controls.Primitives;
|
|
|
|
namespace DrumKit
|
|
{
|
|
static class UIManager
|
|
{
|
|
private static Dictionary<string, DrumUI> drums;
|
|
private static Dictionary<VirtualKey, string> keymap;
|
|
|
|
public static Canvas TheCanvas { get; private set; }
|
|
|
|
#region Initialization
|
|
/// <summary>
|
|
/// Initializes the ui manager
|
|
/// </summary>
|
|
public static void Initialize()
|
|
{
|
|
drums = new Dictionary<string, DrumUI>();
|
|
keymap = new Dictionary<VirtualKey, string>();
|
|
|
|
TheCanvas = new Canvas();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Loads the ui stuff for drumkit
|
|
/// </summary>
|
|
public static async Task ReloadDrumkit()
|
|
{
|
|
// Delete previous
|
|
drums.Clear();
|
|
keymap.Clear();
|
|
|
|
// Load drums
|
|
foreach (var i in DrumsManager.CurrentDrumkit.Drums)
|
|
{
|
|
DrumUI drumui = new DrumUI();
|
|
await drumui.InitializeDrum(i, DrumsManager.CurrentDrumkitLocation);
|
|
drumui.PointerPressed += HandlerDrumPointerPressed;
|
|
drumui.DragDelta += HandlerDrumMoved;
|
|
|
|
TheCanvas.Children.Add(drumui.Element);
|
|
drums.Add(i.Id, drumui);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the layout.
|
|
/// </summary>
|
|
public static void ReloadLayout()
|
|
{
|
|
DrumUI drum;
|
|
|
|
foreach (var i in DrumsManager.CurrentDrumkitLayout.Drums)
|
|
if (drums.TryGetValue(i.TargetId, out drum))
|
|
drum.UpdateLayout(i, TheCanvas.ActualWidth, TheCanvas.ActualHeight);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Updates the configuration.
|
|
/// </summary>
|
|
public static async Task ReloadConfig()
|
|
{
|
|
foreach (var i in DrumsManager.CurrentDrumkitConfig.Drums)
|
|
{
|
|
// Enabled and not loaded
|
|
if (i.IsEnabled && !drums.ContainsKey(i.TargetId))
|
|
{
|
|
Drum drum = DrumsManager.CurrentDrumkit.Drums.FirstOrDefault(x => x.Id == i.TargetId);
|
|
if (drum != null)
|
|
{
|
|
DrumUI drumui = new DrumUI();
|
|
await drumui.InitializeDrum(drum, DrumsManager.CurrentDrumkitLocation);
|
|
drumui.PointerPressed += HandlerDrumPointerPressed;
|
|
drumui.DragDelta += HandlerDrumMoved;
|
|
|
|
drums.Add(i.TargetId, drumui);
|
|
}
|
|
}
|
|
|
|
// Disabled and loaded
|
|
else if (!i.IsEnabled && drums.ContainsKey(i.TargetId))
|
|
{
|
|
TheCanvas.Children.Remove(drums[i.TargetId].Element);
|
|
drums.Remove(i.TargetId);
|
|
}
|
|
|
|
// Keyboard mapping
|
|
if (!keymap.ContainsKey(i.Key))
|
|
keymap.Add(i.Key, i.TargetId);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Event handlers
|
|
/// <summary>
|
|
/// Handles drum hit using mouse/touchpad
|
|
/// </summary>
|
|
private static void HandlerDrumPointerPressed(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
|
|
{
|
|
var button = sender as FrameworkElement;
|
|
var tag = button.Tag as string;
|
|
|
|
if (tag != null)
|
|
HandlerDrumClickedCommon(tag);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles drum hit using keyboard
|
|
/// </summary>
|
|
public static void HandlerKeyDown(Windows.UI.Core.CoreWindow sender, Windows.UI.Core.KeyEventArgs args)
|
|
{
|
|
string drum;
|
|
|
|
// Key repeat or something
|
|
if (args.KeyStatus.WasKeyDown)
|
|
return;
|
|
|
|
// If key in key map, perform "click"
|
|
if (keymap.TryGetValue(args.VirtualKey, out drum))
|
|
HandlerDrumClickedCommon(drum);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles drum hit.
|
|
/// </summary>
|
|
private static void HandlerDrumClickedCommon(string drum_id)
|
|
{
|
|
SoundManager.Play(drum_id, 0);
|
|
|
|
if (DataManager.Settings.Animations)
|
|
drums[drum_id].Hit();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Handles drum movement.
|
|
/// </summary>
|
|
private static void HandlerDrumMoved(object sender, Windows.UI.Xaml.Controls.Primitives.DragDeltaEventArgs e)
|
|
{
|
|
var thumb = sender as Thumb;
|
|
var tag = thumb.Tag as string;
|
|
int drum_index = -1;
|
|
|
|
if (tag != null)
|
|
drum_index = DrumsManager.CurrentDrumkitLayout.Drums.FindIndex(x => x.TargetId == tag);
|
|
|
|
if (drum_index >= 0)
|
|
{
|
|
double delta_x = e.HorizontalChange / TheCanvas.ActualWidth;
|
|
double delta_y = e.VerticalChange / TheCanvas.ActualHeight;
|
|
|
|
if (double.IsInfinity(delta_x) || double.IsInfinity(delta_y) || double.IsNaN(delta_x) || double.IsNaN(delta_y))
|
|
return;
|
|
|
|
DrumsManager.CurrentDrumkitLayout.Drums[drum_index].X += delta_x;
|
|
DrumsManager.CurrentDrumkitLayout.Drums[drum_index].Y += delta_y;
|
|
|
|
drums[tag].UpdateLayout(DrumsManager.CurrentDrumkitLayout.Drums[drum_index], TheCanvas.ActualWidth, TheCanvas.ActualHeight);
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
public static void EnterEdit()
|
|
{
|
|
foreach (var i in drums)
|
|
i.Value.EnableEdit();
|
|
}
|
|
|
|
public static void ExitEdit()
|
|
{
|
|
foreach (var i in drums)
|
|
i.Value.DisableEdit();
|
|
}
|
|
}
|
|
}
|