Skip to content

Commit

Permalink
Python engine property should copy/paste and undo correctly. (DynamoD…
Browse files Browse the repository at this point in the history
…S#11006)

merging this in and will cp to 2.8
  • Loading branch information
mjkkirschner committed Aug 17, 2020
1 parent ecf9e76 commit 9de0867
Show file tree
Hide file tree
Showing 8 changed files with 256 additions and 28 deletions.
26 changes: 26 additions & 0 deletions src/DynamoCore/Graph/Nodes/NodeModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2094,6 +2094,30 @@ protected override bool UpdateValueCore(UpdateValueParams updateValueParams)
}
}
return true;

case nameof(DisplayLabels):
bool newDisplayLabels;
if (bool.TryParse(value, out newDisplayLabels))
{
DisplayLabels = newDisplayLabels;
}
return true;

case nameof(IsSetAsInput):
bool newIsSetAsInput;
if (bool.TryParse(value, out newIsSetAsInput))
{
IsSetAsInput = newIsSetAsInput;
}
return true;

case nameof(IsSetAsOutput):
bool newIsSetAsOutput;
if (bool.TryParse(value, out newIsSetAsOutput))
{
IsSetAsOutput = newIsSetAsOutput;
}
return true;
}

return base.UpdateValueCore(updateValueParams);
Expand Down Expand Up @@ -2143,6 +2167,7 @@ protected override void SerializeCore(XmlElement element, SaveContext context)
helper.SetAttribute("x", X);
helper.SetAttribute("y", Y);
helper.SetAttribute("isVisible", IsVisible);
helper.SetAttribute(nameof(DisplayLabels), DisplayLabels);
helper.SetAttribute("lacing", ArgumentLacing.ToString());
helper.SetAttribute("isSelectedInput", IsSetAsInput.ToString());
helper.SetAttribute("isSelectedOutput", IsSetAsOutput.ToString());
Expand Down Expand Up @@ -2201,6 +2226,7 @@ protected override void DeserializeCore(XmlElement nodeElement, SaveContext cont
X = helper.ReadDouble("x", 0.0);
Y = helper.ReadDouble("y", 0.0);
isVisible = helper.ReadBoolean("isVisible", true);
displayLabels = helper.ReadBoolean(nameof(DisplayLabels), false);
argumentLacing = helper.ReadEnum("lacing", LacingStrategy.Disabled);
IsSetAsInput = helper.ReadBoolean("isSelectedInput", false);
IsSetAsOutput = helper.ReadBoolean("isSelectedOutput", false);
Expand Down
29 changes: 19 additions & 10 deletions src/DynamoCoreWpf/ViewModels/Core/NodeViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,10 @@ public bool IsSetAsInput
{
if (nodeLogic.IsSetAsInput != value)
{
nodeLogic.IsSetAsInput = value;
RaisePropertyChanged("IsSetAsInput");
DynamoViewModel.ExecuteCommand(new DynamoModel.UpdateModelValueCommand(
Guid.Empty, NodeModel.GUID, nameof(IsSetAsInput), value.ToString()));

RaisePropertyChanged(nameof(IsSetAsInput));
}
}
}
Expand All @@ -187,8 +189,10 @@ public bool IsSetAsOutput
{
if (nodeLogic.IsSetAsOutput != value)
{
nodeLogic.IsSetAsOutput = value;
RaisePropertyChanged("IsSetAsOutput");
DynamoViewModel.ExecuteCommand(new DynamoModel.UpdateModelValueCommand(
Guid.Empty, NodeModel.GUID, nameof(IsSetAsOutput), value.ToString()));

RaisePropertyChanged(nameof(IsSetAsOutput));
}
}
}
Expand All @@ -198,10 +202,10 @@ public bool IsSetAsOutput
/// </summary>
public string Name
{
get
get
{
IsRenamed = OriginalName != nodeLogic.Name;
return nodeLogic.Name;
return nodeLogic.Name;
}
set { nodeLogic.Name = value; }
}
Expand Down Expand Up @@ -324,7 +328,7 @@ public bool IsVisible
}
}


[JsonIgnore]
public Visibility PeriodicUpdateVisibility
{
Expand Down Expand Up @@ -370,8 +374,13 @@ public bool IsDisplayingLabels
get { return nodeLogic.DisplayLabels; }
set
{
nodeLogic.DisplayLabels = value;
RaisePropertyChanged("IsDisplayingLabels");
if (nodeLogic.DisplayLabels != value)
{
DynamoViewModel.ExecuteCommand(new DynamoModel.UpdateModelValueCommand(
Guid.Empty, NodeModel.GUID, nameof(nodeLogic.DisplayLabels), value.ToString()));

RaisePropertyChanged(nameof(IsDisplayingLabels));
}
}
}

Expand Down Expand Up @@ -897,7 +906,7 @@ private void SetLacingType(object param)
{
DynamoViewModel.ExecuteCommand(
new DynamoModel.UpdateModelValueCommand(
Guid.Empty, NodeModel.GUID, "ArgumentLacing", param.ToString()));
Guid.Empty, NodeModel.GUID, nameof(ArgumentLacing), param.ToString()));

DynamoViewModel.RaiseCanExecuteUndoRedo();
}
Expand Down
29 changes: 29 additions & 0 deletions src/Libraries/PythonNodeModels/PythonNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,24 @@ internal void RequestCodeMigration(EventArgs e)
MigrationAssistantRequested?.Invoke(this, e);
}

protected override bool UpdateValueCore(UpdateValueParams updateValueParams)
{
string name = updateValueParams.PropertyName;
string value = updateValueParams.PropertyValue;

if (name == nameof(Engine))
{
PythonEngineVersion result;
if (Enum.TryParse<PythonEngineVersion>(value, out result))
{
Engine = result;
return true;
}

}
return base.UpdateValueCore(updateValueParams);
}

}

[NodeName("Python Script")]
Expand Down Expand Up @@ -252,6 +270,10 @@ protected override void SerializeCore(XmlElement element, SaveContext context)
XmlElement script = element.OwnerDocument.CreateElement("Script");
script.InnerText = this.script;
element.AppendChild(script);
XmlElement engine = element.OwnerDocument.CreateElement(nameof(Engine));
engine.InnerText = Enum.GetName(typeof(PythonEngineVersion), Engine);
element.AppendChild(engine);

}

[Obsolete]
Expand All @@ -266,6 +288,13 @@ protected override void DeserializeCore(XmlElement nodeElement, SaveContext cont
{
script = scriptNode.InnerText;
}
var engineNode =
nodeElement.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == nameof(Engine));

if (engineNode != null)
{
this.Engine = (PythonEngineVersion)Enum.Parse(typeof(PythonEngineVersion),engineNode.InnerText);
}
}

#endregion
Expand Down
9 changes: 7 additions & 2 deletions src/Libraries/PythonNodeModelsWpf/PythonNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Windows.Input;
using Dynamo.Controls;
using Dynamo.Graph.Workspaces;
using Dynamo.Models;
using Dynamo.ViewModels;
using Dynamo.Wpf;
using Dynamo.Wpf.Windows;
Expand Down Expand Up @@ -156,7 +157,9 @@ private void EditScriptContent(object sender, EventArgs e)
/// </summary>
private void UpdateToPython2Engine(object sender, EventArgs e)
{
pythonNodeModel.Engine = PythonEngineVersion.IronPython2;
dynamoViewModel.ExecuteCommand(
new DynamoModel.UpdateModelValueCommand(
Guid.Empty, pythonNodeModel.GUID, nameof(pythonNodeModel.Engine), PythonEngineVersion.IronPython2.ToString()));
pythonNodeModel.OnNodeModified();
}

Expand All @@ -165,7 +168,9 @@ private void UpdateToPython2Engine(object sender, EventArgs e)
/// </summary>
private void UpdateToPython3Engine(object sender, EventArgs e)
{
pythonNodeModel.Engine = PythonEngineVersion.CPython3;
dynamoViewModel.ExecuteCommand(
new DynamoModel.UpdateModelValueCommand(
Guid.Empty, pythonNodeModel.GUID, nameof(pythonNodeModel.Engine), PythonEngineVersion.CPython3.ToString()));
pythonNodeModel.OnNodeModified();
}
}
Expand Down
25 changes: 15 additions & 10 deletions src/Libraries/PythonNodeModelsWpf/PythonStringNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Windows.Controls;
using System.Windows.Data;
using Dynamo.Controls;
using Dynamo.Models;
using Dynamo.ViewModels;
using Dynamo.Wpf;
using PythonNodeModels;
Expand Down Expand Up @@ -65,15 +66,6 @@ private void NodeModel_Disposed(Dynamo.Graph.ModelBase obj)
learnMoreItem.Click -= OpenPythonLearningMaterial;
}

/// <summary>
/// MenuItem click handler
/// </summary>
private void UpdateToPython2Engine(object sender, EventArgs e)
{
pythonStringNodeModel.Engine = PythonEngineVersion.IronPython2;
pythonStringNodeModel.OnNodeModified();
}

/// <summary>
/// Learn More button handler
/// </summary>
Expand All @@ -85,12 +77,25 @@ private void OpenPythonLearningMaterial(object sender, RoutedEventArgs e)
new Uri(PythonNodeModels.Properties.Resources.PythonMigrationWarningUriString, UriKind.Relative)));
}

/// <summary>
/// MenuItem click handler
/// </summary>
private void UpdateToPython2Engine(object sender, EventArgs e)
{
dynamoViewModel.ExecuteCommand(
new DynamoModel.UpdateModelValueCommand(
Guid.Empty, pythonStringNodeModel.GUID, nameof(pythonStringNodeModel.Engine), PythonEngineVersion.IronPython2.ToString()));
pythonStringNodeModel.OnNodeModified();
}

/// <summary>
/// MenuItem click handler
/// </summary>
private void UpdateToPython3Engine(object sender, EventArgs e)
{
pythonStringNodeModel.Engine = PythonEngineVersion.CPython3;
dynamoViewModel.ExecuteCommand(
new DynamoModel.UpdateModelValueCommand(
Guid.Empty, pythonStringNodeModel.GUID, nameof(pythonStringNodeModel.Engine), PythonEngineVersion.CPython3.ToString()));
pythonStringNodeModel.OnNodeModified();
}
}
Expand Down
109 changes: 107 additions & 2 deletions test/DynamoCoreTests/CoreTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,112 @@ public void CanAdd100NodesToClipboardAndPaste()

[Test]
[Category("UnitTests")]
public void CanCopydAndPasteNodeWithRightOffset()
public void CanCopyAndPasteAndUndoShowLabels()
{
var addNode = new DSFunction(CurrentDynamoModel.LibraryServices.GetFunctionDescriptor("+"));

CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(addNode, false);
Assert.AreEqual(1, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());

addNode.DisplayLabels = true;
CurrentDynamoModel.AddToSelection(addNode);
Assert.AreEqual(1, DynamoSelection.Instance.Selection.Count);

CurrentDynamoModel.Copy();
Assert.AreEqual(1, CurrentDynamoModel.ClipBoard.Count);

CurrentDynamoModel.Paste();
Assert.AreEqual(2, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());

Assert.IsTrue(CurrentDynamoModel.CurrentWorkspace.Nodes.All(x => x.DisplayLabels));

CurrentDynamoModel.CurrentWorkspace.Undo();
Assert.AreEqual(1, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());
addNode.DisplayLabels = false;

CurrentDynamoModel.ExecuteCommand(
new DynCmd.UpdateModelValueCommand(
Guid.Empty, addNode.GUID, nameof(NodeModel.DisplayLabels), "true"));
Assert.IsTrue(addNode.DisplayLabels);

CurrentDynamoModel.CurrentWorkspace.Undo();

Assert.IsFalse(addNode.DisplayLabels);
}

[Test]
[Category("UnitTests")]
public void CanCopyAndPasteAndUndoInputState()
{
var numberNode = new DoubleInput();

CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(numberNode, false);
Assert.AreEqual(1, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());

numberNode.IsSetAsInput = true;
CurrentDynamoModel.AddToSelection(numberNode);
Assert.AreEqual(1, DynamoSelection.Instance.Selection.Count);

CurrentDynamoModel.Copy();
Assert.AreEqual(1, CurrentDynamoModel.ClipBoard.Count);

CurrentDynamoModel.Paste();
Assert.AreEqual(2, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());

Assert.IsTrue(CurrentDynamoModel.CurrentWorkspace.Nodes.All(x => x.IsSetAsInput));

CurrentDynamoModel.CurrentWorkspace.Undo();
Assert.AreEqual(1, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());
numberNode.IsSetAsInput = false;

CurrentDynamoModel.ExecuteCommand(
new DynCmd.UpdateModelValueCommand(
Guid.Empty, numberNode.GUID, nameof(NodeModel.IsSetAsInput), "true"));
Assert.IsTrue(numberNode.IsSetAsInput);

CurrentDynamoModel.CurrentWorkspace.Undo();

Assert.IsFalse(numberNode.IsSetAsInput);
}

[Test]
[Category("UnitTests")]
public void CanCopyAndPasteAndUndoOutputState()
{
var addNode = new DSFunction(CurrentDynamoModel.LibraryServices.GetFunctionDescriptor("+"));

CurrentDynamoModel.CurrentWorkspace.AddAndRegisterNode(addNode, false);
Assert.AreEqual(1, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());

addNode.IsSetAsOutput = true;
CurrentDynamoModel.AddToSelection(addNode);
Assert.AreEqual(1, DynamoSelection.Instance.Selection.Count);

CurrentDynamoModel.Copy();
Assert.AreEqual(1, CurrentDynamoModel.ClipBoard.Count);

CurrentDynamoModel.Paste();
Assert.AreEqual(2, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());

Assert.IsTrue(CurrentDynamoModel.CurrentWorkspace.Nodes.All(x => x.IsSetAsOutput));

CurrentDynamoModel.CurrentWorkspace.Undo();
Assert.AreEqual(1, CurrentDynamoModel.CurrentWorkspace.Nodes.Count());
addNode.IsSetAsOutput = false;

CurrentDynamoModel.ExecuteCommand(
new DynCmd.UpdateModelValueCommand(
Guid.Empty, addNode.GUID, nameof(NodeModel.IsSetAsOutput), "true"));
Assert.IsTrue(addNode.IsSetAsOutput);

CurrentDynamoModel.CurrentWorkspace.Undo();

Assert.IsFalse(addNode.IsSetAsOutput);
}

[Test]
[Category("UnitTests")]
public void CanCopyAndPasteNodeWithRightOffset()
{
var addNode = new DSFunction(CurrentDynamoModel.LibraryServices.GetFunctionDescriptor("+"));
addNode.Height = 2;
Expand All @@ -414,7 +519,7 @@ public void CanCopydAndPasteNodeWithRightOffset()

[Test]
[Category("UnitTests")]
public void CanCopydAndPaste2NodesWithRightOffset()
public void CanCopyAndPaste2NodesWithRightOffset()
{
var addNode = new DSFunction(CurrentDynamoModel.LibraryServices.GetFunctionDescriptor("+"));
addNode.Height = 2;
Expand Down
Loading

0 comments on commit 9de0867

Please sign in to comment.