129 lines
3.5 KiB
C#
129 lines
3.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Windows.Forms;
|
|
using MassiveKnob.Hardware;
|
|
|
|
namespace MassiveKnob.UserControls
|
|
{
|
|
public partial class KnobDeviceControl : UserControl
|
|
{
|
|
private int knobIndex;
|
|
private Guid? deviceId;
|
|
|
|
public event KnobDeviceChangedEventHandler OnDeviceChanged;
|
|
|
|
|
|
public KnobDeviceControl()
|
|
{
|
|
InitializeComponent();
|
|
|
|
DeviceCombobox.DisplayMember = @"DisplayName";
|
|
}
|
|
|
|
|
|
public void SetKnobIndex(int index)
|
|
{
|
|
knobIndex = index;
|
|
KnobIndexLabel.Text = string.Format(Strings.KnobIndex, index + 1);
|
|
}
|
|
|
|
|
|
public void SetDeviceId(Guid? value)
|
|
{
|
|
deviceId = value;
|
|
|
|
if (DeviceCombobox.Items.Count > 0)
|
|
DeviceCombobox.SelectedItem = value.HasValue ? new DeviceItem(value.Value) : null;
|
|
}
|
|
|
|
|
|
public void SetDevices(IEnumerable<IAudioDevice> devices)
|
|
{
|
|
DeviceCombobox.BeginUpdate();
|
|
try
|
|
{
|
|
DeviceCombobox.Items.Clear();
|
|
|
|
if (devices == null)
|
|
return;
|
|
|
|
var sortedDevices = devices.OrderBy(d => d.DisplayName);
|
|
|
|
foreach (var device in sortedDevices)
|
|
{
|
|
var itemIndex = DeviceCombobox.Items.Add(
|
|
new DeviceItem(device.Id)
|
|
{
|
|
DisplayName = device.DisplayName
|
|
});
|
|
|
|
if (deviceId.HasValue && deviceId.Value == device.Id)
|
|
DeviceCombobox.SelectedIndex = itemIndex;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
DeviceCombobox.EndUpdate();
|
|
}
|
|
}
|
|
|
|
|
|
private void DeviceCombobox_SelectedIndexChanged(object sender, EventArgs e)
|
|
{
|
|
OnDeviceChanged?.Invoke(this, new KnobDeviceChangedEventArgs
|
|
{
|
|
KnobIndex = knobIndex,
|
|
DeviceId = ((DeviceItem)DeviceCombobox.SelectedItem)?.DeviceId
|
|
});
|
|
}
|
|
|
|
|
|
private class DeviceItem : IEquatable<DeviceItem>
|
|
{
|
|
// ReSharper disable UnusedAutoPropertyAccessor.Local - used by ComboBox
|
|
public Guid DeviceId { get; }
|
|
public string DisplayName { get; set; }
|
|
// ReSharper restore UnusedAutoPropertyAccessor.Local
|
|
|
|
|
|
public DeviceItem(Guid deviceId)
|
|
{
|
|
DeviceId = deviceId;
|
|
}
|
|
|
|
|
|
public bool Equals(DeviceItem other)
|
|
{
|
|
if (other == null) return false;
|
|
|
|
return ReferenceEquals(this, other) || DeviceId.Equals(other.DeviceId);
|
|
}
|
|
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (obj == null) return false;
|
|
if (ReferenceEquals(this, obj)) return true;
|
|
|
|
return obj is DeviceItem deviceItem && Equals(deviceItem);
|
|
}
|
|
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return DeviceId.GetHashCode();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public class KnobDeviceChangedEventArgs : EventArgs
|
|
{
|
|
public int KnobIndex { get; set; }
|
|
public Guid? DeviceId { get; set; }
|
|
}
|
|
|
|
public delegate void KnobDeviceChangedEventHandler(object sender, KnobDeviceChangedEventArgs e);
|
|
}
|