diff --git a/Bonsai.Editor/EditorForm.cs b/Bonsai.Editor/EditorForm.cs index 48b1a34d..cbaff432 100644 --- a/Bonsai.Editor/EditorForm.cs +++ b/Bonsai.Editor/EditorForm.cs @@ -172,7 +172,6 @@ public EditorForm( definitionsPath = Path.Combine(Path.GetTempPath(), DefinitionsDirectory + "." + GuidHelper.GetProcessGuid().ToString()); editorControl = new WorkflowEditorControl(editorSite); editorControl.Enter += new EventHandler(editorControl_Enter); - editorControl.WorkflowPath = null; editorControl.Dock = DockStyle.Fill; workflowSplitContainer.Panel1.Controls.Add(editorControl); propertyGrid.BrowsableAttributes = browsableAttributes = DesignTimeAttributes; @@ -839,7 +838,7 @@ void ClearWorkflow() ClearWorkflowError(); saveWorkflowDialog.FileName = null; workflowBuilder.Workflow.Clear(); - editorControl.WorkflowPath = null; + editorControl.ResetNavigation(); visualizerSettings.Clear(); ResetProjectStatus(); UpdateTitle(); @@ -871,7 +870,7 @@ bool OpenWorkflow(string fileName, bool setWorkingDirectory) UpdateWorkflowDirectory(fileName, setWorkingDirectory); if (EditorResult == EditorResult.ReloadEditor) return false; - editorControl.WorkflowPath = null; + editorControl.ResetNavigation(); if (workflowBuilder.Workflow.Count > 0 && !editorControl.WorkflowGraphView.GraphView.Nodes.Any()) { try { workflowBuilder.Workflow.Build(); } @@ -885,7 +884,7 @@ bool OpenWorkflow(string fileName, bool setWorkingDirectory) } workflowBuilder = PrepareWorkflow(workflowBuilder, workflowVersion, out bool upgraded); - editorControl.WorkflowPath = null; + editorControl.ResetNavigation(); editorSite.ValidateWorkflow(); var layoutPath = LayoutHelper.GetLayoutPath(fileName); diff --git a/Bonsai.Editor/GraphModel/WorkflowEditor.cs b/Bonsai.Editor/GraphModel/WorkflowEditor.cs index c7fd40b1..dfa57bec 100644 --- a/Bonsai.Editor/GraphModel/WorkflowEditor.cs +++ b/Bonsai.Editor/GraphModel/WorkflowEditor.cs @@ -21,8 +21,8 @@ class WorkflowEditor readonly Subject error; readonly Subject updateLayout; readonly Subject invalidateLayout; + readonly Subject workflowPathChanged; readonly Subject> updateSelection; - readonly Subject closeWorkflowEditor; WorkflowEditorPath workflowPath; public WorkflowEditor(IServiceProvider provider, IGraphView view) @@ -33,9 +33,9 @@ public WorkflowEditor(IServiceProvider provider, IGraphView view) error = new Subject(); updateLayout = new Subject(); invalidateLayout = new Subject(); + workflowPathChanged = new Subject(); updateSelection = new Subject>(); - closeWorkflowEditor = new Subject(); - WorkflowPath = null; + ResetNavigation(); } public ExpressionBuilderGraph Workflow { get; private set; } @@ -45,7 +45,7 @@ public WorkflowEditor(IServiceProvider provider, IGraphView view) public WorkflowEditorPath WorkflowPath { get { return workflowPath; } - set + private set { workflowPath = value; var workflowBuilder = (WorkflowBuilder)serviceProvider.GetService(typeof(WorkflowBuilder)); @@ -66,6 +66,7 @@ public WorkflowEditorPath WorkflowPath IsReadOnly = false; } updateLayout.OnNext(false); + workflowPathChanged.OnNext(workflowPath); } } @@ -75,9 +76,9 @@ public WorkflowEditorPath WorkflowPath public IObservable InvalidateLayout => invalidateLayout; - public IObservable> UpdateSelection => updateSelection; + public IObservable WorkflowPathChanged => workflowPathChanged; - public IObservable CloseWorkflowEditor => closeWorkflowEditor; + public IObservable> UpdateSelection => updateSelection; private static Node FindWorkflowValue(ExpressionBuilderGraph workflow, ExpressionBuilder value) { @@ -1462,14 +1463,6 @@ from successor in workflowNode.Successors addNode(); removeEdge(); }); - - var builder = ExpressionBuilder.Unwrap(workflowNode.Value); - var disableBuilder = builder as DisableBuilder; - var workflowExpressionBuilder = (disableBuilder != null ? disableBuilder.Builder : builder) as IWorkflowExpressionBuilder; - if (workflowExpressionBuilder != null) - { - closeWorkflowEditor.OnNext(workflowExpressionBuilder); - } } public void DeleteGraphNodes(IEnumerable nodes) @@ -2109,6 +2102,11 @@ public void NavigateTo(WorkflowEditorPath path) restoreSelectedNodes(); }); } + + public void ResetNavigation() + { + WorkflowPath = null; + } } enum CreateGraphNodeType diff --git a/Bonsai.Editor/GraphView/WorkflowEditorControl.cs b/Bonsai.Editor/GraphView/WorkflowEditorControl.cs index b3344be6..4b9173e6 100644 --- a/Bonsai.Editor/GraphView/WorkflowEditorControl.cs +++ b/Bonsai.Editor/GraphView/WorkflowEditorControl.cs @@ -54,17 +54,6 @@ public int AnnotationPanelSize } } - public WorkflowEditorPath WorkflowPath - { - get { return WorkflowGraphView.WorkflowPath; } - set { WorkflowGraphView.WorkflowPath = value; } - } - - public ExpressionBuilderGraph Workflow - { - get { return WorkflowGraphView.Workflow; } - } - public void ExpandAnnotationPanel(ExpressionBuilder builder) { annotationPanel.Tag = builder; @@ -153,6 +142,20 @@ public void SelectTab(WorkflowGraphView workflowGraphView) } } + public void ResetNavigation() + { + CloseAll(); + WorkflowGraphView.Editor.ResetNavigation(); + } + + void CloseAll() + { + while (tabControl.TabCount > 1) + { + CloseTab(tabControl.TabPages[1]); + } + } + void CloseTab(TabPage tabPage) { var tabState = (TabPageController)tabPage.Tag; @@ -354,10 +357,7 @@ private void closeToolStripMenuItem_Click(object sender, EventArgs e) private void closeAllToolStripMenuItem_Click(object sender, EventArgs e) { - while (tabControl.TabCount > 1) - { - CloseTab(tabControl.TabPages[1]); - } + CloseAll(); } protected override void ScaleControl(SizeF factor, BoundsSpecified specified) diff --git a/Bonsai.Editor/GraphView/WorkflowGraphView.cs b/Bonsai.Editor/GraphView/WorkflowGraphView.cs index fb59d046..9784d159 100644 --- a/Bonsai.Editor/GraphView/WorkflowGraphView.cs +++ b/Bonsai.Editor/GraphView/WorkflowGraphView.cs @@ -95,12 +95,7 @@ public GraphViewControl GraphView public WorkflowEditorPath WorkflowPath { get { return Editor.WorkflowPath; } - set - { - Editor.WorkflowPath = value; - UpdateSelection(forceUpdate: true); - OnWorkflowPathChanged(EventArgs.Empty); - } + set { Editor.NavigateTo(value); } } public event EventHandler WorkflowPathChanged @@ -537,7 +532,8 @@ private void UpdateGraphLayout(bool validateWorkflow) EditorControl.SelectTab(this); if (EditorControl.AnnotationPanel.Tag is ExpressionBuilder builder) { - if (!EditorControl.Workflow.Descendants().Contains(builder)) + var workflowBuilder = (WorkflowBuilder)serviceProvider.GetService(typeof(WorkflowBuilder)); + if (!workflowBuilder.Workflow.Descendants().Contains(builder)) { EditorControl.AnnotationPanel.NavigateToString(string.Empty); EditorControl.AnnotationPanel.Tag = null; @@ -961,9 +957,15 @@ private void InitializeTheme() private void InitializeViewBindings() { - Editor.Error.Subscribe(ex => uiService.ShowError(ex)); + Editor.Error.Subscribe(uiService.ShowError); Editor.UpdateLayout.Subscribe(UpdateGraphLayout); Editor.InvalidateLayout.Subscribe(InvalidateGraphLayout); + Editor.WorkflowPathChanged.Subscribe(path => + { + UpdateSelection(forceUpdate: true); + OnWorkflowPathChanged(EventArgs.Empty); + }); + Editor.UpdateSelection.Subscribe(selection => { var activeView = graphView; @@ -974,6 +976,7 @@ private void InitializeViewBindings() return selection.Any(builder => ExpressionBuilder.Unwrap(builder) == nodeBuilder); }); }); + Editor.ResetNavigation(); } #endregion