diff --git a/Source/Editor/Surface/AnimGraphSurface.cs b/Source/Editor/Surface/AnimGraphSurface.cs
index 40cb1fd9a..237e9d019 100644
--- a/Source/Editor/Surface/AnimGraphSurface.cs
+++ b/Source/Editor/Surface/AnimGraphSurface.cs
@@ -229,20 +229,20 @@ namespace FlaxEditor.Surface
}
///
- protected override void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, Box startBox)
+ protected override void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, List startBoxes)
{
// Check if show additional nodes in the current surface context
if (activeCM != _cmStateMachineMenu)
{
_nodesCache.Get(activeCM);
- base.OnShowPrimaryMenu(activeCM, location, startBox);
+ base.OnShowPrimaryMenu(activeCM, location, startBoxes);
activeCM.VisibleChanged += OnActiveContextMenuVisibleChanged;
}
else
{
- base.OnShowPrimaryMenu(activeCM, location, startBox);
+ base.OnShowPrimaryMenu(activeCM, location, startBoxes);
}
}
diff --git a/Source/Editor/Surface/BehaviorTreeSurface.cs b/Source/Editor/Surface/BehaviorTreeSurface.cs
index 9adcc9949..cf6d7b19a 100644
--- a/Source/Editor/Surface/BehaviorTreeSurface.cs
+++ b/Source/Editor/Surface/BehaviorTreeSurface.cs
@@ -101,12 +101,12 @@ namespace FlaxEditor.Surface
}
///
- protected override void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, Box startBox)
+ protected override void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, List startBoxes)
{
activeCM.ShowExpanded = true;
_nodesCache.Get(activeCM);
- base.OnShowPrimaryMenu(activeCM, location, startBox);
+ base.OnShowPrimaryMenu(activeCM, location, startBoxes);
activeCM.VisibleChanged += OnActiveContextMenuVisibleChanged;
}
diff --git a/Source/Editor/Surface/ContextMenu/VisjectCM.cs b/Source/Editor/Surface/ContextMenu/VisjectCM.cs
index 94b411fc2..de9261356 100644
--- a/Source/Editor/Surface/ContextMenu/VisjectCM.cs
+++ b/Source/Editor/Surface/ContextMenu/VisjectCM.cs
@@ -24,8 +24,8 @@ namespace FlaxEditor.Surface.ContextMenu
/// Visject context menu item clicked delegate.
///
/// The item that was clicked
- /// The currently user-selected box. Can be null.
- public delegate void ItemClickedDelegate(VisjectCMItem clickedItem, Elements.Box selectedBox);
+ /// The currently user-selected boxes. Can be empty/ null.
+ public delegate void ItemClickedDelegate(VisjectCMItem clickedItem, List selectedBoxes);
///
/// Visject Surface node archetype spawn ability checking delegate.
@@ -53,7 +53,7 @@ namespace FlaxEditor.Surface.ContextMenu
private Panel _panel1;
private VerticalPanel _groupsPanel;
private readonly ParameterGetterDelegate _parametersGetter;
- private Elements.Box _selectedBox;
+ private List _selectedBoxes = new List();
private NodeArchetype _parameterGetNodeArchetype;
private NodeArchetype _parameterSetNodeArchetype;
@@ -411,7 +411,8 @@ namespace FlaxEditor.Surface.ContextMenu
if (!IsLayoutLocked)
{
group.UnlockChildrenRecursive();
- if (_contextSensitiveSearchEnabled && _selectedBox != null)
+ // TODO: Improve filtering to be based on boxes with the most common things instead of first box
+ if (_contextSensitiveSearchEnabled && _selectedBoxes[0] != null)
UpdateFilters();
else
SortGroups();
@@ -425,7 +426,8 @@ namespace FlaxEditor.Surface.ContextMenu
}
else if (_contextSensitiveSearchEnabled)
{
- group.EvaluateVisibilityWithBox(_selectedBox);
+ // TODO: Filtering could be improved here as well
+ group.EvaluateVisibilityWithBox(_selectedBoxes[0]);
}
Profiler.EndEvent();
@@ -461,7 +463,7 @@ namespace FlaxEditor.Surface.ContextMenu
};
}
if (_contextSensitiveSearchEnabled)
- group.EvaluateVisibilityWithBox(_selectedBox);
+ group.EvaluateVisibilityWithBox(_selectedBoxes[0]);
group.SortChildren();
if (ShowExpanded)
group.Open(false);
@@ -474,7 +476,7 @@ namespace FlaxEditor.Surface.ContextMenu
if (!isLayoutLocked)
{
- if (_contextSensitiveSearchEnabled && _selectedBox != null)
+ if (_contextSensitiveSearchEnabled && _selectedBoxes[0] != null)
UpdateFilters();
else
SortGroups();
@@ -583,7 +585,7 @@ namespace FlaxEditor.Surface.ContextMenu
private void UpdateFilters()
{
- if (string.IsNullOrEmpty(_searchBox.Text) && _selectedBox == null)
+ if (string.IsNullOrEmpty(_searchBox.Text) && _selectedBoxes[0] == null)
{
ResetView();
Profiler.EndEvent();
@@ -592,7 +594,7 @@ namespace FlaxEditor.Surface.ContextMenu
// Update groups
LockChildrenRecursive();
- var contextSensitiveSelectedBox = _contextSensitiveSearchEnabled ? _selectedBox : null;
+ var contextSensitiveSelectedBox = _contextSensitiveSearchEnabled ? _selectedBoxes[0] : null;
for (int i = 0; i < _groups.Count; i++)
{
_groups[i].UpdateFilter(_searchBox.Text, contextSensitiveSelectedBox);
@@ -640,7 +642,7 @@ namespace FlaxEditor.Surface.ContextMenu
public void OnClickItem(VisjectCMItem item)
{
Hide();
- ItemClicked?.Invoke(item, _selectedBox);
+ ItemClicked?.Invoke(item, _selectedBoxes);
}
///
@@ -666,12 +668,12 @@ namespace FlaxEditor.Surface.ContextMenu
for (int i = 0; i < _groups.Count; i++)
{
_groups[i].ResetView();
- if (_contextSensitiveSearchEnabled)
- _groups[i].EvaluateVisibilityWithBox(_selectedBox);
+ if (_contextSensitiveSearchEnabled && _selectedBoxes.Count > 0)
+ _groups[i].EvaluateVisibilityWithBox(_selectedBoxes[0]);
}
UnlockChildrenRecursive();
- if (_contextSensitiveSearchEnabled && _selectedBox != null)
+ if (_contextSensitiveSearchEnabled && _selectedBoxes.Count > 0 && _selectedBoxes[0] != null)
UpdateFilters();
else
SortGroups();
@@ -772,10 +774,10 @@ namespace FlaxEditor.Surface.ContextMenu
///
/// Parent control to attach to it.
/// Popup menu origin location in parent control coordinates.
- /// The currently selected box that the new node will get connected to. Can be null
- public void Show(Control parent, Float2 location, Elements.Box startBox)
+ /// The currently selected boxes that the new node will get connected to. Can be empty/ null
+ public void Show(Control parent, Float2 location, List startBoxes)
{
- _selectedBox = startBox;
+ _selectedBoxes = startBoxes;
base.Show(parent, location);
}
diff --git a/Source/Editor/Surface/VisjectSurface.ContextMenu.cs b/Source/Editor/Surface/VisjectSurface.ContextMenu.cs
index 36ef020d3..6505b4f64 100644
--- a/Source/Editor/Surface/VisjectSurface.ContextMenu.cs
+++ b/Source/Editor/Surface/VisjectSurface.ContextMenu.cs
@@ -252,10 +252,10 @@ namespace FlaxEditor.Surface
///
/// The active context menu to show.
/// The display location on the surface control.
- /// The start box.
- protected virtual void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, Box startBox)
+ /// The start boxes.
+ protected virtual void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, List startBoxes)
{
- activeCM.Show(this, location, startBox);
+ activeCM.Show(this, location, startBoxes);
}
///
@@ -289,9 +289,10 @@ namespace FlaxEditor.Surface
_cmStartPos = location;
- // Offset added in case the user doesn't like the box and wants to quickly get rid of it by clicking
- Box startBox = _connectionInstigators.Count > 0 ? _connectionInstigators[0] as Box : null;
- OnShowPrimaryMenu(_activeVisjectCM, _cmStartPos + ContextMenuOffset, startBox);
+ List startBoxes = new List(_connectionInstigators.Cast());
+
+ // Position offset added so the user can quickly close the menu by clicking
+ OnShowPrimaryMenu(_activeVisjectCM, _cmStartPos + ContextMenuOffset, startBoxes);
if (!string.IsNullOrEmpty(input))
{
@@ -483,8 +484,8 @@ namespace FlaxEditor.Surface
/// Handles Visject CM item click event by spawning the selected item.
///
/// The item.
- /// The selected box.
- protected virtual void OnPrimaryMenuButtonClick(VisjectCMItem visjectCmItem, Box selectedBox)
+ /// The selected boxes.
+ protected virtual void OnPrimaryMenuButtonClick(VisjectCMItem visjectCmItem, List selectedBoxes)
{
if (!CanEdit)
return;
@@ -511,34 +512,36 @@ namespace FlaxEditor.Surface
// Auto select new node
Select(node);
- if (selectedBox != null)
+ for (int i = 0; i < selectedBoxes.Count; i++)
{
- Box endBox = null;
- foreach (var box in node.GetBoxes().Where(box => box.IsOutput != selectedBox.IsOutput))
+ Box currentBox = selectedBoxes[i];
+ if (currentBox != null)
{
- if (selectedBox.IsOutput)
+ Box endBox = null;
+ foreach (var box in node.GetBoxes().Where(box => box.IsOutput != currentBox.IsOutput))
{
- if (box.CanUseType(selectedBox.CurrentType))
+ if (currentBox.IsOutput)
{
- endBox = box;
- break;
+ if (box.CanUseType(currentBox.CurrentType))
+ {
+ endBox = box;
+ break;
+ }
}
- }
- else
- {
- if (selectedBox.CanUseType(box.CurrentType))
+ else
{
- endBox = box;
- break;
+ if (currentBox.CanUseType(box.CurrentType))
+ {
+ endBox = box;
+ break;
+ }
}
- }
- if (endBox == null && selectedBox.CanUseType(box.CurrentType))
- {
- endBox = box;
+ if (endBox == null && currentBox.CanUseType(box.CurrentType))
+ endBox = box;
}
+ TryConnect(currentBox, endBox);
}
- TryConnect(selectedBox, endBox);
}
}
@@ -554,12 +557,8 @@ namespace FlaxEditor.Surface
}
// If the user is patiently waiting for his box to get connected to the newly created one fulfill his wish!
- _connectionInstigators[0] = startBox;
-
if (!IsConnecting)
- {
ConnectingStart(startBox);
- }
ConnectingEnd(endBox);
// Smart-Select next box
diff --git a/Source/Editor/Surface/VisualScriptSurface.cs b/Source/Editor/Surface/VisualScriptSurface.cs
index 0c11e54ff..2f70ee340 100644
--- a/Source/Editor/Surface/VisualScriptSurface.cs
+++ b/Source/Editor/Surface/VisualScriptSurface.cs
@@ -212,7 +212,7 @@ namespace FlaxEditor.Surface
}
///
- protected override void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, Box startBox)
+ protected override void OnShowPrimaryMenu(VisjectCM activeCM, Float2 location, List startBoxes)
{
// Update nodes for method overrides
Profiler.BeginEvent("Overrides");
@@ -268,7 +268,7 @@ namespace FlaxEditor.Surface
// Update nodes for invoke methods (async)
_nodesCache.Get(activeCM);
- base.OnShowPrimaryMenu(activeCM, location, startBox);
+ base.OnShowPrimaryMenu(activeCM, location, startBoxes);
activeCM.VisibleChanged += OnActiveContextMenuVisibleChanged;
}