From 02b3fc66f710334e897f3e94fe1956833e775f76 Mon Sep 17 00:00:00 2001 From: Ivo Petrov <48355182+ivaylo-matov@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:34:42 +0000 Subject: [PATCH] [DYN-7838] Color range Node: Show Input ports with default value (#15715) --- src/Libraries/CoreNodeModels/ColorRange.cs | 73 +++++++++++++++++++++- test/DynamoCoreWpfTests/NodeViewTests.cs | 28 ++++++++- 2 files changed, 96 insertions(+), 5 deletions(-) diff --git a/src/Libraries/CoreNodeModels/ColorRange.cs b/src/Libraries/CoreNodeModels/ColorRange.cs index 1da8aec539a..1f75e6f4e66 100644 --- a/src/Libraries/CoreNodeModels/ColorRange.cs +++ b/src/Libraries/CoreNodeModels/ColorRange.cs @@ -32,6 +32,15 @@ namespace CoreNodeModels [AlsoKnownAs("DSCoreNodesUI.ColorRange")] public class ColorRange : NodeModel { + private IEnumerable defaultColors; + private IEnumerable DefaultColors => defaultColors ??= DefaultColorRanges.Analysis.ToList(); + + private AssociativeNode defaultColorsNode; + private AssociativeNode DefaultColorsNode => defaultColorsNode ??= CreateDefaultColorsNode(DefaultColors); + + private AssociativeNode defaultIndicesNode; + private AssociativeNode DefaultIndicesNode => defaultIndicesNode ??= CreateDefaultIndicesNode(DefaultColors); + public event Action RequestChangeColorRange; protected virtual void OnRequestChangeColorRange() { @@ -42,6 +51,18 @@ protected virtual void OnRequestChangeColorRange() [JsonConstructor] private ColorRange(IEnumerable inPorts, IEnumerable outPorts) : base(inPorts, outPorts) { + if (inPorts.Count() == 3 && outPorts.Count() == 1) + { + inPorts.ElementAt(0).DefaultValue = DefaultColorsNode; + inPorts.ElementAt(1).DefaultValue = DefaultIndicesNode; + } + else + { + // If information from json does not look correct, clear the default ports and add ones with default value + InPorts.Clear(); + InitializePorts(); + } + this.PropertyChanged += ColorRange_PropertyChanged; foreach (var port in InPorts) { @@ -51,6 +72,8 @@ private ColorRange(IEnumerable inPorts, IEnumerable outPor public ColorRange() { + // Initialize default values of the ports + InitializePorts(); RegisterAllPorts(); this.PropertyChanged += ColorRange_PropertyChanged; @@ -60,6 +83,14 @@ public ColorRange() } } + private void InitializePorts() + { + InPorts.Add(new PortModel(PortType.Input, this, new PortData("colors", Resources.ColorRangePortDataColorsToolTip, DefaultColorsNode))); + InPorts.Add(new PortModel(PortType.Input, this, new PortData("indices", Resources.ColorRangePortDataIndicesToolTip, DefaultIndicesNode))); + InPorts.Add(new PortModel(PortType.Input, this, new PortData("value", Resources.ColorRangePortDataValueToolTip))); + OutPorts.Add(new PortModel(PortType.Output, this, new PortData("color", Resources.ColorRangePortDataResultToolTip))); + } + void Connectors_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { OnRequestChangeColorRange(); @@ -119,7 +150,7 @@ public ColorRange1D ComputeColorRange(EngineController engine) List parameters; // If there are colors supplied - if (InPorts[0].IsConnected) + if (InPorts[0].Connectors.Any()) { var colorsNode = InPorts[0].Connectors[0].Start.Owner; var colorsIndex = InPorts[0].Connectors[0].Start.Index; @@ -131,10 +162,14 @@ public ColorRange1D ComputeColorRange(EngineController engine) { colors = new List(); colors.AddRange(DefaultColorRanges.Analysis); + + // Create an AssociativeNode for the default colors + InPorts[0].DefaultValue = DefaultColorsNode; + InPorts[0].UsingDefaultValue = true; } // If there are indices supplied - if (InPorts[1].IsConnected) + if (InPorts[1].Connectors.Any()) { var valuesNode = InPorts[1].Connectors[0].Start.Owner; var valuesIndex = InPorts[1].Connectors[0].Start.Index; @@ -145,12 +180,44 @@ public ColorRange1D ComputeColorRange(EngineController engine) else { parameters = CreateParametersForColors(colors); + + // Create an AssociativeNode for the default indices + InPorts[1].DefaultValue = DefaultIndicesNode; + InPorts[1].UsingDefaultValue = true; } return ColorRange1D.ByColorsAndParameters(colors, parameters); } - private static List CreateParametersForColors(List colors) + private AssociativeNode CreateDefaultColorsNode(IEnumerable defaultColors) + { + return AstFactory.BuildExprList( + defaultColors.Select(color => + AstFactory.BuildFunctionCall( + new Func(DSCore.Color.ByARGB), + new List + { + AstFactory.BuildIntNode(color.Red), + AstFactory.BuildIntNode(color.Green), + AstFactory.BuildIntNode(color.Blue) + } + ) + ).ToList() + ); + } + + private AssociativeNode CreateDefaultIndicesNode(IEnumerable defaultColors) + { + var parameters = CreateParametersForColors(defaultColors); + + return AstFactory.BuildExprList( + parameters.Select(AstFactory.BuildDoubleNode) + .Cast() + .ToList() + ); + } + + private static List CreateParametersForColors(IEnumerable colors) { var parameters = new List(); diff --git a/test/DynamoCoreWpfTests/NodeViewTests.cs b/test/DynamoCoreWpfTests/NodeViewTests.cs index 2eabd88391b..32853b4f5a3 100644 --- a/test/DynamoCoreWpfTests/NodeViewTests.cs +++ b/test/DynamoCoreWpfTests/NodeViewTests.cs @@ -584,8 +584,8 @@ public void TestPortColors_NodeModel() Assert.AreEqual(3, portVMs.Count); Assert.AreEqual(1, outPorts.Count); - Assert.AreEqual(InPortViewModel.PortValueMarkerRed.Color, (portVMs[0] as InPortViewModel).PortValueMarkerColor.Color); - Assert.AreEqual(InPortViewModel.PortValueMarkerRed.Color, (portVMs[1] as InPortViewModel).PortValueMarkerColor.Color); + Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (portVMs[0] as InPortViewModel).PortValueMarkerColor.Color); + Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (portVMs[1] as InPortViewModel).PortValueMarkerColor.Color); Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (portVMs[2] as InPortViewModel).PortValueMarkerColor.Color); Assert.False((outPorts[0] as OutPortViewModel).PortDefaultValueMarkerVisible); @@ -670,5 +670,29 @@ public void TestSelectNeighborPins() Assert.AreEqual(5, countAfter); } + [Test] + public void ColorRange_InputPortsShowBlueIndicatorForDefaultValues() + { + Open(@"UI\color_range_ports.dyn"); + + var colorRangeVM = NodeViewWithGuid("423d7eaf-9308-4129-b11f-14c186fa4279"); + + var inPorts = colorRangeVM.ViewModel.InPorts; + + // Assert that the first two input ports show blue markers on graph loaded. + Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (inPorts[0] as InPortViewModel).PortValueMarkerColor.Color); + Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (inPorts[1] as InPortViewModel).PortValueMarkerColor.Color); + Assert.IsTrue((inPorts[0] as InPortViewModel).PortDefaultValueMarkerVisible); + Assert.IsTrue((inPorts[1] as InPortViewModel).PortDefaultValueMarkerVisible); + + Run(); + DispatcherUtil.DoEvents(); + + // Assert that input ports retain default value indicators after graph execution. + Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (inPorts[0] as InPortViewModel).PortValueMarkerColor.Color); + Assert.AreEqual(InPortViewModel.PortValueMarkerBlue.Color, (inPorts[1] as InPortViewModel).PortValueMarkerColor.Color); + Assert.IsTrue((inPorts[0] as InPortViewModel).PortDefaultValueMarkerVisible); + Assert.IsTrue((inPorts[1] as InPortViewModel).PortDefaultValueMarkerVisible); + } } }