From cb4b2675b1c97c99ff8d5298eb9a80fd0675d328 Mon Sep 17 00:00:00 2001 From: Lars Brubaker Date: Fri, 7 Dec 2018 13:03:52 -0800 Subject: [PATCH] Working on making the radial color picker an option --- .../ColorPicker/RadialColorPicker.cs | 49 ++++++++++++++++--- .../PartPreviewWindow/ItemColorButton.cs | 22 +++++++++ 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs b/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs index bcc5f90d6..6cb1fcbde 100644 --- a/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs +++ b/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs @@ -53,6 +53,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker private double colorAngle = 0; private bool mouseDownOnRing; private Vector2 unitTrianglePosition = new Vector2(1, .5); + private float alpha; public RadialColorPicker() { @@ -75,6 +76,8 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker } } + public event EventHandler SelectedColorChanged; + public bool mouseDownOnTriangle { get; private set; } public double RingWidth { get => Width / 10; } @@ -82,15 +85,23 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { get { - return ColorF.FromHSL(colorAngle / MathHelper.Tau, unitTrianglePosition.X, unitTrianglePosition.Y).ToColor(); + return ColorF.FromHSL(colorAngle / MathHelper.Tau, unitTrianglePosition.X, unitTrianglePosition.Y, alpha).ToColor(); } set { - value.ToColorF().GetHSL(out double h, out double s, out double l); - colorAngle = h * MathHelper.Tau; - unitTrianglePosition.X = s; - unitTrianglePosition.Y = l; + if (value != SelectedColor) + { + value.ToColorF().GetHSL(out double h, out double s, out double l); + colorAngle = h * MathHelper.Tau; + unitTrianglePosition.X = s; + unitTrianglePosition.Y = l; + alpha = value.Alpha0To1; + + CLampTrianglePosition(ref unitTrianglePosition); + + SelectedColorChanged?.Invoke(this, null); + } } } @@ -146,7 +157,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker // draw the color circle on the triangle var triangleColorCenter = TriangleToWidgetTransform(colorAngle).Transform(unitTrianglePosition); - graphics2D.Circle(triangleColorCenter, RingWidth / 2 - 2, SelectedColor); + graphics2D.Circle(triangleColorCenter, RingWidth / 2 - 2, new Color(SelectedColor, 255)); graphics2D.Ring(triangleColorCenter, RingWidth / 2 - 2, 2, Color.White); // draw the color circle on the ring @@ -166,6 +177,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { var center = new Vector2(Width / 2, Height / 2); var direction = mouseEvent.Position - center; + var startColor = SelectedColor; if (mouseEvent.Button == MouseButtons.Left) { @@ -194,11 +206,18 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker } } + if(startColor != SelectedColor) + { + SelectedColorChanged?.Invoke(this, null); + } + base.OnMouseDown(mouseEvent); } public override void OnMouseMove(MouseEventArgs mouseEvent) { + var startColor = SelectedColor; + if (mouseDownOnRing) { var center = new Vector2(Width / 2, Height / 2); @@ -217,6 +236,11 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker Invalidate(); } + if (startColor != SelectedColor) + { + SelectedColorChanged?.Invoke(this, null); + } + base.OnMouseMove(mouseEvent); } @@ -286,8 +310,10 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker { var start = new Vector2(radius, 0); + var position = this.TransformToScreenSpace(this.Position); + var center = new Vector2(Width / 2, Height / 2); - return center + Vector2.Rotate(start, angle); + return position + center + Vector2.Rotate(start, angle); } private Vector2 GetTrianglePoint(int index, double radius, double pontingAngle) @@ -332,6 +358,13 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker var trianglePosition = TriangleToWidgetTransform(colorAngle) .InverseTransform(widgetPosition); + bool changed = CLampTrianglePosition(ref trianglePosition); + + return (!changed, trianglePosition); + } + + private static bool CLampTrianglePosition(ref Vector2 trianglePosition) + { bool changed = false; trianglePosition.X = agg_basics.Clamp(trianglePosition.X, 0, 1, ref changed); trianglePosition.Y = agg_basics.Clamp(trianglePosition.Y, 0, 1, ref changed); @@ -341,7 +374,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker .5 + (1 - trianglePosition.X) / 2, ref changed); - return (!changed, trianglePosition); + return changed; } } } \ No newline at end of file diff --git a/MatterControlLib/PartPreviewWindow/ItemColorButton.cs b/MatterControlLib/PartPreviewWindow/ItemColorButton.cs index c613d6079..ad9008f0a 100644 --- a/MatterControlLib/PartPreviewWindow/ItemColorButton.cs +++ b/MatterControlLib/PartPreviewWindow/ItemColorButton.cs @@ -34,6 +34,7 @@ using MatterHackers.Agg.Image; using MatterHackers.Agg.UI; using MatterHackers.DataConverters3D; using MatterHackers.Localizations; +using MatterHackers.MatterControl.CustomWidgets.ColorPicker; namespace MatterHackers.MatterControl.PartPreviewWindow { @@ -53,8 +54,28 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var menuTheme = AppContext.MenuTheme; + MakeScrollable = false; + + PopupHAnchor = HAnchor.Fit; + PopupVAnchor = VAnchor.Fit; + this.DynamicPopupContent = () => { +#if false + var container = new GuiWidget(128, 128); + var picker = new RadialColorPicker() + { + SelectedColor = selectedColor, + HAnchor = HAnchor.Stretch, + VAnchor = VAnchor.Stretch, + }; + + picker.SelectedColorChanged += (s, newColor) => colorButton.BackgroundColor = picker.SelectedColor; + + container.AddChild(picker); + + return container; +#else return new ColorSwatchSelector(menuTheme, buttonSize: 16, buttonSpacing: new BorderDouble(1, 1, 0, 0), @@ -65,6 +86,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow HAnchor = HAnchor.Fit, VAnchor = VAnchor.Fit }; +#endif }; colorButton = new ColorButton(selectedColor == Color.Transparent ? theme.SlightShade : selectedColor)