forked from DynamoDS/Dynamo
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNodeAutoCompleteViewExtension.cs
More file actions
203 lines (170 loc) · 6.66 KB
/
Copy pathNodeAutoCompleteViewExtension.cs
File metadata and controls
203 lines (170 loc) · 6.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Dynamo.Extensions;
using Dynamo.Logging;
using Dynamo.Graph.Workspaces;
using Dynamo.NodeAutoComplete.ViewModels;
using Dynamo.NodeAutoComplete.Views;
using Dynamo.Search.SearchElements;
using Dynamo.ViewModels;
using Dynamo.Views;
using Dynamo.Wpf.Extensions;
namespace Dynamo.NodeAutoComplete
{
/// <summary>
/// This view extension tracks current clicked node port in Dynamo and
/// tries to suggest the next best node to connect that port.
/// </summary>
public class NodeAutoCompleteViewExtension : ViewExtensionBase, IViewExtension, ILogSource
{
private const String extensionName = "Node Auto Complete";
private ViewLoadedParams viewLoadedParamsReference;
private NodeAutoCompletePanelViewModel nodeAutoCompleteViewModel;
internal MenuItem nodeAutocompleteMenuItem;
/// <summary>
/// Internal cache of the data displayed in data grid, useful in unit testing.
/// You are not expected to modify this but rather inspection.
/// </summary>
internal IEnumerable<NodeAutocompleteCluster> nodeAutocompleteClusters;
internal NodeAutoCompleteView DependencyView
{
get;
set;
}
/// <summary>
/// Extension Name
/// </summary>
public override string Name
{
get
{
return extensionName;
}
}
/// <summary>
/// GUID of the extension
/// </summary>
public override string UniqueId
{
get
{
return "64F28473-0DCB-4E41-BB5B-A409FF6C90AD";
}
}
/// <summary>
/// Dispose function after extension is closed
/// </summary>
public override void Dispose()
{
DependencyView?.Dispose();
nodeAutocompleteClusters = null;
}
public void Ready(ReadyParams readyParams)
{
// Do nothing for now
}
public override void Shutdown()
{
WorkspaceView.RequesNodeAutoCompleteBar -= OnNodeAutoCompleteBarRequested;
}
public override void Startup(ViewStartupParams viewStartupParams)
{
// Do nothing for now
}
public event Action<ILogMessage> MessageLogged;
internal void OnMessageLogged(ILogMessage msg)
{
this.MessageLogged?.Invoke(msg);
}
internal void AddToSidebar()
{
// Dont allow the extension to show in anything that isnt a HomeWorkspaceModel
if (!(this.viewLoadedParamsReference.CurrentWorkspaceModel is HomeWorkspaceModel))
{
this.Closed();
return;
}
this.viewLoadedParamsReference?.AddToExtensionsSideBar(this, DependencyView);
}
internal void ShowViewExtension()
{
AddToSidebar();
if (this.nodeAutocompleteMenuItem != null)
{
this.nodeAutocompleteMenuItem.IsChecked = true;
}
}
public override void Loaded(ViewLoadedParams viewLoadedParams)
{
this.viewLoadedParamsReference = viewLoadedParams ?? throw new ArgumentNullException(nameof(viewLoadedParams));
var dynamoViewModel = viewLoadedParams.DynamoWindow.DataContext as DynamoViewModel;
if (dynamoViewModel.IsDNAClusterPlacementEnabled)
{
DependencyView = new NodeAutoCompleteView(this, viewLoadedParams);
nodeAutoCompleteViewModel = new NodeAutoCompletePanelViewModel(viewLoadedParams.DynamoWindow, dynamoViewModel);
// Adding a button in view menu to refresh and show manually
#if DEBUG
nodeAutocompleteMenuItem = new MenuItem { Header = "Show NodeAutocomplete view extension", IsCheckable = true, IsChecked = false };
nodeAutocompleteMenuItem.Click += (sender, args) =>
{
if (nodeAutocompleteMenuItem.IsChecked)
{
viewLoadedParams.AddToExtensionsSideBar(this, DependencyView);
nodeAutocompleteMenuItem.IsChecked = true;
}
else
{
viewLoadedParams.CloseExtensioninInSideBar(this);
nodeAutocompleteMenuItem.IsChecked = false;
}
};
viewLoadedParams.AddExtensionMenuItem(nodeAutocompleteMenuItem);
#endif
}
WorkspaceView.RequesNodeAutoCompleteBar += OnNodeAutoCompleteBarRequested;
}
public override void Closed()
{
if (this.nodeAutocompleteMenuItem != null)
{
this.nodeAutocompleteMenuItem.IsChecked = false;
}
}
internal void ShowClusterNodeAutocompleteResults(MLNodeClusterAutoCompletionResponse results)
{
nodeAutocompleteClusters = results.Results.ToList().Select(r => new NodeAutocompleteCluster(r));
DependencyView.MainItems.ItemsSource = nodeAutocompleteClusters;
}
private static NodeAutoCompleteBarViewModel nodeAutoCompleteBarViewModel;
private void OnNodeAutoCompleteBarRequested(Window parentWindow, ViewModelBase viewModelBase)
{
PortViewModel portViewModel = viewModelBase as PortViewModel;
if (parentWindow is null || portViewModel is null)
{
return;
}
if (nodeAutoCompleteBarViewModel is null)
{
DynamoViewModel dynamoViewModel = portViewModel?.NodeViewModel?.WorkspaceViewModel?.DynamoViewModel;
nodeAutoCompleteBarViewModel = new NodeAutoCompleteBarViewModel(dynamoViewModel);
}
if(nodeAutoCompleteBarViewModel.IsOpen)
{
return;
}
if (nodeAutoCompleteBarViewModel.PortViewModel != null)
{
nodeAutoCompleteBarViewModel.PortViewModel.Highlight = Visibility.Collapsed;
}
nodeAutoCompleteBarViewModel.PortViewModel = portViewModel;
//TODO : I think we can reuse the window too.
var nodeAutoCompleteBarWindow = new NodeAutoCompleteBarView(parentWindow, nodeAutoCompleteBarViewModel);
nodeAutoCompleteBarWindow.Show();
portViewModel.SetupNodeAutoCompleteClusterWindowPlacement(nodeAutoCompleteBarWindow);
}
}
}