diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index 0f7727f3f..ab514772d 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -234,6 +234,11 @@ namespace MatterHackers.MatterControl return popupMenu; } + public void GetEyeDropperColor(Action setColor) + { + setColor?.Invoke(Color.Cyan); + } + public PopupMenu GetModifyMenu(ISceneContext sceneContext) { var popupMenu = new PopupMenu(this.MenuTheme); diff --git a/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs b/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs index 9ce1b8e02..099034fa8 100644 --- a/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs +++ b/MatterControlLib/CustomWidgets/ColorPicker/RadialColorPicker.cs @@ -107,7 +107,7 @@ namespace MatterHackers.MatterControl.CustomWidgets.ColorPicker && keyEvent.KeyCode == Keys.Escape) { downState = DownState.None; - SetColorWithoutChangeEvent(downColor); + SelectedColor = downColor; } base.OnKeyDown(keyEvent); diff --git a/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs b/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs index 4855e0a61..42fdd9837 100644 --- a/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs +++ b/MatterControlLib/PartPreviewWindow/GenerateSupportPanel.cs @@ -41,18 +41,13 @@ namespace MatterHackers.MatterControl.PartPreviewWindow { public class GenerateSupportPanel : FlowLayoutWidget { - private SupportGenerator supportGenerator; - private InteractiveScene scene; - private ThemeConfig theme; + private readonly SupportGenerator supportGenerator; public GenerateSupportPanel(ThemeConfig theme, InteractiveScene scene, double minimumSupportHeight) : base(FlowDirection.TopToBottom) { supportGenerator = new SupportGenerator(scene, minimumSupportHeight); - this.scene = scene; - this.theme = theme; - this.VAnchor = VAnchor.Fit; this.HAnchor = HAnchor.Absolute; this.Width = 300 * GuiWidget.DeviceScale; diff --git a/MatterControlLib/PartPreviewWindow/ItemColorButton.cs b/MatterControlLib/PartPreviewWindow/ItemColorButton.cs index ec0560473..ead7c4d45 100644 --- a/MatterControlLib/PartPreviewWindow/ItemColorButton.cs +++ b/MatterControlLib/PartPreviewWindow/ItemColorButton.cs @@ -43,13 +43,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow public class ItemColorButton : PopupButton { private ColorButton colorButton; + private GuiWidget popupContent; public event EventHandler ColorChanged; + public bool IsOpen => popupContent?.ContainsFocus == true; + public ItemColorButton(ThemeConfig theme, Color selectedColor) { this.ToolTipText = "Color".Localize(); var scaledButtonSize = 14 * GuiWidget.DeviceScale; + this.PopupBorderColor = theme.PopupBorderColor; Width = 30 * GuiWidget.DeviceScale; Height = 30 * GuiWidget.DeviceScale; @@ -64,7 +68,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.DynamicPopupContent = () => { #if true - return NewColorSelector(theme, selectedColor, menuTheme); + popupContent = NewColorSelector(theme, selectedColor, menuTheme, (color) => colorButton.BackgroundColor = color); #else return new ColorSwatchSelector(menuTheme, buttonSize: 16, @@ -77,6 +81,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow VAnchor = VAnchor.Fit }; #endif + return popupContent; }; colorButton = new ColorButton(selectedColor == Color.Transparent ? theme.SlightShade : selectedColor) @@ -99,7 +104,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow this.AddChild(colorButton); } - private GuiWidget NewColorSelector(ThemeConfig theme, Color selectedColor, ThemeConfig menuTheme) + public static GuiWidget NewColorSelector(ThemeConfig theme, Color selectedColor, ThemeConfig menuTheme, Action update) { var content = new FlowLayoutWidget(FlowDirection.LeftToRight) { @@ -115,7 +120,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow HAnchor = HAnchor.Stretch, VAnchor = VAnchor.Stretch, }) as RadialColorPicker; - picker.SelectedColorChanged += (s, newColor) => colorButton.BackgroundColor = picker.SelectedColor; + picker.SelectedColorChanged += (s, newColor) => update?.Invoke(picker.SelectedColor); var rightContent = content.AddChild(new FlowLayoutWidget(FlowDirection.TopToBottom) { @@ -123,7 +128,21 @@ namespace MatterHackers.MatterControl.PartPreviewWindow VAnchor = VAnchor.Stretch, }); - var colorSwatch = rightContent.AddChild(new GuiWidget(10, 10) + var colorContent = rightContent.AddChild(new FlowLayoutWidget() + { + Padding = new BorderDouble(5), + HAnchor = HAnchor.Stretch, + VAnchor = VAnchor.Stretch, + }); + + var startColorSwatch = colorContent.AddChild(new GuiWidget(10, 10) + { + HAnchor = HAnchor.Stretch, + VAnchor = VAnchor.Stretch, + BackgroundColor = picker.SelectedColor + }); + + var colorSwatch = colorContent.AddChild(new GuiWidget(10, 10) { HAnchor = HAnchor.Stretch, VAnchor = VAnchor.Stretch, @@ -131,17 +150,19 @@ namespace MatterHackers.MatterControl.PartPreviewWindow }); picker.IncrementalColorChanged += (s, newColor) => colorSwatch.BackgroundColor = picker.SelectedColor; + picker.SelectedColorChanged += (s, newColor) => colorSwatch.BackgroundColor = picker.SelectedColor; var resetButton = rightContent.AddChild(new TextIconButton("Clear".Localize(), StaticData.Instance.LoadIcon("transparent_grid.png", 16, 16), theme) { - Margin = 0, + Margin = new BorderDouble(0, 0, 0, 3), HAnchor = HAnchor.Fit, - VAnchor = VAnchor.Absolute + VAnchor = VAnchor.Absolute, + ToolTipText = "Clear any assigned color. This may allow component colors to be visible.".Localize(), }); resetButton.Click += (s, e) => { // The colorChanged action displays the given color - use .MinimalHighlight rather than no color - colorButton.BackgroundColor = Color.Transparent; + update?.Invoke(Color.Transparent); picker.SetColorWithoutChangeEvent(Color.White); }; @@ -154,6 +175,11 @@ namespace MatterHackers.MatterControl.PartPreviewWindow selectButton.Click += (s, e) => { // change to an eye dropper mode in the design view to allow for color selection + ApplicationController.Instance.GetEyeDropperColor((color) => + { + update?.Invoke(color); + picker.SelectedColor = color; + }); }; if (selectButton.Width < resetButton.Width) diff --git a/MatterControlLib/PartPreviewWindow/MaterialControls.cs b/MatterControlLib/PartPreviewWindow/MaterialControls.cs index dc249c6e8..31e8744f1 100644 --- a/MatterControlLib/PartPreviewWindow/MaterialControls.cs +++ b/MatterControlLib/PartPreviewWindow/MaterialControls.cs @@ -29,6 +29,7 @@ either expressed or implied, of the FreeBSD Project. using System; using System.Collections.ObjectModel; +using System.Linq; using MatterHackers.Agg; using MatterHackers.Agg.UI; using MatterHackers.DataConverters3D; @@ -68,14 +69,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow var scaledButtonSize = 16 * GuiWidget.DeviceScale; - buttonView.AddChild(new ColorButton(MaterialRendering.Color(extruderIndex, theme.BorderColor)) - { - Width = scaledButtonSize, - Height = scaledButtonSize, - VAnchor = VAnchor.Center, - Margin = new BorderDouble(3, 0, 5, 0), - DrawGrid = true, - }); + buttonView.AddChild(new ItemColorButton(theme, MaterialRendering.Color(extruderIndex, theme.BorderColor))); buttonView.AddChild(new TextWidget(name, pointSize: theme.DefaultFontSize, textColor: theme.TextColor) { @@ -96,6 +90,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow Checked = extruderIndex == initialMaterialIndex, Name = name + " Button" }; + radioButtonView.Selectable = true; materialButtons.Add(radioButton); this.AddChild(radioButton); @@ -112,6 +107,17 @@ namespace MatterHackers.MatterControl.PartPreviewWindow base.OnClosed(e); } - public bool KeepMenuOpen => false; + public bool KeepMenuOpen + { + get + { + if (materialButtons.Where(b => b.DescendantsAndSelf() is ItemColorButton).Where(cb => ((ItemColorButton)cb).IsOpen).Any()) + { + return true; + } + + return false; + } + } } } \ No newline at end of file