using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using BuzzGUI.Interfaces;
using BuzzGUI.Common;
namespace BuzzGUI.MachineView
{
///
/// Interaction logic for AmpControl.xaml
///
public partial class AmpControl : UserControl
{
Connection connection;
IMachineConnection machineConnection;
const double MinAmp = 66;
const int PanRight = 0x8000;
const int PanCenter = 0x4000;
int oldamp, oldpan;
int newamp, newpan;
public AmpControl(ResourceDictionary rd)
{
if (rd != null) this.Resources.MergedDictionaries.Add(rd);
InitializeComponent();
this.MouseLeave += (sender, e) =>
{
Deactivate();
};
this.PreviewMouseDoubleClick += (sender, e) => { e.Handled = true; };
this.MouseRightButtonUp += (sender, e) => { e.Handled = true; };
this.MouseDown += (sender, e) =>
{
if (e.ChangedButton == MouseButton.Middle)
{
connection.Disconnect();
Visibility = Visibility.Collapsed;
}
else
{
e.Handled = true;
}
};
ampKnob.ValueChanged += (sender, e) =>
{
newamp = ampKnob.Value == 0 ? 0 : (int)Math.Round(Decibel.ToAmplitude(ampKnob.Value * (MinAmp + Decibel.FromAmplitude((double)0xfffe / 0x4000)) - MinAmp) * 0x4000);
machineConnection.Amp = newamp;
UpdateAmpText();
};
panKnob.ValueChanged += (sender, e) =>
{
newpan = (int)Math.Round(panKnob.Value + PanCenter);
machineConnection.Pan = newpan;
UpdatePanText();
};
disconnectButton.Click += (sender, e) =>
{
connection.Disconnect();
Visibility = Visibility.Collapsed;
};
insertButton.Click += (sender, e) =>
{
connection.Insert();
Visibility = Visibility.Collapsed;
};
}
void UpdateAmpText()
{
int v = machineConnection.Amp;
ampTextBlock.Text = v > 0 ? string.Format("{0:F1}dB", Decibel.FromAmplitude(v * (1.0 / 0x4000))) : "-inf.dB";
}
void UpdatePanText()
{
int v = machineConnection.Pan;
if (v == 0) panTextBlock.Text = "L";
else if (v == PanCenter) panTextBlock.Text = "C";
else if (v == PanRight) panTextBlock.Text = "R";
else if (v < PanCenter) panTextBlock.Text = string.Format("{0:F0}L", (PanCenter - v) * (100.0 / PanCenter));
else if (v > PanCenter) panTextBlock.Text = string.Format("{0:F0}R", (v - PanCenter) * (100.0 / PanCenter));
}
void SetAmpKnobValue()
{
newamp = oldamp = machineConnection.Amp;
double v = oldamp;
if (v <= 0)
ampKnob.Value = 0;
else if (v >= 0xfffe)
ampKnob.Value = 1.0;
else
ampKnob.Value = Math.Min(1, (Decibel.FromAmplitude(v / 0x4000) + MinAmp) / (MinAmp + Decibel.FromAmplitude((double)0xfffe / 0x4000)));
UpdateAmpText();
}
void SetPanKnobValue()
{
newpan = oldpan = machineConnection.Pan;
panKnob.Value = (double)oldpan - PanCenter;
UpdatePanText();
}
public void Activate(Connection conn, Point p, MouseButtonEventArgs mbea)
{
if (conn == connection && Visibility == Visibility.Visible)
return;
connection = conn;
machineConnection = conn.MachineConnection;
var mv = this.GetAncestor();
Canvas.SetLeft(this, p.X - 16);
Canvas.SetTop(this, p.Y - 16);
panKnob.Visibility = machineConnection.HasPan ? Visibility.Visible : Visibility.Collapsed;
panViewbox.Visibility = machineConnection.HasPan ? Visibility.Visible : Visibility.Collapsed;
grid.RowDefinitions[1].Height = new GridLength(machineConnection.HasPan ? 4.0 : 0.0);
SetAmpKnobValue();
if (machineConnection.HasPan) SetPanKnobValue();
Visibility = Visibility.Visible;
if (mbea != null)
ampKnob.BeginDrag(mbea);
}
void Deactivate()
{
Visibility = Visibility.Collapsed;
if (newamp != oldamp) connection.MachineGraph.SetConnectionParameter(machineConnection, 0, oldamp, newamp);
if (newpan != oldpan) connection.MachineGraph.SetConnectionParameter(machineConnection, 1, oldpan, newpan);
}
}
}