Skip to content

Commit

Permalink
DYN-6397 Fix crash when parent node is deleted while node autocomplet…
Browse files Browse the repository at this point in the history
…e menu is displayed (#14715)

* Fix PostDiff job

* fix

* Revert different commit

This reverts commit a588d14.

* comments

* add unsub

* add test

* Update NodeAutoCompleteSearchControl.xaml.cs

---------

Co-authored-by: Aaron (Qilong) <[email protected]>
  • Loading branch information
zeusongit and QilongTang authored Dec 13, 2023
1 parent cfad5a1 commit bcdeccb
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/DynamoCore/DynamoCore.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -89,10 +89,10 @@
<ItemGroup>
<Resource Include="BuiltInAndOperators\BuiltIn.Migrations.xml" />
</ItemGroup>
<ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
Expand Down
17 changes: 16 additions & 1 deletion src/DynamoCoreWpf/Controls/NodeAutoCompleteSearchControl.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
using Dynamo.Graph.Nodes;
using Dynamo.Graph.Nodes.ZeroTouch;
using Dynamo.Graph.Workspaces;
using Dynamo.Logging;
Expand Down Expand Up @@ -213,6 +214,19 @@ private void OnNodeAutoCompleteSearchControlVisibilityChanged(object sender, Dep
SearchTextBox.Focus();
ViewModel.PopulateAutoCompleteCandidates();
}), DispatcherPriority.Loaded);

ViewModel.ParentNodeRemoved += OnParentNodeRemoved;
}

//Removes nodeautocomplete menu when the associated parent node is removed.
private void OnParentNodeRemoved(NodeModel node)
{
NodeModel parent_node = ViewModel.PortViewModel?.PortModel.Owner;
if (node == parent_node)
{
OnRequestShowNodeAutoCompleteSearch(ShowHideFlags.Hide);
ViewModel.ParentNodeRemoved -= OnParentNodeRemoved;
}
}

private void OnMembersListBoxUpdated(object sender, DataTransferEventArgs e)
Expand Down Expand Up @@ -351,12 +365,13 @@ private void OnMoreInfoClicked(object sender, RoutedEventArgs e)

internal void CloseAutocompletionWindow(object sender, RoutedEventArgs e)
{
OnRequestShowNodeAutoCompleteSearch(ShowHideFlags.Hide);
CloseAutoCompletion();
}

internal void CloseAutoCompletion()
{
OnRequestShowNodeAutoCompleteSearch(ShowHideFlags.Hide);
ViewModel?.OnNodeAutoCompleteWindowClosed();
}

/// <summary>
Expand Down
2 changes: 0 additions & 2 deletions src/DynamoCoreWpf/ViewModels/Core/DynamoViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
using Dynamo.Graph.Nodes;
using Dynamo.Graph.Workspaces;
using Dynamo.Interfaces;
using Dynamo.Logging;
using Dynamo.Models;
using Dynamo.PackageManager;
using Dynamo.PackageManager.UI;
Expand Down Expand Up @@ -2794,7 +2793,6 @@ internal bool CanDelete(object parameters)
return DynamoSelection.Instance.Selection.Count > 0;
}


public void SaveImage(object parameters)
{
OnRequestSaveImage(this, new ImageSaveEventArgs(parameters.ToString()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ public bool DisplayLowConfidence
}
}

internal event Action<NodeModel> ParentNodeRemoved;

/// <summary>
/// Constructor
/// </summary>
Expand Down Expand Up @@ -530,6 +532,7 @@ internal void PopulateAutoCompleteCandidates()
{
if (PortViewModel == null) return;

dynamoViewModel.CurrentSpaceViewModel.Model.NodeRemoved += NodeViewModel_Removed;
ResetAutoCompleteSearchViewState();

if (IsDisplayingMLRecommendation)
Expand Down Expand Up @@ -595,6 +598,16 @@ internal void PopulateDefaultAutoCompleteCandidates()
}
}

internal void OnNodeAutoCompleteWindowClosed()
{
dynamoViewModel.CurrentSpaceViewModel.Model.NodeRemoved -= NodeViewModel_Removed;
}

internal void NodeViewModel_Removed(NodeModel node)
{
ParentNodeRemoved?.Invoke(node);
}

/// <summary>
/// Returns a IEnumberable of NodeSearchElementViewModel for respective NodeSearchElements.
/// </summary>
Expand Down
31 changes: 31 additions & 0 deletions test/DynamoCoreWpfTests/NodeAutoCompleteSearchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,37 @@ public void SearchNodeAutocompletionSuggestions()
Assert.AreEqual(5 , searchViewModel.FilteredResults.Count());
}

[Test]
public void CloseNodeAutocompleteWhenParentNodeDeleted()
{
Open(@"UI\builtin_inputport_suggestion.dyn");

// Get the node view for a specific node in the graph
NodeView nodeView = NodeViewWithGuid(Guid.Parse("77aad5875f124bf59a4ece6b30813d3b").ToString());

var inPorts = nodeView.ViewModel.InPorts;
Assert.AreEqual(2, inPorts.Count());
var port = inPorts[0].PortModel;
var type = port.GetInputPortType();
Assert.AreEqual("DSCore.Color[]", type);

var searchViewModel = (ViewModel.CurrentSpaceViewModel.NodeAutoCompleteSearchViewModel as NodeAutoCompleteSearchViewModel);
searchViewModel.PortViewModel = inPorts[0];
searchViewModel.dynamoViewModel.PreferenceSettings.DefaultNodeAutocompleteSuggestion = NodeAutocompleteSuggestion.ObjectType;

// Get the matching node elements for the specific node port.
searchViewModel.PopulateAutoCompleteCandidates();
// Show Node AutoCompleteSearchBar
ViewModel.CurrentSpaceViewModel.OnRequestNodeAutoCompleteSearch(ShowHideFlags.Show);
//remove the parent node
searchViewModel.dynamoViewModel.CurrentSpaceViewModel.Model.RemoveAndDisposeNode(nodeView.ViewModel.NodeModel);

var currentWs = View.ChildOfType<WorkspaceView>();
//confirm if the AutoCompleteSearchBar is closed.
Assert.IsFalse(currentWs.NodeAutoCompleteSearchBar.IsOpen);

}

[Test]
public void NodeSuggestions_SkippedSuggestions()
{
Expand Down

0 comments on commit bcdeccb

Please sign in to comment.