diff --git a/src/GraphMetadataViewExtension/GraphMetadataViewModel.cs b/src/GraphMetadataViewExtension/GraphMetadataViewModel.cs
index 60709819e7b..b1451a07e7c 100644
--- a/src/GraphMetadataViewExtension/GraphMetadataViewModel.cs
+++ b/src/GraphMetadataViewExtension/GraphMetadataViewModel.cs
@@ -1,13 +1,13 @@
using System;
using System.Collections.ObjectModel;
using System.IO;
+using System.Linq;
using System.Windows.Media.Imaging;
using Dynamo.Core;
using Dynamo.Graph.Workspaces;
using Dynamo.GraphMetadata.Controls;
using Dynamo.Linting;
using Dynamo.UI.Commands;
-using Dynamo.ViewModels;
using Dynamo.Wpf.Extensions;
namespace Dynamo.GraphMetadata
@@ -114,10 +114,9 @@ public GraphMetadataViewModel(ViewLoadedParams viewLoadedParams, GraphMetadataVi
this.linterManager = viewLoadedParams.StartupParams.LinterManager;
this.viewLoadedParams.CurrentWorkspaceChanged += OnCurrentWorkspaceChanged;
- // using this as CurrentWorkspaceChanged wont trigger if you:
- // Close a saved workspace and open a New homeworkspace..
- // This means that properties defined in the previous opened workspace will still be showed in the extension.
- // CurrentWorkspaceCleared will trigger everytime a graph is closed which allows us to reset the properties.
+ // Using this as CurrentWorkspaceChanged won't trigger if you close a saved workspace and open a new homeworkspace.
+ // This means that properties defined in the previous opened workspace will still be shown in the extension.
+ // CurrentWorkspaceCleared will trigger every time a graph is closed which allows us to reset the properties.
this.viewLoadedParams.CurrentWorkspaceCleared += OnCurrentWorkspaceChanged;
if (linterManager != null)
{
@@ -128,14 +127,26 @@ public GraphMetadataViewModel(ViewLoadedParams viewLoadedParams, GraphMetadataVi
InitializeCommands();
}
+ ///
+ /// This event is triggered when a new workspace is opened or when the current workspace is cleared.
+ /// This event manages state of the workspace properties (ie GraphDescription, GraphAuthor, HelpLink, Thumbnail)
+ /// as well as the custom properties in the extension which do not live in the workspace model.
+ ///
private void OnCurrentWorkspaceChanged(Graph.Workspaces.IWorkspaceModel obj)
{
- if (!(obj is HomeWorkspaceModel hwm))
+ //Todo review if the workspace properties should be managed in the Workspace model.
+ //Due to the fact that Dynamo often leaves the workspace objects in memory and resets their properties when you open a new workspace,
+ //the management of state is not straightforward. However it may make more sense to update those properties with the clearing logic.
+
+ //Handle the case of a custom workspace model opening
+ if (obj is not HomeWorkspaceModel hwm)
{
extension.Closed();
return;
}
+ //Handle workspace change cases in UI. First is a new workspace or template opening
+ //In this case the properties should be cleared
if (!hwm.IsTemplate && string.IsNullOrEmpty(hwm.FileName) )
{
GraphDescription = string.Empty;
@@ -143,6 +154,14 @@ private void OnCurrentWorkspaceChanged(Graph.Workspaces.IWorkspaceModel obj)
HelpLink = null;
Thumbnail = null;
}
+ //Second is switching between an open workspace and open custom node and no state changes are required.
+ //This case can also be true if you close an open workspace while focused on a custom node.
+ //However in that scenario the first case will be triggered first due to empty filename.
+ else if(hwm == currentWorkspace)
+ {
+ return;
+ }
+ //Third is a new workspace opening from a saved file
else
{
currentWorkspace = hwm;
@@ -152,6 +171,7 @@ private void OnCurrentWorkspaceChanged(Graph.Workspaces.IWorkspaceModel obj)
RaisePropertyChanged(nameof(Thumbnail));
}
+ //Clear custom properties for cases one and two.
CustomProperties.Clear();
}
@@ -216,7 +236,15 @@ private void OpenGraphStatusExecute(object obj)
private void AddCustomPropertyExecute(object obj)
{
- var propName = Properties.Resources.CustomPropertyControl_CustomPropertyDefault + " " + (CustomProperties.Count + 1);
+ int increment = CustomProperties.Count + 1;
+ string propName;
+ do
+ {
+ propName = Properties.Resources.CustomPropertyControl_CustomPropertyDefault + " " + increment;
+ increment++;
+ }
+ while (CustomProperties.Any(x => x.PropertyName == propName));
+
AddCustomProperty(propName, string.Empty);
}
diff --git a/test/DynamoCoreWpfTests/ViewExtensions/GraphMetadataViewExtensionTests.cs b/test/DynamoCoreWpfTests/ViewExtensions/GraphMetadataViewExtensionTests.cs
index 125a20dce05..988c7bd3785 100644
--- a/test/DynamoCoreWpfTests/ViewExtensions/GraphMetadataViewExtensionTests.cs
+++ b/test/DynamoCoreWpfTests/ViewExtensions/GraphMetadataViewExtensionTests.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@@ -8,6 +8,7 @@
using Dynamo.Graph.Workspaces;
using Dynamo.GraphMetadata;
using Dynamo.GraphMetadata.Controls;
+using Dynamo.Models;
using NUnit.Framework;
namespace DynamoCoreWpfTests.ViewExtensions
@@ -29,15 +30,15 @@ public void SettingPropertiesInExtensionUpdatesWorkspace()
var extensionManager = View.viewExtensionManager;
var propertiesExt = extensionManager.ViewExtensions
- .FirstOrDefault(x => x as GraphMetadataViewExtension != null )
+ .FirstOrDefault(x => x as GraphMetadataViewExtension != null)
as GraphMetadataViewExtension;
var hwm = this.ViewModel.CurrentSpace as HomeWorkspaceModel;
// Act
- var graphDescriptionBefore = hwm.Description;
- var graphAuthorBefore = hwm.Author;
- var graphHelpLinkBefore = hwm.GraphDocumentationURL;
+ var graphDescriptionBefore = hwm.Description;
+ var graphAuthorBefore = hwm.Author;
+ var graphHelpLinkBefore = hwm.GraphDocumentationURL;
var graphThumbnailBefore = hwm.Thumbnail;
propertiesExt.viewModel.GraphDescription = graphDescription;
@@ -107,7 +108,7 @@ public void ExistingGraphWithCustomPropertiesWillBeAddedToExtension()
// Arrange
var expectedCP1Key = "My prop 1";
var expectedCP2Key = "My prop 2";
- var expectedCP3Key = "Custom Property 3";
+ var expectedCP3Key = "Custom Property 4";
var expectedCP1Value = "My value 1";
var expectedCP2Value = "My Value 2";
@@ -134,6 +135,48 @@ public void ExistingGraphWithCustomPropertiesWillBeAddedToExtension()
Assert.That(propertiesExt.viewModel.CustomProperties[2].PropertyValue == expectedCP3Value);
}
+ [Test]
+ public void ExistingGraphWithCustomPropertiesKeepsPropertiesWhenCustomNodesAreOpened()
+ {
+ // Arrange
+ var expectedCP1Key = "My prop 1";
+ var expectedCP2Key = "My prop 2";
+ var expectedCP3Key = "Custom Property 4";
+
+ var expectedCP1Value = "My value 1";
+ var expectedCP2Value = "My Value 2";
+ var expectedCP3Value = "";
+
+ // Act
+ var extensionManager = View.viewExtensionManager;
+ var propertiesExt = extensionManager.ViewExtensions
+ .FirstOrDefault(x => x as GraphMetadataViewExtension != null)
+ as GraphMetadataViewExtension;
+
+ Open(@"core\CustompropertyTest.dyn");
+
+ Open(@"core\CustomNodes\add.dyf");
+
+ ViewModel.UIDispatcher.Invoke(new Action(() =>
+ {
+ DynamoModel.SwitchTabCommand switchCommand =
+ new DynamoModel.SwitchTabCommand(0);
+
+ ViewModel.ExecuteCommand(switchCommand);
+ }));
+
+ Model.Logger.Log(ViewModel.CurrentSpace.Name);
+
+ // Assert
+ Assert.That(propertiesExt.viewModel.CustomProperties.Count == 3);
+ Assert.That(propertiesExt.viewModel.CustomProperties[0].PropertyName == expectedCP1Key);
+ Assert.That(propertiesExt.viewModel.CustomProperties[0].PropertyValue == expectedCP1Value);
+ Assert.That(propertiesExt.viewModel.CustomProperties[1].PropertyName == expectedCP2Key);
+ Assert.That(propertiesExt.viewModel.CustomProperties[1].PropertyValue == expectedCP2Value);
+ Assert.That(propertiesExt.viewModel.CustomProperties[2].PropertyName == expectedCP3Key);
+ Assert.That(propertiesExt.viewModel.CustomProperties[2].PropertyValue == expectedCP3Value);
+ }
+
[Test]
public void ExistingGraphOpenModifiedAndClosedWillSetAndClearModifiedFlag()
{
@@ -157,5 +200,23 @@ public void ExistingGraphOpenModifiedAndClosedWillSetAndClearModifiedFlag()
Assert.IsFalse(ViewModel.HomeSpace.HasUnsavedChanges);
}
+
+ [Test]
+ public void AddingNewPropertiesHaveUniquePropertyNames()
+ {
+ var extensionManager = View.viewExtensionManager;
+ var propertiesExt = extensionManager.ViewExtensions
+ .FirstOrDefault(x => x as GraphMetadataViewExtension != null)
+ as GraphMetadataViewExtension;
+
+ var customPropertiesBeforeOpen = propertiesExt.viewModel.CustomProperties.Count;
+ Open(@"core\CustompropertyTest.dyn");
+
+ propertiesExt.viewModel.AddCustomPropertyCommand.Execute(null);
+
+ Assert.That(propertiesExt.viewModel.CustomProperties.Count == 4);
+ Assert.That(propertiesExt.viewModel.CustomProperties[3].PropertyName == "Custom Property 5");
+ Assert.That(propertiesExt.viewModel.CustomProperties[3].PropertyValue == "");
+ }
}
}
diff --git a/test/DynamoCoreWpfTests/ViewExtensions/GraphNodeManagerViewExtensionTests.cs b/test/DynamoCoreWpfTests/ViewExtensions/GraphNodeManagerViewExtensionTests.cs
index 4353c4ae4ce..a867ed4e7c5 100644
--- a/test/DynamoCoreWpfTests/ViewExtensions/GraphNodeManagerViewExtensionTests.cs
+++ b/test/DynamoCoreWpfTests/ViewExtensions/GraphNodeManagerViewExtensionTests.cs
@@ -214,10 +214,12 @@ public void ContainsEmptyListOrNullTest()
int emptyListNodesCount = hwm.Nodes.Count(ContainsAnyEmptyLists);
var view = viewExt.ManagerView;
- var images = WpfUtilities.ChildrenOfType(view.NodesInfoDataGrid);
+ IEnumerable images = [];
Utility.DispatcherUtil.DoEventsLoop(() =>
{
+ images = WpfUtilities.ChildrenOfType(view.NodesInfoDataGrid);
+
int nullNodesImageCount = GetImageCount(images, "Null");
int emptyListNodesImageCount = GetImageCount(images, "EmptyList");
diff --git a/test/core/CustompropertyTest.dyn b/test/core/CustompropertyTest.dyn
index 109e205a708..fcc44a578e3 100644
--- a/test/core/CustompropertyTest.dyn
+++ b/test/core/CustompropertyTest.dyn
@@ -12,6 +12,7 @@
"Connectors": [],
"Dependencies": [],
"NodeLibraryDependencies": [],
+ "EnableLegacyPolyCurveBehavior": true,
"Thumbnail": "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D/8ACK+Ip760sftCXaTafIqSpIgYKcsrD+I9q+P9S/4JH2Ul0z6d8T7i2t+0V1oazsP+BLOn8qAOE+On/BTvXvGWjXOieANIk8JQTq0cmsXU6yX3ln/nmq/LE3+1l/bbXzx+zb+z3r37R/xGtdFsEkh0mJ1l1bVvL+Wzh78/89G/gX/2Wvtvwb/wSf8ACml3yS+JvGmp6/Av/LCws47FX/3iWkP5V9jfD34b+GvhX4at9B8LaPb6NpcI3CG3X7zd2dj8zt/tNzQBp+GPDeneDfD+naHpFtHZ6Zp1tHa2sCdEjRdqj9K1qKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z",
"GraphDocumentationURL": "https://dynamobim.org/",
"ExtensionWorkspaceData": [
@@ -22,23 +23,29 @@
"Data": {
"My prop 1": "My value 1",
"My prop 2": "My Value 2",
- "Custom Property 3": ""
+ "Custom Property 4": ""
}
}
],
"Author": "Name of author",
+ "Linting": {
+ "activeLinter": "None",
+ "activeLinterId": "7b75fb44-43fd-4631-a878-29f4d5d8399a",
+ "warningCount": 0,
+ "errorCount": 0
+ },
"Bindings": [],
"View": {
"Dynamo": {
"ScaleFactor": 1.0,
"HasRunWithoutCrash": true,
"IsVisibleInDynamoLibrary": true,
- "Version": "2.12.0.4955",
+ "Version": "3.2.0.5025",
"RunType": "Automatic",
"RunPeriod": "1000"
},
"Camera": {
- "Name": "Background Preview",
+ "Name": "_Background Preview",
"EyeX": -17.0,
"EyeY": 24.0,
"EyeZ": 50.0,
@@ -49,6 +56,7 @@
"UpY": 1.0,
"UpZ": 0.0
},
+ "ConnectorPins": [],
"NodeViews": [],
"Annotations": [],
"X": 0.0,