Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for finding toolbox elements #1074

Merged
merged 5 commits into from
Oct 10, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 62 additions & 2 deletions Bonsai.Editor/EditorForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

104 changes: 94 additions & 10 deletions Bonsai.Editor/EditorForm.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
Expand Down Expand Up @@ -1412,25 +1412,25 @@ void HandleWorkflowCompleted()
else clearErrors();
}

void HighlightDeclaration(WorkflowGraphView workflowView, ExpressionDeclaration declaration)
void HighlightExpression(WorkflowGraphView workflowView, ExpressionScope scope)
{
if (workflowView == null)
{
throw new ArgumentNullException(nameof(workflowView));
}

var graphNode = workflowView.FindGraphNode(declaration.Value);
var graphNode = workflowView.FindGraphNode(scope.Value);
if (graphNode != null)
{
workflowView.GraphView.SelectedNode = graphNode;
var nestedDeclaration = declaration.InnerDeclaration;
if (nestedDeclaration != null)
var innerScope = scope.InnerScope;
if (innerScope != null)
{
workflowView.LaunchWorkflowView(graphNode);
var editorLauncher = workflowView.GetWorkflowEditorLauncher(graphNode);
if (editorLauncher != null)
{
HighlightDeclaration(editorLauncher.WorkflowGraphView, nestedDeclaration);
HighlightExpression(editorLauncher.WorkflowGraphView, innerScope);
}
}
else
Expand Down Expand Up @@ -1762,6 +1762,7 @@ private void searchTextBox_KeyDown(object sender, KeyEventArgs e)
e.Handled = true;
break;
case Keys.F2:
case Keys.F3:
toolboxTreeView_KeyDown(sender, e);
break;
case Keys.Return:
Expand Down Expand Up @@ -1853,6 +1854,61 @@ void SelectTreeViewSubjectNode(string subjectName)
}
}

void FindNextTypeMatch(TreeNode typeNode, bool findPrevious)
{
var currentNode = selectionModel.SelectedNodes.FirstOrDefault();
var elementCategory = WorkflowGraphView.GetToolboxElementCategory(typeNode);
Func<ExpressionBuilder, bool> predicate = elementCategory switch
{
~ElementCategory.Workflow => builder => builder.MatchIncludeWorkflow(typeNode.Name),
~ElementCategory.Source => builder => builder.MatchSubjectReference(typeNode.Name),
_ => builder => builder.MatchElementType(typeNode.Name),
};

FindNextMatch(predicate, currentNode?.Value, findPrevious);
}

void FindNextGraphNode(bool findPrevious)
{
var model = selectionModel.SelectedView;
if (!model.GraphView.Focused) return;

var selection = selectionModel.SelectedNodes.ToArray();
if (selection.Length == 0) return;

Func<ExpressionBuilder, bool> predicate;
var currentBuilder = ExpressionBuilder.Unwrap(selection[0].Value);
if (currentBuilder is SubjectExpressionBuilder ||
currentBuilder is SubscribeSubject ||
currentBuilder is MulticastSubject)
{
var subjectName = ((INamedElement)currentBuilder).Name;
predicate = builder => builder.MatchSubjectReference(subjectName);
}
else if (currentBuilder is IncludeWorkflowBuilder includeBuilder)
{
predicate = builder => builder.MatchIncludeWorkflow(includeBuilder.Path);
}
else
{
var workflowElement = ExpressionBuilder.GetWorkflowElement(currentBuilder);
var typeName = workflowElement.GetType().AssemblyQualifiedName;
predicate = builder => builder.MatchElementType(typeName);
}

FindNextMatch(predicate, currentBuilder, findPrevious);
}

void FindNextMatch(Func<ExpressionBuilder, bool> predicate, ExpressionBuilder current, bool findPrevious)
{
var match = workflowBuilder.Find(predicate, current, findPrevious);
if (match != null)
{
var scope = workflowBuilder.GetExpressionScope(match);
HighlightExpression(editorControl.WorkflowGraphView, scope);
}
}

private void toolboxTreeView_KeyDown(object sender, KeyEventArgs e)
{
var selectedNode = toolboxTreeView.SelectedNode;
Expand All @@ -1863,6 +1919,12 @@ private void toolboxTreeView_KeyDown(object sender, KeyEventArgs e)
e.SuppressKeyPress = true;
}

if (e.KeyCode == Keys.F3 && selectedNode?.Tag != null)
{
var findPrevious = e.Modifiers == Keys.Shift;
FindNextTypeMatch(selectedNode, findPrevious);
}

var rename = e.KeyCode == Keys.F2;
var goToDefinition = e.KeyCode == Keys.F12;
if ((rename || goToDefinition) && selectedNode?.Tag != null)
Expand All @@ -1889,8 +1951,8 @@ private void toolboxTreeView_KeyDown(object sender, KeyEventArgs e)
}
else
{
var declaration = workflowBuilder.GetDeclaration(definition.Subject);
HighlightDeclaration(editorControl.WorkflowGraphView, declaration);
var scope = workflowBuilder.GetExpressionScope(definition.Subject);
HighlightExpression(editorControl.WorkflowGraphView, scope);
}
}
}
Expand Down Expand Up @@ -1956,6 +2018,8 @@ private void toolboxTreeView_MouseUp(object sender, MouseEventArgs e)
renameSubjectToolStripMenuItem.Visible = true;
goToDefinitionToolStripMenuItem.Visible = true;
replaceToolStripMenuItem.Visible = true;
findNextToolStripMenuItem.Visible = true;
findPreviousToolStripMenuItem.Visible = true;
}
else
{
Expand Down Expand Up @@ -2042,6 +2106,24 @@ selectedBuilder is SubscribeSubject ||
toolboxTreeView_KeyDown(sender, new KeyEventArgs(Keys.F2));
}

private void findNextToolStripMenuItem_Click(object sender, EventArgs e)
{
if (toolboxTreeView.Focused || searchTextBox.Focused)
{
toolboxTreeView_KeyDown(sender, new KeyEventArgs(findNextToolStripMenuItem.ShortcutKeys));
}
else FindNextGraphNode(findPrevious: false);
}

private void findPreviousToolStripMenuItem_Click(object sender, EventArgs e)
{
if (toolboxTreeView.Focused || searchTextBox.Focused)
{
toolboxTreeView_KeyDown(sender, new KeyEventArgs(findPreviousToolStripMenuItem.ShortcutKeys));
}
else FindNextGraphNode(findPrevious: true);
}

private void goToDefinitionToolStripMenuItem_Click(object sender, EventArgs e)
{
toolboxTreeView_KeyDown(sender, new KeyEventArgs(Keys.F12));
Expand Down Expand Up @@ -2489,6 +2571,8 @@ public void OnKeyDown(KeyEventArgs e)
HandleMenuItemShortcutKeys(e, siteForm.restartToolStripMenuItem, siteForm.restartToolStripMenuItem_Click);
HandleMenuItemShortcutKeys(e, siteForm.stopToolStripMenuItem, siteForm.stopToolStripMenuItem_Click);
HandleMenuItemShortcutKeys(e, siteForm.renameSubjectToolStripMenuItem, siteForm.renameSubjectToolStripMenuItem_Click);
HandleMenuItemShortcutKeys(e, siteForm.findNextToolStripMenuItem, siteForm.findNextToolStripMenuItem_Click);
HandleMenuItemShortcutKeys(e, siteForm.findPreviousToolStripMenuItem, siteForm.findPreviousToolStripMenuItem_Click);
HandleMenuItemShortcutKeys(e, siteForm.docsToolStripMenuItem, siteForm.docsToolStripMenuItem_Click);
}

Expand Down Expand Up @@ -2650,8 +2734,8 @@ public void ShowDefinition(object component)
var definition = siteForm.workflowBuilder.GetSubjectDefinition(model.Workflow, namedElement.Name);
if (definition != null)
{
var declaration = siteForm.workflowBuilder.GetDeclaration(definition.Subject);
siteForm.HighlightDeclaration(siteForm.editorControl.WorkflowGraphView, declaration);
var scope = siteForm.workflowBuilder.GetExpressionScope(definition.Subject);
siteForm.HighlightExpression(siteForm.editorControl.WorkflowGraphView, scope);
return;
}
}
Expand Down
24 changes: 21 additions & 3 deletions Bonsai.Editor/EditorForm.resx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Expand Down Expand Up @@ -503,14 +503,32 @@
IAs32x9Km9FbAOq0VgDxCiBYtpjn+WNJWiFqDb2LA5ZE07atT9N074AiRnbaub8owB8Bqqpac0CGfjgH
8PsoFhM5DWF+CmCBYuZ0w4jqut5NUQDFYhQI0KcA0j5z/czI55Frmuv+OcG6xXKev9koDeFNKMsyz/0Q
aOjyK1i3CKfQFkWxtygATHpPHswSHCZulirUsqyH0rsw5h/GwnbQ7xsxswAAAABJRU5ErkJggg==
</value>
</data>
<data name="findNextToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAACtSURBVDhPrZAxDsMgDEU5Us/AztS152FtDlCpN2FnSm9C
KgGrq49sidLQUpQvfVk4ft8EJUop3XPO1Bp9HvktCbksjtT5VupwSL11KgRDAPY8FHJIQO32FxpfGXtX
7xGdc2SMIa11qd77zxCB9wxoXR+0hWepOKPP6HdhEJsBi3EeCogxniTg7xswHKy1JUDcfYNaLYyKjZX7
MFQHMBzQ489jkpApWARwGh6TUi+094VDG1XAPQAAAABJRU5ErkJggg==
</value>
</data>
<data name="findPreviousToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAACpSURBVDhPtZKxDcMgEEUZKTPQU6XNPLT2AJmFnsrZhERC
tJd8dKcQYmNsy1/6OoHu/QOEqhVjvKSUwsdUOGCfW5Yl8G10pK53Qj0K/5hb/1XDcz43AOq5QuWB0a9a
Ic45MsaQ1jpX7307REAxoGl60DO8csUa+4y1hUZMBizGuiuAT5SBzSeQ61hrc4C4+QaiGkbFxMLLMFQG
MNz3pUtJyC5YBHA3vC6l3rDsg62jiRAoAAAAAElFTkSuQmCC
</value>
</data>
<data name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>1018, 17</value>
</data>
<metadata name="statusContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<data name="statusContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>17, 56</value>
</metadata>
</data>
<data name="propertyGridContextMenuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing">
<value>1127, 17</value>
</data>
Expand Down
Loading