Add functionality to detect user versus code driven change events

This commit is contained in:
John Lewin 2017-09-04 23:49:05 +03:00
parent 6996261a65
commit 4fec085e14
7 changed files with 115 additions and 71 deletions

View file

@ -139,7 +139,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
if (field2.Value != currentValue
|| settingsKey == "com_port")
{
field2.Value = currentValue;
field2.SetValue(
currentValue,
userInitiated: false);
}
}
}
@ -263,6 +265,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
}
}
// TODO: This should just proxy to settingsControlBar.Visible. Having local state and pushing values on event listeners seems off
private bool showControlBar = true;
public bool ShowControlBar
{
@ -867,6 +870,8 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
ISettingsField OLDFIELDXXXXX = null;
IUIField uiField = null;
bool useDefaultSavePattern = true;
var settingsRow = new SettingsRow(settingsContext, settingData)
{
Margin = new BorderDouble(0, 2),
@ -917,18 +922,22 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
case SliceSettingData.DataEditTypes.CHECK_BOX:
uiField = new CheckboxField();
useDefaultSavePattern = false;
uiField.ValueChanged += (s, e) =>
{
// Linked settings should be updated in all cases (user clicked checkbox, user clicked clear)
foreach (var setSettingsData in settingData.SetSettingsOnChange)
if (e.UserInitiated)
{
string targetValue;
if (uiField.Content is CheckBox checkbox)
// Linked settings should be updated in all cases (user clicked checkbox, user clicked clear)
foreach (var setSettingsData in settingData.SetSettingsOnChange)
{
if (setSettingsData.TryGetValue(checkbox.Checked ? "OnValue" : "OffValue", out targetValue))
string targetValue;
if (uiField.Content is CheckBox checkbox)
{
settingsContext.SetValue(setSettingsData["TargetSetting"], targetValue);
if (setSettingsData.TryGetValue(checkbox.Checked ? "OnValue" : "OffValue", out targetValue))
{
settingsContext.SetValue(setSettingsData["TargetSetting"], targetValue);
}
}
}
}
@ -941,13 +950,17 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
break;
case SliceSettingData.DataEditTypes.MULTI_LINE_TEXT:
OLDFIELDXXXXX = new MultilineStringField();
uiField = new MultilineStringField();
break;
case SliceSettingData.DataEditTypes.COM_PORT:
uiField = new ComPortField();
useDefaultSavePattern = false;
uiField.ValueChanged += (s, e) =>
{
settingsContext.SetComPort(uiField.Value);
if (e.UserInitiated)
{
settingsContext.SetComPort(uiField.Value);
}
};
break;
@ -957,10 +970,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
ListItems = settingData.ExtraSettings.Split(',').ToList()
};
uiField.ValueChanged += (s, e) =>
{
settingsContext.SetValue(settingData.SlicerConfigName, uiField.Value);
};
break;
case SliceSettingData.DataEditTypes.HARDWARE_PRESENT:
@ -969,19 +978,23 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
case SliceSettingData.DataEditTypes.VECTOR2:
uiField = new Vector2Field();
uiField.ValueChanged += (s, e) =>
{
settingsContext.SetValue(settingData.SlicerConfigName, uiField.Value);
};
break;
case SliceSettingData.DataEditTypes.OFFSET2:
OLDFIELDXXXXX = new Offset2Field();
if (OLDFIELDXXXXX is Offset2Field offset2)
uiField = new ExtruderOffsetField()
{
offset2.ExtruderIndex = extruderIndex;
}
ExtruderIndex = extruderIndex
};
useDefaultSavePattern = false;
uiField.ValueChanged += (s, e) =>
{
if (e.UserInitiated
&& s is ExtruderOffsetField extruderOffset)
{
SaveCommaSeparatedIndexSetting(extruderOffset.ExtruderIndex, settingsContext, settingData.SlicerConfigName, extruderOffset.Value.Replace(",", "x"));
}
};
break;
default:
@ -997,7 +1010,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
if (OLDFIELDXXXXX != null)
{
allFields.Add(settingData.SlicerConfigName, OLDFIELDXXXXX);
allFields[settingData.SlicerConfigName] = OLDFIELDXXXXX;
OLDFIELDXXXXX.Value = sliceSettingValue;
@ -1009,14 +1022,20 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
if (uiField != null)
{
allUiFields.Add(settingData.SlicerConfigName, uiField);
allUiFields[settingData.SlicerConfigName] = uiField;
uiField.Initialize(tabIndexForItem++);
uiField.Value = sliceSettingValue;
uiField.SetValue(sliceSettingValue, userInitiated: false);
uiField.ValueChanged += (s, e) =>
{
if (useDefaultSavePattern
&& e.UserInitiated)
{
settingsContext.SetValue(settingData.SlicerConfigName, uiField.Value);
}
settingsContext.SetValue(settingData.SlicerConfigName, uiField.Value);
settingsRow.UpdateStyle();
};

View file

@ -35,29 +35,26 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class BasicField
{
public event EventHandler ValueChanged;
public event EventHandler<FieldChangedEventArgs> ValueChanged;
private string fieldValue;
public string Value
public void SetValue(string newValue, bool userInitiated)
{
get => fieldValue;
set
{
string convertedValue = this.ConvertValue(value);
string convertedValue = this.ConvertValue(newValue);
if (fieldValue != convertedValue)
{
fieldValue = convertedValue;
this.OnValueChanged();
}
else if (value != convertedValue)
{
// If the validated value matches the current value, then UI element values were rejected and must be discarded
this.OnValueChanged();
}
if (this.Value != convertedValue)
{
this.Value = convertedValue;
this.OnValueChanged(new FieldChangedEventArgs(userInitiated));
}
else if (newValue != convertedValue)
{
// If the validated value matches the current value, then UI element values were rejected and must be discarded
this.OnValueChanged(new FieldChangedEventArgs(userInitiated));
}
}
public string Value { get; private set; }
public GuiWidget Content { get; protected set; }
public string HelpText { get; set; }
@ -69,9 +66,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
return newValue;
}
protected virtual void OnValueChanged()
protected virtual void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs)
{
ValueChanged?.Invoke(this, new EventArgs());
ValueChanged?.Invoke(this, fieldChangedEventArgs);
}
}
@ -93,19 +90,21 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
if (this.Value != numberEdit.Value.ToString())
{
this.Value = numberEdit.Value.ToString();
this.SetValue(
numberEdit.Value.ToString(),
userInitiated: true);
}
};
this.Content = numberEdit;
}
protected override void OnValueChanged()
protected override void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs)
{
int.TryParse(this.Value, out int currentValue);
numberEdit.ActuallNumberEdit.Value = currentValue;
base.OnValueChanged();
base.OnValueChanged(fieldChangedEventArgs);
}
}
@ -127,21 +126,24 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
if (this.Value != textEditWidget.Text)
{
this.Value = textEditWidget.Text;
this.SetValue(
textEditWidget.Text,
userInitiated: true);
}
};
this.Content = textEditWidget;
}
protected override void OnValueChanged()
protected override void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs)
{
if (this.Value != textEditWidget.Text)
{
textEditWidget.Text = this.Value;
}
base.OnValueChanged();
base.OnValueChanged(fieldChangedEventArgs);
}
}
@ -156,11 +158,16 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
this.uiField = uiField;
}
public string Value { get => uiField.Value; set => uiField.Value = value; }
public void SetValue(string newValue, bool userInitiated)
{
uiField.SetValue(newValue, userInitiated);
}
public string Value { get => uiField.Value; }
public GuiWidget Content { get; private set; }
public event EventHandler ValueChanged;
public event EventHandler<FieldChangedEventArgs> ValueChanged;
public void Initialize(int tabIndex)
{
@ -181,7 +188,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
newItem.Selected += (s, e) =>
{
uiField.Value = valueLocal;
uiField.SetValue(valueLocal, userInitiated: true);
};
}

View file

@ -48,7 +48,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
};
checkBoxWidget.CheckedStateChanged += (s, e) =>
{
this.Value = checkBoxWidget.Checked ? "1" : "0";
this.SetValue(
checkBoxWidget.Checked ? "1" : "0",
userInitiated: true);
};
this.Content = checkBoxWidget;

View file

@ -40,8 +40,6 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
private DropDownList dropdownList;
public string HelpText { get; set; }
public void Initialize(int tabIndex)
{
EventHandler unregisterEvents = null;
@ -90,12 +88,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
this.Content = dropdownList;
}
protected override void OnValueChanged()
protected override void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs)
{
// Lookup the machine specific comport value rather than the passed in text value
dropdownList.SelectedLabel = ActiveSliceSettings.Instance.Helpers.ComPort();
base.OnValueChanged();
base.OnValueChanged(fieldChangedEventArgs);
}
private void RebuildMenuItems()
@ -120,7 +116,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
if (sender is MenuItem menuItem)
{
this.Value = menuItem.Text;
this.SetValue(
menuItem.Text,
userInitiated: true);
}
};
}

View file

@ -32,11 +32,23 @@ using MatterHackers.Agg.UI;
namespace MatterHackers.MatterControl.SlicerConfiguration
{
public class FieldChangedEventArgs
{
public FieldChangedEventArgs(bool userInitiated)
{
this.UserInitiated = userInitiated;
}
public bool UserInitiated { get; }
}
public interface IUIField
{
event EventHandler ValueChanged;
event EventHandler<FieldChangedEventArgs> ValueChanged;
string Value { get; set; }
string Value { get; }
void SetValue(string newValue, bool userInitiated);
void Initialize(int tabIndex);

View file

@ -62,7 +62,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
{
if (sender is MenuItem menuItem)
{
this.Value = menuItem.Text;
this.SetValue(
menuItem.Text,
userInitiated: true);
}
};
}
@ -70,10 +72,10 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
this.Content = dropdownList;
}
protected override void OnValueChanged()
protected override void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs)
{
dropdownList.SelectedLabel = this.Value;
base.OnValueChanged();
base.OnValueChanged(fieldChangedEventArgs);
}
}
}

View file

@ -61,7 +61,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
};
xEditWidget.ActuallNumberEdit.EditComplete += (sender, e) =>
{
this.Value = string.Format("{0},{1}", xEditWidget.ActuallNumberEdit.Value.ToString(), yEditWidget.ActuallNumberEdit.Value.ToString());
this.SetValue(
string.Format("{0},{1}", xEditWidget.ActuallNumberEdit.Value.ToString(), yEditWidget.ActuallNumberEdit.Value.ToString()),
userInitiated: true);
};
container.AddChild(new TextWidget("X:", pointSize: 10, textColor: ActiveTheme.Instance.PrimaryTextColor)
@ -81,7 +83,9 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
};
yEditWidget.ActuallNumberEdit.EditComplete += (sender, e) =>
{
this.Value = string.Format("{0},{1}", xEditWidget.ActuallNumberEdit.Value.ToString(), yEditWidget.ActuallNumberEdit.Value.ToString());
this.SetValue(
string.Format("{0},{1}", xEditWidget.ActuallNumberEdit.Value.ToString(), yEditWidget.ActuallNumberEdit.Value.ToString()),
userInitiated: true);
};
container.AddChild(new TextWidget("Y:", pointSize: 10, textColor: ActiveTheme.Instance.PrimaryTextColor)
@ -94,7 +98,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
this.Content = container;
}
protected override void OnValueChanged()
protected override void OnValueChanged(FieldChangedEventArgs fieldChangedEventArgs)
{
string[] xyValueStrings2 = this.Value.Split(',');
if (xyValueStrings2.Length != 2)
@ -108,7 +112,7 @@ namespace MatterHackers.MatterControl.SlicerConfiguration
double.TryParse(xyValueStrings2[1], out currentValue);
yEditWidget.ActuallNumberEdit.Value = currentValue;
base.OnValueChanged();
base.OnValueChanged(fieldChangedEventArgs);
}
}
}