diff --git a/SlicerConfiguration/SliceSettingsWidget.cs b/SlicerConfiguration/SliceSettingsWidget.cs index 4f4c64611..b9c8b6902 100644 --- a/SlicerConfiguration/SliceSettingsWidget.cs +++ b/SlicerConfiguration/SliceSettingsWidget.cs @@ -909,7 +909,14 @@ namespace MatterHackers.MatterControl.SlicerConfiguration break; case SliceSettingData.DataEditTypes.POSITIVE_DOUBLE: - OLDFIELDXXXXX = new PositiveDoubleField(); + if (settingData.SetSettingsOnChange.Count > 0) + { + uiField = new BoundDoubleField(settingsContext, settingData); + } + else + { + uiField = new DoubleField(); + } break; case SliceSettingData.DataEditTypes.DOUBLE_OR_PERCENT: @@ -953,8 +960,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration uiField = new MultilineStringField(); break; case SliceSettingData.DataEditTypes.COM_PORT: - uiField = new ComPortField(); useDefaultSavePattern = false; + + uiField = new ComPortField(); uiField.ValueChanged += (s, e) => { if (e.UserInitiated) @@ -981,11 +989,12 @@ namespace MatterHackers.MatterControl.SlicerConfiguration break; case SliceSettingData.DataEditTypes.OFFSET2: + useDefaultSavePattern = false; + uiField = new ExtruderOffsetField() { ExtruderIndex = extruderIndex }; - useDefaultSavePattern = false; uiField.ValueChanged += (s, e) => { if (e.UserInitiated diff --git a/SlicerConfiguration/UIFields/BasicField.cs b/SlicerConfiguration/UIFields/BasicField.cs index 1de2627ea..80ade346d 100644 --- a/SlicerConfiguration/UIFields/BasicField.cs +++ b/SlicerConfiguration/UIFields/BasicField.cs @@ -229,8 +229,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration localUnregisterEvents?.Invoke(s, null); }; - totalContent.DebugShowBounds = true; - this.Content = totalContent; } } diff --git a/SlicerConfiguration/UIFields/PositiveDoubleField.cs b/SlicerConfiguration/UIFields/PositiveDoubleField.cs index ab01cb08f..0810253fd 100644 --- a/SlicerConfiguration/UIFields/PositiveDoubleField.cs +++ b/SlicerConfiguration/UIFields/PositiveDoubleField.cs @@ -28,31 +28,88 @@ either expressed or implied, of the FreeBSD Project. */ using System; +using MatterHackers.Agg; using MatterHackers.Agg.UI; namespace MatterHackers.MatterControl.SlicerConfiguration { - public class PositiveDoubleField : ISettingsField + + public class DoubleOrMmField : ValueOrUnitsField { - private MHNumberEdit doubleEditWidget; - - public Action UpdateStyle { get; set; } - - public string Value { get; set; } - - public GuiWidget Create(SettingsContext settingsContext, SliceSettingData settingData, int tabIndex) + protected override string ConvertValue(string newValue) { - const string multiValuesAreDiffernt = "-"; + string text = newValue.Trim(); - doubleEditWidget = new MHNumberEdit(0, allowDecimals: true, pixelWidth: DoubleField.DoubleEditWidth, tabIndex: tabIndex) + int tokenIndex = text.IndexOf(unitsToken); + bool hasUnitsToken = tokenIndex != -1; + if (hasUnitsToken) { - ToolTipText = settingData.HelpText, - Name = settingData.PresentationName + " Textbox", - SelectAllOnFocus = true - }; + text = text.Substring(0, tokenIndex); + } + + double.TryParse(text, out double currentValue); + return currentValue + (hasUnitsToken ? unitsToken : ""); + } + } + + public class BoundDoubleField : TextField + { + private const string ValuesDifferToken = "-"; + + private bool ChangesMultipleOtherSettings; + + private SliceSettingData settingData; + + private SettingsContext settingsContext; + + public BoundDoubleField(SettingsContext settingsContext, SliceSettingData settingData) + { + this.settingsContext = settingsContext; + this.settingData = settingData; + } + + public override void Initialize(int tabIndex) + { + base.Initialize(tabIndex); + this.textEditWidget.BackgroundColor = RGBA_Bytes.Pink; + ChangesMultipleOtherSettings = settingData.SetSettingsOnChange.Count > 0; + } + + protected override void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs) + { + if (fieldChangedEventArgs.UserInitiated) + { + // If this setting sets other settings, then do that. + if (ChangesMultipleOtherSettings) + { + for (int i = 0; i < settingData.SetSettingsOnChange.Count; i++) + { + string slicerConfigName = settingData.SetSettingsOnChange[i]["TargetSetting"]; + settingsContext.SetValue(slicerConfigName, this.Value); + } + } + + // also always save to the local setting + settingsContext.SetValue(settingData.SlicerConfigName, this.Value); + } + else + { + // Otherwise simply show the new value + textEditWidget.ActualTextEditWidget.Text = FilterValue(this.Value); + } + + base.OnValueChanged(fieldChangedEventArgs); + } + + /// + /// Overrides the current value to display the ValuesDifferToken if they are not all equal + /// + /// + /// The current value cast to double or the ValuesDifferToken (-) + private string FilterValue(string currentValue) + { + string text = currentValue.Trim(); - double currentValue; - bool ChangesMultipleOtherSettings = settingData.SetSettingsOnChange.Count > 0; if (ChangesMultipleOtherSettings) { bool allTheSame = true; @@ -69,52 +126,19 @@ namespace MatterHackers.MatterControl.SlicerConfiguration if (allTheSame && setting.EndsWith("mm")) { - double.TryParse(setting.Substring(0, setting.Length - 2), out currentValue); - doubleEditWidget.ActuallNumberEdit.Value = currentValue; + double.TryParse(setting.Substring(0, setting.Length - 2), out double castValue); + return castValue.ToString(); } else { - doubleEditWidget.ActuallNumberEdit.InternalNumberEdit.Text = multiValuesAreDiffernt; + return ValuesDifferToken; } } else // just set the setting normally { - double.TryParse(this.Value, out currentValue); - doubleEditWidget.ActuallNumberEdit.Value = currentValue; + double.TryParse(this.Value, out double castValue); + return castValue.ToString(); } - doubleEditWidget.ActuallNumberEdit.InternalTextEditWidget.MarkAsStartingState(); - - doubleEditWidget.ActuallNumberEdit.EditComplete += (sender, e) => - { - NumberEdit numberEdit = (NumberEdit)sender; - // If this setting sets other settings, then do that. - if (ChangesMultipleOtherSettings - && numberEdit.Text != multiValuesAreDiffernt) - { - { - settingsContext.SetValue(settingData.SetSettingsOnChange[0]["TargetSetting"], numberEdit.Value.ToString() + "mm"); - } - } - - // also always save to the local setting - settingsContext.SetValue(settingData.SlicerConfigName, numberEdit.Value.ToString()); - this.UpdateStyle(); - }; - - if (settingData.QuickMenuSettings.Count > 0) - { - return SliceSettingsWidget.CreateQuickMenu(settingData, settingsContext, doubleEditWidget, doubleEditWidget.ActuallNumberEdit.InternalTextEditWidget); - } - else - { - return doubleEditWidget; - } - } - - public void OnValueChanged(string text) - { - double.TryParse(text, out double currentValue); - doubleEditWidget.ActuallNumberEdit.Value = currentValue; } } }