diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index 8e6ff87d7..e11627e8f 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -233,11 +233,6 @@ namespace MatterHackers.MatterControl return popupMenu; } - public void GetTracedMouseRay(Action setColor) - { - setColor?.Invoke(Color.Cyan); - } - public PopupMenu GetModifyMenu(ISceneContext sceneContext) { var popupMenu = new PopupMenu(this.MenuTheme); diff --git a/MatterControlLib/DesignTools/PublicPropertyEditor.cs b/MatterControlLib/DesignTools/PublicPropertyEditor.cs index e0c8f9991..c9f495e97 100644 --- a/MatterControlLib/DesignTools/PublicPropertyEditor.cs +++ b/MatterControlLib/DesignTools/PublicPropertyEditor.cs @@ -412,7 +412,7 @@ namespace MatterHackers.MatterControl.DesignTools } else if (propertyValue is Color color) { - var field = new ColorField(theme, object3D.Color); + var field = new ColorField(theme, object3D.Color, null); field.Initialize(0); field.ValueChanged += (s, e) => { diff --git a/MatterControlLib/PartPreviewWindow/ItemColorButton.cs b/MatterControlLib/PartPreviewWindow/ItemColorButton.cs index 3730a0cb4..ec405cab9 100644 --- a/MatterControlLib/PartPreviewWindow/ItemColorButton.cs +++ b/MatterControlLib/PartPreviewWindow/ItemColorButton.cs @@ -51,7 +51,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public bool IsOpen => popupContent?.ContainsFocus == true; - public ItemColorButton(ThemeConfig theme, Color selectedColor) + public ItemColorButton(ThemeConfig theme, Color selectedColor, Action> getPickedColor) { this.ToolTipText = "Color".Localize(); var scaledButtonSize = 24 * GuiWidget.DeviceScale; @@ -82,7 +82,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.DynamicPopupContent = () => { - popupContent = NewColorSelector(theme, colorButton.BackgroundColor, menuTheme, (color) => colorButton.BackgroundColor = color); + popupContent = NewColorSelector(theme, colorButton.BackgroundColor, menuTheme, (color) => colorButton.BackgroundColor = color, getPickedColor); return popupContent; }; @@ -99,7 +99,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow base.OnDraw(graphics2D); } - public static GuiWidget NewColorSelector(ThemeConfig theme, Color selectedColor, ThemeConfig menuTheme, Action update) + public static GuiWidget NewColorSelector(ThemeConfig theme, + Color selectedColor, + ThemeConfig menuTheme, + Action update, + Action> getPickedColor) { var content = new FlowLayoutWidget(FlowDirection.LeftToRight) { @@ -204,32 +208,32 @@ namespace MatterHackers.MatterControl.PartPreviewWindow picker.SetColorWithoutChangeEvent(Color.White); }; - var selectButton = rightContent.AddChild(new TextIconButton("Select".Localize(), StaticData.Instance.LoadIcon("eye_dropper.png", 16, 16).SetToColor(theme.TextColor), theme) + if (getPickedColor != null) { - Margin = 0, - HAnchor = HAnchor.Fit | HAnchor.Left, - VAnchor = VAnchor.Absolute - }); - - selectButton.Click += (s, e) => - { - // change to an eye dropper mode in the design view to allow for color selection - ApplicationController.Instance.GetTracedMouseRay((color) => + var selectButton = rightContent.AddChild(new TextIconButton("Select".Localize(), StaticData.Instance.LoadIcon("eye_dropper.png", 16, 16).SetToColor(theme.TextColor), theme) { - update?.Invoke(color); - picker.SelectedColor = color; + Margin = 0, + HAnchor = HAnchor.Fit | HAnchor.Left, + VAnchor = VAnchor.Absolute }); - }; - selectButton.Visible = false; - - if (selectButton.Width < resetButton.Width) - { - selectButton.HAnchor = HAnchor.Stretch; - } - else - { - resetButton.HAnchor = HAnchor.Stretch; + selectButton.Click += (s, e) => + { + getPickedColor((color) => + { + update?.Invoke(color); + picker.SelectedColor = color; + }); + }; + + if (selectButton.Width < resetButton.Width) + { + selectButton.HAnchor = HAnchor.Stretch; + } + else + { + resetButton.HAnchor = HAnchor.Stretch; + } } return content; diff --git a/MatterControlLib/PartPreviewWindow/MaterialControls.cs b/MatterControlLib/PartPreviewWindow/MaterialControls.cs index 4ed7d705a..a6ebb3d27 100644 --- a/MatterControlLib/PartPreviewWindow/MaterialControls.cs +++ b/MatterControlLib/PartPreviewWindow/MaterialControls.cs @@ -69,7 +69,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var scaledButtonSize = 24 * GuiWidget.DeviceScale; GuiWidget colorButton; - buttonView.AddChild(colorButton = new ItemColorButton(theme, MaterialRendering.Color(printer, extruderIndex, theme.BorderColor)) + buttonView.AddChild(colorButton = new ItemColorButton(theme, MaterialRendering.Color(printer, extruderIndex, theme.BorderColor), null) { Width = scaledButtonSize, Height = scaledButtonSize, diff --git a/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs b/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs index e699d1d9c..c92fe3ba7 100644 --- a/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs +++ b/MatterControlLib/PartPreviewWindow/SelectedObjectPanel.cs @@ -30,6 +30,8 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Collections.Generic; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using JsonPath; using MatterHackers.Agg; using MatterHackers.Agg.Platform; @@ -242,10 +244,52 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var undoBuffer = sceneContext.Scene.UndoBuffer; + void GetNextSelectionColor(Action setColor) + { + var scene = sceneContext.Scene; + var startingSelection = scene.SelectedItem; + CancellationTokenSource cancellationToken = null; + + void SelectionChanged(object s, EventArgs e) + { + var selection = scene.SelectedItem; + if (selection != null) + { + setColor?.Invoke(selection.Color); + scene.SelectionChanged -= SelectionChanged; + cancellationToken?.Cancel(); + scene.SelectedItem = startingSelection; + } + } + + var durationSeconds = 20; + + ApplicationController.Instance.Tasks.Execute("Select an object to copy its color".Localize(), + null, + (progress, cancellationTokenIn) => + { + cancellationToken = cancellationTokenIn; + var time = UiThread.CurrentTimerMs; + var status = new ProgressStatus(); + while (UiThread.CurrentTimerMs < time + durationSeconds * 1000 + && !cancellationToken.IsCancellationRequested) + { + Thread.Sleep(30); + status.Progress0To1 = (UiThread.CurrentTimerMs - time) / 1000.0 / durationSeconds; + progress.Report(status); + } + + scene.SelectionChanged -= SelectionChanged; + return Task.CompletedTask; + }); + + scene.SelectionChanged += SelectionChanged; + } + if (!(selectedItem.GetType().GetCustomAttributes(typeof(HideMeterialAndColor), true).FirstOrDefault() is HideMeterialAndColor)) { // put in a color edit field - var colorField = new ColorField(theme, selectedItem.Color); + var colorField = new ColorField(theme, selectedItem.Color, GetNextSelectionColor); colorField.Initialize(0); colorField.ValueChanged += (s, e) => { diff --git a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs index 39d8f9f2c..edc3ad7a7 100644 --- a/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs +++ b/MatterControlLib/SlicerConfiguration/SliceSettingsWidget.cs @@ -656,7 +656,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration break; case SliceSettingData.DataEditTypes.COLOR: - uiField = new ColorField(theme); + uiField = new ColorField(theme, Color.Transparent, null); break; case SliceSettingData.DataEditTypes.POSITIVE_DOUBLE: diff --git a/StaticData/Translations/Master.txt b/StaticData/Translations/Master.txt index 5741910ef..f46248a57 100644 --- a/StaticData/Translations/Master.txt +++ b/StaticData/Translations/Master.txt @@ -4222,6 +4222,9 @@ Translated:Select a printer to continue English:Select All Translated:Select All +English:Select an object to copy its color +Translated:Select an object to copy its color + English:Select cell to edit Translated:Select cell to edit