private (ImageBindMode Mode, int Layer, EffectValue Effect, ImageDisplayInformation[] Images) AnalyseParameters(PluginExecuteContext context) { EffectValue effect = null; var bind = ImageBindMode.None; int? layer = null; var images = new List <ImageDisplayInformation>(); ImageValue currentImage = null; string currentName = null; TransformValue currentTransform = null; foreach (var(key, value) in context.Parameters) { switch (key) { case EffectValue effectValue: effect = effectValue; break; case ImageValue imageValue: if (currentImage != null) { AddImage(ref currentImage, ref currentName, ref currentTransform, images, context); } currentImage = imageValue; currentTransform = new TransformValue(); break; case IStringConverter stringConverter: var name = stringConverter.ConvertToString(context.Language); switch (name) { case "Layer": layer = IntegerValue.TryParse(value); break; case "Name": currentName = StringValue.TryParse(value); break; case "Effect": effect = value is EffectValue effectValue ? effectValue : throw new ArgumentException($"Unable to create show command: effect {value} is not EffectValue"); break; case "Transform": currentTransform = (TransformValue)currentTransform.AddWith(value); break; case "Bind": if (value is NullValue) { bind = ImageBindMode.Canvas; } else { switch (StringValue.TryParse(value)) { case "Canvas": case "Maximal": case "Max": bind = ImageBindMode.Canvas; break; case "Minimal": case "Min": bind = ImageBindMode.Minimal; break; } } break; case "DefaultTransform": _defaultTransform = value is TransformValue transformValue ? transformValue : throw new ArgumentException($"Unable to set show command default transform: target {value} is not TransformValue"); break; case "DefaultLayer": _defaultLayer = IntegerValue.TryParse(value); break; default: TransformPlugin.AnalyzePropertyTo(name, value, currentTransform, context.Language); break; } break; } } if (currentImage != null) { AddImage(ref currentImage, ref currentName, ref currentTransform, images, context); } layer = layer ?? _defaultLayer; var list = images.ToArray(); for (var i = -1; ++i < list.Length;) { list[i].layer = layer.Value; list[i].status = ImageStatus.PrepareToShow; } return(bind, layer.Value, effect, list); }
private void AddImage(ref ImageValue currentImage, ref string currentName, ref TransformValue currentTransform, List <ImageDisplayInformation> images, PluginExecuteContext context) { if (string.IsNullOrEmpty(currentName)) { throw new MissingMemberException($"Unable to create show command: missing image name for {currentImage.ConvertToString(context.Language)}"); } // ReSharper disable once AccessToModifiedClosure var name = currentName; var image = currentImage; images.RemoveAll(e => e.Name == name || e.Content.EqualsWith(image, context.Language)); images.Add(new ImageDisplayInformation(currentName, currentImage, currentTransform == null ? null : (TransformValue)_defaultTransform.AddWith(currentTransform))); currentName = null; currentImage = null; currentTransform = null; }