5 using System.Windows.Controls;
6 using System.Windows.Data;
8 using SiliconStudio.Core.Mathematics;
10 namespace SiliconStudio.Presentation.Controls
14 private bool interlock;
19 public static readonly DependencyProperty VectorProperty = DependencyProperty.Register(
"Vector", typeof(
Vector2), typeof(
Vector2Editor),
new FrameworkPropertyMetadata(
default(
Vector2), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnVectorPropertyChanged, null,
false, UpdateSourceTrigger.Explicit));
24 public static readonly DependencyProperty XProperty = DependencyProperty.Register(
"X", typeof(
float), typeof(
Vector2Editor),
new FrameworkPropertyMetadata(.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnCartesianPropertyChanged));
29 public static readonly DependencyProperty YProperty = DependencyProperty.Register(
"Y", typeof(
float), typeof(
Vector2Editor),
new FrameworkPropertyMetadata(.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnCartesianPropertyChanged));
34 public static readonly DependencyProperty LengthProperty = DependencyProperty.Register(
"Length", typeof(
float), typeof(
Vector2Editor),
new FrameworkPropertyMetadata(0.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnPolarPropertyChanged, CoerceLengthValue));
39 public static readonly DependencyProperty AngleProperty = DependencyProperty.Register(
"Angle", typeof(
float), typeof(
Vector2Editor),
new FrameworkPropertyMetadata(0.0f, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnPolarPropertyChanged, CoerceAngleValue));
44 public Vector2 Vector {
get {
return (
Vector2)GetValue(VectorProperty); } set { SetValue(VectorProperty, value); } }
49 public float X {
get {
return (
float)GetValue(XProperty); } set { SetValue(XProperty, value); } }
54 public float Y {
get {
return (
float)GetValue(YProperty); } set { SetValue(YProperty, value); } }
59 public float Length {
get {
return (
float)GetValue(LengthProperty); } set { SetValue(LengthProperty, value); } }
64 public float Angle {
get {
return (
float)GetValue(AngleProperty); } set { SetValue(AngleProperty, value); } }
69 private void OnVectorValueChanged()
74 SetCurrentValue(XProperty, Vector.X);
75 SetCurrentValue(YProperty, Vector.Y);
76 SetCurrentValue(LengthProperty, Vector.Length());
81 UpdateBinding(VectorProperty);
88 private void OnCartesianValueChanged(DependencyPropertyChangedEventArgs e)
93 if (e.Property == XProperty)
94 Vector =
new Vector2((
float)e.NewValue, Vector.Y);
95 else if (e.Property == YProperty)
96 Vector =
new Vector2(Vector.X, (
float)e.NewValue);
98 throw new ArgumentException(
"Property unsupported by method OnCartesianPropertyChanged.");
100 SetCurrentValue(LengthProperty, Vector.Length());
105 UpdateBinding(e.Property);
112 private void OnPolarValueChanged(DependencyPropertyChangedEventArgs e)
117 float length = Length;
119 if (e.Property == LengthProperty)
121 length = (float)e.NewValue;
123 else if (e.Property == AngleProperty)
125 angle = (float)e.NewValue;
128 throw new ArgumentException(
"Property unsupported by method OnCartesianPropertyChanged.");
130 angle = MathUtil.DegreesToRadians(angle);
131 Vector =
new Vector2((
float)(length * Math.Cos(angle)), (
float)(length * Math.Sin(MathUtil.DegreesToRadians(angle))));
132 SetCurrentValue(XProperty, Vector.X);
133 SetCurrentValue(YProperty, Vector.Y);
137 UpdateBinding(e.Property);
144 private void UpdateBinding(DependencyProperty dependencyProperty)
146 BindingExpression expression = GetBindingExpression(dependencyProperty);
147 if (expression != null)
148 expression.UpdateSource();
156 private static void OnVectorPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
158 var editor = (Vector2Editor)sender;
159 editor.OnVectorValueChanged();
168 private static void OnCartesianPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
170 var editor = (Vector2Editor)sender;
171 editor.OnCartesianValueChanged(e);
180 private static void OnPolarPropertyChanged(
DependencyObject sender, DependencyPropertyChangedEventArgs e)
182 var editor = (Vector2Editor)sender;
183 editor.OnPolarValueChanged(e);
189 private static object CoerceLengthValue(
DependencyObject sender,
object baseValue)
191 return Math.Max(0.0f, (float)baseValue);
197 private static object CoerceAngleValue(
DependencyObject sender,
object baseValue)
199 return (
float)baseValue % 360.0f;
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
Represents a two dimensional mathematical vector.
static float RadiansToDegrees(float radian)
Converts radians to degrees.