diff --git a/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs b/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs index 11108689f..542042c40 100644 --- a/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs +++ b/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs @@ -40,8 +40,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { public class RadialColorPicker : GuiWidget { - private double colorAngle = 0; - private Vector2 unitTrianglePosition = new Vector2(1, .5); + private (double h, double s, double l) hsl; private float alpha; private Color downColor; @@ -60,21 +59,6 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker this.Width = 100; this.Height = 100; - - if (!TriangleToWidgetTransform(0).Transform(new Vector2(1, .5)).Equals(new Vector2(88, 50), .01)) - { - // throw new Exception("Incorrect transform"); - } - - if (!TriangleToWidgetTransform(0).InverseTransform(new Vector2(88, 50)).Equals(new Vector2(1, .5), .01)) - { - // throw new Exception("Incorrect transform"); - } - - if (!TriangleToWidgetTransform(0).Transform(new Vector2(0, .5)).Equals(new Vector2(23.13, 50), .01)) - { - // throw new Exception("Incorrect transform"); - } } public event EventHandler IncrementalColorChanged; @@ -91,13 +75,12 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker if ((color.red != color.green || color.green != color.blue || color.blue != 0) && (color.red != color.green || color.green != color.blue || color.blue != 255)) { - colorAngle = h * MathHelper.Tau; + hsl.h = h; } - unitTrianglePosition.X = s; - unitTrianglePosition.Y = l; + hsl.s = s; + hsl.l = l; alpha = color.Alpha0To1; - CLampTrianglePosition(ref unitTrianglePosition); Invalidate(); } @@ -117,7 +100,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { get { - return ColorF.FromHSL(colorAngle / MathHelper.Tau, unitTrianglePosition.X, unitTrianglePosition.Y, alpha).ToColor(); + return ColorF.FromHSL(hsl.h, hsl.s, hsl.l, alpha).ToColor(); } set @@ -135,13 +118,13 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { get { - return ColorF.FromHSL(colorAngle / MathHelper.Tau, 1, .5).ToColor(); + return ColorF.FromHSL(hsl.h, 1, .5).ToColor(); } set { value.ToColorF().GetHSL(out double h, out _, out _); - colorAngle = h * MathHelper.Tau; + hsl.h = h; } } @@ -176,12 +159,16 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker graphics2D.Ring(center, RingRadius - RingWidth / 2, 1, Color.Black); // draw the triangle outline + var colorAngle = hsl.h * MathHelper.Tau; graphics2D.Line(GetTrianglePoint(0, InnerRadius, colorAngle), GetTrianglePoint(1, InnerRadius, colorAngle), Color.Black); graphics2D.Line(GetTrianglePoint(1, InnerRadius, colorAngle), GetTrianglePoint(2, InnerRadius, colorAngle), Color.Black); graphics2D.Line(GetTrianglePoint(2, InnerRadius, colorAngle), GetTrianglePoint(0, InnerRadius, colorAngle), Color.Black); // draw the color circle on the triangle - var triangleColorCenter = TriangleToWidgetTransform(colorAngle).Transform(unitTrianglePosition); + var unitPosition = new Vector2(hsl.s, hsl.l); + unitPosition.Y = agg_basics.Clamp(unitPosition.Y, .5 - (1 - unitPosition.X) / 2, .5 + (1 - unitPosition.X) / 2); + + var triangleColorCenter = TriangleToWidgetTransform().Transform(unitPosition); graphics2D.Circle(triangleColorCenter, RingWidth / 2 - 2, new Color(SelectedColor, 255)); graphics2D.Ring(triangleColorCenter, RingWidth / 2 - 2, 2, Color.White); @@ -213,12 +200,14 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { downState = DownState.OnRing; - colorAngle = Math.Atan2(direction.Y, direction.X); + var colorAngle = Math.Atan2(direction.Y, direction.X); if (colorAngle < 0) { colorAngle += MathHelper.Tau; } + hsl.h = colorAngle / MathHelper.Tau; + Invalidate(); } else @@ -228,7 +217,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker if (inside) { downState = DownState.OnTriangle; - unitTrianglePosition = position; + SetSLFromUnitPosition(position); } Invalidate(); @@ -243,6 +232,21 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker base.OnMouseDown(mouseEvent); } + private void SetSLFromUnitPosition(Vector2 position) + { + hsl.s = position.X; + hsl.l = position.Y; + /* + if (hsl.l > hsl.s) + { + + } + else if (hsl.l < hsl.s) + agg_basics.Clamp(unitPosition.Y, .5 - (1 - unitPosition.X) / 2, .5 + (1 - unitPosition.X) / 2); + unitTrianglePosition = position; + */ + } + public override void OnMouseMove(MouseEventArgs mouseEvent) { var startColor = SelectedColor; @@ -253,17 +257,18 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker var center = new Vector2(Width / 2, Height / 2); var direction = mouseEvent.Position - center; - colorAngle = Math.Atan2(direction.Y, direction.X); + var colorAngle = Math.Atan2(direction.Y, direction.X); if (colorAngle < 0) { colorAngle += MathHelper.Tau; } + hsl.h = colorAngle / MathHelper.Tau; Invalidate(); break; case DownState.OnTriangle: - unitTrianglePosition = WidgetToUnitTriangle(mouseEvent.Position).position; + SetSLFromUnitPosition(WidgetToUnitTriangle(mouseEvent.Position).position); Invalidate(); break; } @@ -330,6 +335,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker GL.Begin(BeginMode.Triangles); GL.Color4(color.Red0To255, color.Green0To255, color.Blue0To255, color.Alpha0To255); + var colorAngle = hsl.h * MathHelper.Tau; GL.Vertex2(GetTrianglePoint(0, radius, colorAngle, true)); GL.Color4(Color.White); GL.Vertex2(GetTrianglePoint(1, radius, colorAngle, true)); @@ -373,7 +379,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker return Vector2.Zero; } - private Affine TriangleToWidgetTransform(double angle) + private Affine TriangleToWidgetTransform() { var center = new Vector2(Width / 2, Height / 2); var leftSize = .5; @@ -385,7 +391,8 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker // center total *= Affine.NewTranslation(-leftSize, -sizeToTop); // rotate to correct color - total *= Affine.NewRotation(angle); + var colorAngle = hsl.h * MathHelper.Tau; + total *= Affine.NewRotation(colorAngle); // scale to radius total *= Affine.NewScaling(InnerRadius); // move to center @@ -395,15 +402,15 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker private (bool inside, Vector2 position) WidgetToUnitTriangle(Vector2 widgetPosition) { - var trianglePosition = TriangleToWidgetTransform(colorAngle) + var trianglePosition = TriangleToWidgetTransform() .InverseTransform(widgetPosition); - bool changed = CLampTrianglePosition(ref trianglePosition); + bool changed = ClampTrianglePosition(ref trianglePosition); return (!changed, trianglePosition); } - private static bool CLampTrianglePosition(ref Vector2 trianglePosition) + private static bool ClampTrianglePosition(ref Vector2 trianglePosition) { bool changed = false; trianglePosition.X = agg_basics.Clamp(trianglePosition.X, 0, 1, ref changed); diff --git a/MatterControlLib/MatterControlLib.csproj b/MatterControlLib/MatterControlLib.csproj index 1147e118b..8e4e65771 100644 --- a/MatterControlLib/MatterControlLib.csproj +++ b/MatterControlLib/MatterControlLib.csproj @@ -96,6 +96,7 @@ + diff --git a/Submodules/MatterSlice b/Submodules/MatterSlice index d6f3c3bd7..18f8d4db0 160000 --- a/Submodules/MatterSlice +++ b/Submodules/MatterSlice @@ -1 +1 @@ -Subproject commit d6f3c3bd7d519ddd1c86f915a6552dc2d994a5c0 +Subproject commit 18f8d4db0a361138d68845ef24fd22f5804f9347 diff --git a/Submodules/agg-sharp b/Submodules/agg-sharp index 88d466ab8..7d99030b8 160000 --- a/Submodules/agg-sharp +++ b/Submodules/agg-sharp @@ -1 +1 @@ -Subproject commit 88d466ab8f17d0b2a8fad9ce12ec38249408784a +Subproject commit 7d99030b8b03d3f2a2ef541113ede214456d7f0a diff --git a/Tests/MatterControl.AutomationTests/SliceSettingsTests.cs b/Tests/MatterControl.AutomationTests/SliceSettingsTests.cs index 7535dc761..10d7a7da2 100644 --- a/Tests/MatterControl.AutomationTests/SliceSettingsTests.cs +++ b/Tests/MatterControl.AutomationTests/SliceSettingsTests.cs @@ -167,10 +167,14 @@ namespace MatterHackers.MatterControl.Tests.Automation testRunner.OpenSettingsSidebar(false); for (int i = 0; i < 3; i++) { - testRunner.ClickByName("Slice Settings Overflow Menu"); - testRunner.ClickByName("Advanced Menu Item"); - testRunner.ClickByName("Slice Settings Overflow Menu"); - testRunner.ClickByName("Simple Menu Item"); + testRunner.Delay() + .ClickByName("Slice Settings Overflow Menu") + .Delay() + .ClickByName("Advanced Menu Item") + .Delay() + .ClickByName("Slice Settings Overflow Menu") + .Delay() + .ClickByName("Simple Menu Item"); } } }, maxTimeToRun: 120);