Improve arrow key navigation
This commit is contained in:
@@ -136,7 +136,7 @@ namespace FlaxEditor.Surface.Elements
|
|||||||
// TODO: Figure out how to only draw the topmost connection
|
// TODO: Figure out how to only draw the topmost connection
|
||||||
if (IntersectsConnection(ref startPos, ref endPos, ref mousePosition, mouseOverDistance))
|
if (IntersectsConnection(ref startPos, ref endPos, ref mousePosition, mouseOverDistance))
|
||||||
{
|
{
|
||||||
highlight += 1;
|
highlight += 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
DrawConnection(ref startPos, ref endPos, ref color, highlight);
|
DrawConnection(ref startPos, ref endPos, ref color, highlight);
|
||||||
@@ -151,7 +151,7 @@ namespace FlaxEditor.Surface.Elements
|
|||||||
// Draw all the connections
|
// Draw all the connections
|
||||||
var startPos = Parent.PointToParent(Center);
|
var startPos = Parent.PointToParent(Center);
|
||||||
Vector2 endPos = targetBox.Parent.PointToParent(targetBox.Center);
|
Vector2 endPos = targetBox.Parent.PointToParent(targetBox.Center);
|
||||||
DrawConnection(ref startPos, ref endPos, ref _currentTypeColor, 2);
|
DrawConnection(ref startPos, ref endPos, ref _currentTypeColor, 2.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -763,25 +763,29 @@ namespace FlaxEditor.Surface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Draws all selected connections between surface objects related to this node.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="selectedConnectionIndex">The index of the currently selected connection.</param>
|
||||||
|
public void DrawSelectedConnections(int selectedConnectionIndex)
|
||||||
|
{
|
||||||
if (_isSelected)
|
if (_isSelected)
|
||||||
{
|
{
|
||||||
bool hasBoxesSelection = HasBoxesSelection;
|
if (HasBoxesSelection)
|
||||||
for (int j = 0; j < Elements.Count; j++)
|
|
||||||
{
|
{
|
||||||
if (Elements[j] is Box box && box.HasAnyConnection && (!hasBoxesSelection || box.IsSelected))
|
for (int j = 0; j < Elements.Count; j++)
|
||||||
{
|
{
|
||||||
if (box is OutputBox ob)
|
if (Elements[j] is Box box && box.IsSelected && selectedConnectionIndex < box.Connections.Count)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < ob.Connections.Count; i++)
|
if (box is OutputBox ob)
|
||||||
{
|
{
|
||||||
ob.DrawSelectedConnection(ob.Connections[i]);
|
ob.DrawSelectedConnection(ob.Connections[selectedConnectionIndex]);
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
|
||||||
{
|
|
||||||
for (int i = 0; i < box.Connections.Count; i++)
|
|
||||||
{
|
{
|
||||||
if (box.Connections[i] is OutputBox outputBox)
|
if (box.Connections[selectedConnectionIndex] is OutputBox outputBox)
|
||||||
{
|
{
|
||||||
outputBox.DrawSelectedConnection(box);
|
outputBox.DrawSelectedConnection(box);
|
||||||
}
|
}
|
||||||
@@ -789,6 +793,32 @@ namespace FlaxEditor.Surface
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int j = 0; j < Elements.Count; j++)
|
||||||
|
{
|
||||||
|
if (Elements[j] is Box box)
|
||||||
|
{
|
||||||
|
if (box is OutputBox ob)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < ob.Connections.Count; i++)
|
||||||
|
{
|
||||||
|
ob.DrawSelectedConnection(ob.Connections[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < box.Connections.Count; i++)
|
||||||
|
{
|
||||||
|
if (box.Connections[i] is OutputBox outputBox)
|
||||||
|
{
|
||||||
|
outputBox.DrawSelectedConnection(box);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ namespace FlaxEditor.Surface
|
|||||||
for (int i = 0; i < Nodes.Count; i++)
|
for (int i = 0; i < Nodes.Count; i++)
|
||||||
{
|
{
|
||||||
Nodes[i].DrawConnections(ref mousePosition);
|
Nodes[i].DrawConnections(ref mousePosition);
|
||||||
|
Nodes[i].DrawSelectedConnections(_selectedConnectionIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -562,89 +562,69 @@ namespace FlaxEditor.Surface
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (key == KeyboardKeys.ArrowUp || key == KeyboardKeys.ArrowDown)
|
||||||
if (key == KeyboardKeys.ArrowUp)
|
|
||||||
{
|
{
|
||||||
Box selectedBox = GetSelectedBox(SelectedNodes);
|
Box selectedBox = GetSelectedBox(SelectedNodes);
|
||||||
Box toSelect = selectedBox?.ParentNode.GetPreviousBox(selectedBox);
|
if (selectedBox == null) return true;
|
||||||
|
|
||||||
if (toSelect != null)
|
Box toSelect = (key == KeyboardKeys.ArrowUp) ?
|
||||||
|
selectedBox?.ParentNode.GetPreviousBox(selectedBox) :
|
||||||
|
selectedBox?.ParentNode.GetNextBox(selectedBox);
|
||||||
|
|
||||||
|
if (toSelect != null && toSelect.IsOutput == selectedBox.IsOutput)
|
||||||
{
|
{
|
||||||
if (toSelect.Connections.Count > 1)
|
Select(toSelect.ParentNode);
|
||||||
{
|
toSelect.ParentNode.SelectBox(toSelect);
|
||||||
// Box has multiple connections
|
|
||||||
}
|
|
||||||
|
|
||||||
if (toSelect.IsOutput != selectedBox.IsOutput)
|
|
||||||
{
|
|
||||||
// Jump up (nodes)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Select(toSelect.ParentNode);
|
|
||||||
toSelect.ParentNode.SelectBox(toSelect);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
if (key == KeyboardKeys.ArrowDown)
|
|
||||||
|
if (key == KeyboardKeys.Tab)
|
||||||
{
|
{
|
||||||
Box selectedBox = GetSelectedBox(SelectedNodes);
|
Box selectedBox = GetSelectedBox(SelectedNodes);
|
||||||
Box toSelect = selectedBox?.ParentNode.GetNextBox(selectedBox);
|
if (selectedBox == null) return true;
|
||||||
|
|
||||||
if (toSelect != null)
|
int connectionCount = selectedBox.Connections.Count;
|
||||||
|
if (connectionCount == 0) return true;
|
||||||
|
|
||||||
|
if (Root.GetKey(KeyboardKeys.Shift))
|
||||||
{
|
{
|
||||||
if (toSelect.Connections.Count > 1)
|
_selectedConnectionIndex = ((_selectedConnectionIndex - 1) % connectionCount + connectionCount) % connectionCount;
|
||||||
{
|
}
|
||||||
// Box has multiple connections
|
else
|
||||||
}
|
{
|
||||||
|
_selectedConnectionIndex = (_selectedConnectionIndex + 1) % connectionCount;
|
||||||
if (toSelect.IsOutput != selectedBox.IsOutput)
|
|
||||||
{
|
|
||||||
// Jump down (nodes)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Select(toSelect.ParentNode);
|
|
||||||
toSelect.ParentNode.SelectBox(toSelect);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (key == KeyboardKeys.ArrowRight || key == KeyboardKeys.ArrowLeft)
|
if (key == KeyboardKeys.ArrowRight || key == KeyboardKeys.ArrowLeft)
|
||||||
{
|
{
|
||||||
Box selectedBox = GetSelectedBox(SelectedNodes);
|
Box selectedBox = GetSelectedBox(SelectedNodes);
|
||||||
if (selectedBox == null) return false;
|
if (selectedBox == null) return true;
|
||||||
|
|
||||||
Box toSelect = null;
|
Box toSelect = null;
|
||||||
|
|
||||||
if (key == KeyboardKeys.ArrowRight && selectedBox.IsOutput || key == KeyboardKeys.ArrowLeft && !selectedBox.IsOutput)
|
if ((key == KeyboardKeys.ArrowRight && selectedBox.IsOutput) || (key == KeyboardKeys.ArrowLeft && !selectedBox.IsOutput))
|
||||||
{
|
{
|
||||||
if (selectedBox.Connections.Count > 1)
|
if (_selectedConnectionIndex < 0 || _selectedConnectionIndex >= selectedBox.Connections.Count)
|
||||||
{
|
{
|
||||||
// Box has multiple connections
|
_selectedConnectionIndex = 0;
|
||||||
}
|
|
||||||
else if (selectedBox.Connections.Count == 1)
|
|
||||||
{
|
|
||||||
toSelect = selectedBox.Connections[0];
|
|
||||||
}
|
}
|
||||||
|
toSelect = selectedBox.Connections[_selectedConnectionIndex];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Use the node with the closest Y-level
|
// Use the node with the closest Y-level
|
||||||
// Since there are cases like 3 nodes on one side and only 1 node on the other side
|
// Since there are cases like 3 nodes on one side and only 1 node on the other side
|
||||||
|
|
||||||
var elements = selectedBox?.ParentNode.Elements;
|
var elements = selectedBox.ParentNode.Elements;
|
||||||
float distance = float.PositiveInfinity;
|
float minDistance = float.PositiveInfinity;
|
||||||
for (int i = 0; i < elements.Count; i++)
|
for (int i = 0; i < elements.Count; i++)
|
||||||
{
|
{
|
||||||
if (elements[i] is Box box && box.IsOutput != selectedBox.IsOutput && Mathf.Abs(box.Y - selectedBox.Y) < distance)
|
if (elements[i] is Box box && box.IsOutput != selectedBox.IsOutput && Mathf.Abs(box.Y - selectedBox.Y) < minDistance)
|
||||||
{
|
{
|
||||||
toSelect = box;
|
toSelect = box;
|
||||||
distance = Mathf.Abs(box.Y - selectedBox.Y);
|
minDistance = Mathf.Abs(box.Y - selectedBox.Y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ namespace FlaxEditor.Surface
|
|||||||
private GroupArchetype _customNodesGroup;
|
private GroupArchetype _customNodesGroup;
|
||||||
private List<NodeArchetype> _customNodes;
|
private List<NodeArchetype> _customNodes;
|
||||||
private Action _onSave;
|
private Action _onSave;
|
||||||
|
private int _selectedConnectionIndex;
|
||||||
|
|
||||||
internal int _isUpdatingBoxTypes;
|
internal int _isUpdatingBoxTypes;
|
||||||
|
|
||||||
@@ -362,6 +363,8 @@ namespace FlaxEditor.Surface
|
|||||||
Context.ControlSpawned += OnSurfaceControlSpawned;
|
Context.ControlSpawned += OnSurfaceControlSpawned;
|
||||||
Context.ControlDeleted += OnSurfaceControlDeleted;
|
Context.ControlDeleted += OnSurfaceControlDeleted;
|
||||||
|
|
||||||
|
SelectionChanged += () => { _selectedConnectionIndex = 0; };
|
||||||
|
|
||||||
// Init drag handlers
|
// Init drag handlers
|
||||||
DragHandlers.Add(_dragAssets = new DragAssets<DragDropEventArgs>(ValidateDragItem));
|
DragHandlers.Add(_dragAssets = new DragAssets<DragDropEventArgs>(ValidateDragItem));
|
||||||
DragHandlers.Add(_dragParameters = new DragNames<DragDropEventArgs>(SurfaceParameter.DragPrefix, ValidateDragParameter));
|
DragHandlers.Add(_dragParameters = new DragNames<DragDropEventArgs>(SurfaceParameter.DragPrefix, ValidateDragParameter));
|
||||||
|
|||||||
Reference in New Issue
Block a user