public static string SerializeParam(this IParameterDescriptor parameter, [CanBeNull] object value) { if (value == null) { return(null); } if (TryGetPersistentTypeConverter(parameter, out var converter)) { return(JsonUtils.Serialize(converter.ConvertForward(value))); } if (typeof(IParameterizedObject).IsAssignableFrom(parameter.ValueType)) { var factory = parameter.GetParameterizedObjectFactory(); var context = factory.Parse(parameter, (IParameterizedObject)value); var output = new Dictionary <string, string>(); foreach (var p in factory.GetParameters(parameter)) { if (context.TryGet(p, out var val)) { output[p.Key] = SerializeParam(p, val); } } return(JsonUtils.Serialize(output)); } return(JsonUtils.Serialize(value)); }
public PresentedParameter PresentPopup(IParameterDescriptor param, Action updateCallback) { var factory = param.GetParameterizedObjectFactory(); var grid = new Grid(); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(4, GridUnitType.Star) }); grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star), MinWidth = 110, MaxWidth = 130 }); var button = new Button { Content = "Configure →" }; grid.Children.Add(button); Grid.SetColumn(button, 1); var container = new Atomic <IParameterizedObject>(); void Setter(object obj) => container.Set((IParameterizedObject)obj); object Getter() => container.Get(); void Updater(ParameterStateType state, bool value) { if (state != ParameterStateType.Enabled) { return; } button.IsEnabled = value; } button.Click += (sender, e) => { var subParams = factory.GetParameters(param); var context = factory.Parse(param, container.Get()); var configWindow = new ParameterizedConfigWindow(param.Name ?? "Parameter", subParams, context) { Width = 400 }; if (configWindow.ShowDialog(out var @params)) { container.Set(factory.Create(param, @params)); updateCallback(); } }; return(new PresentedParameter(param, grid, Getter, Setter, null, Updater)); }
public static object DeserializeParam(this IParameterDescriptor parameter, string value) { if (TryGetPersistentTypeConverter(parameter, out var converter)) { return(converter.ConvertBackward(JsonUtils.Deserialize(value, converter.OutputType))); } if (typeof(IParameterizedObject).IsAssignableFrom(parameter.ValueType)) { var factory = parameter.GetParameterizedObjectFactory(); var context = new Context(); var strParams = JsonUtils.Deserialize <Dictionary <string, string> >(value); foreach (var p in factory.GetParameters(parameter)) { context.Set(p, DeserializeParam(p, strParams[p.Key])); } return(factory.Create(parameter, context)); } return(value == null ? null : JsonUtils.Deserialize(value, parameter.ValueType)); }
protected override IAdapter GetAdapter(IParameterDescriptor parameter, ParameterViewModel[] subParamViewModels) => new Adapter(parameter, parameter.GetParameterizedObjectFactory(), subParamViewModels);
protected override IParameterDescriptor[] GetSubParameters(IParameterDescriptor parameter) => parameter.GetParameterizedObjectFactory().GetParameters(parameter).ToArray();
public PresentedParameter PresentDirectly(IParameterDescriptor param, Action updateCallback) { var factory = param.GetParameterizedObjectFactory(); var subParameters = factory.GetParameters(param).ToArray(); var subParameterCount = subParameters.Length; var presentedSubParams = new PresentedParameter[subParameterCount]; var grid = new Grid(); if (subParameterCount == 0) { grid.Children.Add(new TextBlock { Text = "<EMPTY>", Foreground = Brushes.DimGray }); } else { var labelVisible = ParamLabelVisibilityProperty.Get(param.Metadata); if (labelVisible) { grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); } grid.RowDefinitions.Add(new RowDefinition { Height = GridLength.Auto }); for (var i = 0; i < subParameterCount; i++) { if (i != 0) { grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(ViewConstants.MinorSpacing, GridUnitType.Pixel) }); } grid.ColumnDefinitions.Add(new ColumnDefinition()); } for (var i = 0; i < subParameterCount; i++) { var columnIndex = i * 2; var subParam = subParameters[i]; if (labelVisible) { var nameTextBlock = ViewHelper.CreateParamNameTextBlock(subParam); nameTextBlock.FontSize = 8; nameTextBlock.TextWrapping = TextWrapping.NoWrap; nameTextBlock.TextAlignment = TextAlignment.Left; grid.Children.Add(nameTextBlock); Grid.SetRow(nameTextBlock, 0); Grid.SetColumn(nameTextBlock, columnIndex); } var presentedSubParam = presentedSubParams[i] = subParam.GetPresenter().Present(subParam, updateCallback); grid.Children.Add(presentedSubParam.Element); if (labelVisible) { Grid.SetRow(presentedSubParam.Element, 1); } Grid.SetColumn(presentedSubParam.Element, columnIndex); GridLength columnWidth; if (ColumnWidthProperty.TryGet(subParam.Metadata, out var propertyValue)) { columnWidth = propertyValue; } else if (presentedSubParam.Element.GetType() == typeof(CheckBox)) { columnWidth = GridLength.Auto; } else { columnWidth = ColumnWidthProperty.DefaultValue; } grid.ColumnDefinitions[columnIndex].Width = columnWidth; } } void Setter(object obj) { var context = factory.Parse(param, (IParameterizedObject)obj); for (var i = 0; i < subParameters.Length; i++) { if (context.TryGet(subParameters[i], out var val)) { presentedSubParams[i].Delegates.Setter(val); } } } object Getter() { var dict = new Context(); for (var i = 0; i < subParameters.Length; i++) { dict.Set(subParameters[i], presentedSubParams[i].Delegates.Getter()); } return(factory.Create(param, dict)); } bool Validator(object value) { var context = factory.Parse(param, (IParameterizedObject)value); var flag = true; for (var i = 0; i < subParameters.Length; i++) { var subParam = subParameters[i]; bool valid; try { var subValue = context.TryGet(subParam, out var val) ? val : subParam.DefaultValue; valid = presentedSubParams[i].Delegates.Validator?.Invoke(subValue) ?? true; } catch (Exception) { valid = false; } presentedSubParams[i].Delegates.Updater?.Invoke(ParameterStateType.Valid, valid); if (!valid) { flag = false; } } return(flag); } void Updater(ParameterStateType state, bool value) { if (state != ParameterStateType.Enabled) { return; } if (value) { var context = factory.Parse(param, (IParameterizedObject)Getter()); for (var i = 0; i < subParameters.Length; i++) { presentedSubParams[i].Delegates.Updater?.Invoke(ParameterStateType.Enabled, factory.IsEnabled(context, subParameters[i])); } } else { foreach (var presentedSubParam in presentedSubParams) { presentedSubParam.Delegates.Updater?.Invoke(ParameterStateType.Enabled, false); } } } return(new PresentedParameter(param, grid, Getter, Setter, Validator, Updater)); }