diff --git a/Assets/Fungus/Scripts/Components/Flowchart.cs b/Assets/Fungus/Scripts/Components/Flowchart.cs index 9dcb3b82..b4071dad 100644 --- a/Assets/Fungus/Scripts/Components/Flowchart.cs +++ b/Assets/Fungus/Scripts/Components/Flowchart.cs @@ -1186,7 +1186,18 @@ namespace Fungus var res = gameObject.GetComponents(); selectedBlocks = res.Where(x => x.IsSelected).ToList(); } - + + public void ReverseUpdateSelectedCache() + { + for (int i = 0; i < selectedBlocks.Count; i++) + { + if(selectedBlocks[i] != null) + { + selectedBlocks[i].IsSelected = true; + } + } + } + /// /// Reset the commands and variables in the Flowchart. /// diff --git a/Assets/Fungus/Scripts/Editor/BlockInspector.cs b/Assets/Fungus/Scripts/Editor/BlockInspector.cs index fc064c3b..cacc1d0f 100644 --- a/Assets/Fungus/Scripts/Editor/BlockInspector.cs +++ b/Assets/Fungus/Scripts/Editor/BlockInspector.cs @@ -93,6 +93,12 @@ namespace Fungus.EditorUtils return; } + //if there is no selection but we are drawing, fix that + if (flowchart.SelectedBlocks.Count == 0) + { + flowchart.AddSelectedBlock(block); + } + if (activeBlockEditor == null || !block.Equals(activeBlockEditor.target)) { diff --git a/Assets/Fungus/Scripts/Editor/FlowchartWindow.cs b/Assets/Fungus/Scripts/Editor/FlowchartWindow.cs index 6988869f..c053cd9a 100644 --- a/Assets/Fungus/Scripts/Editor/FlowchartWindow.cs +++ b/Assets/Fungus/Scripts/Editor/FlowchartWindow.cs @@ -264,13 +264,30 @@ namespace Fungus.EditorUtils EditorApplication.update += OnEditorUpdate; Undo.undoRedoPerformed += Undo_ForceRepaint; + +#if UNITY_2017_4_OR_NEWER + EditorApplication.playModeStateChanged += EditorApplication_playModeStateChanged; +#endif } protected virtual void OnDisable() { EditorApplication.update -= OnEditorUpdate; Undo.undoRedoPerformed -= Undo_ForceRepaint; +#if UNITY_2017_4_OR_NEWER + EditorApplication.playModeStateChanged -= EditorApplication_playModeStateChanged; +#endif + } + +#if UNITY_2017_4_OR_NEWER + private void EditorApplication_playModeStateChanged(PlayModeStateChange obj) + { + //force null so it can refresh context on the other side of the context + flowchart = null; + prevFlowchart = null; + blockInspector = null; } +#endif protected void Undo_ForceRepaint() { @@ -336,6 +353,7 @@ namespace Fungus.EditorUtils if (flowchart == null) { blocks = new Block[0]; + filteredBlocks = new Block[0]; } else { @@ -347,6 +365,8 @@ namespace Fungus.EditorUtils protected virtual void OnInspectorUpdate() { + if (HandleFlowchartSelectionChange()) return; + // Ensure the Block Inspector is always showing the currently selected block var flowchart = GetFlowchart(); if (flowchart == null || AnyNullBLocks()) @@ -450,13 +470,22 @@ namespace Fungus.EditorUtils { filterStale = false; //reset all - foreach (var item in filteredBlocks) + for (int i = 0; filteredBlocks != null && i < filteredBlocks.Length; i++) { - item.IsFiltered = false; + if(filteredBlocks[i] != null) + { + filteredBlocks[i].IsFiltered = false; + } + } + + var nullCount = filteredBlocks.Count(x => x == null); + if (nullCount > 0 && nullCount != filteredBlocks.Length) + { + Debug.LogWarning("Null block found in filteredBlocks. May be a symptom of an underlying issue"); } //gather new - filteredBlocks = blocks.Where(block => block.BlockName.ToLower().Contains(searchString.ToLower())).ToArray(); + filteredBlocks = blocks.Where(block => block.BlockName.IndexOf(searchString, StringComparison.OrdinalIgnoreCase) >= 0).ToArray(); //update filteredness foreach (var item in filteredBlocks) @@ -573,9 +602,16 @@ namespace Fungus.EditorUtils { mouseDownSelectionState.AddRange(flowchart.SelectedBlocks); flowchart.ClearSelectedBlocks(); - foreach (var item in mouseDownSelectionState) + for (int i = 0; i < mouseDownSelectionState.Count; i++) { - item.IsControlSelected = true; + if (mouseDownSelectionState[i] != null) + { + mouseDownSelectionState[i].IsControlSelected = true; + } + else + { + Debug.LogWarning("Null block found in mouseDownSelectionState. May be a symptom of an underlying issue"); + } } } @@ -633,7 +669,22 @@ namespace Fungus.EditorUtils blockInspector = null; prevFlowchart = flowchart; executingBlocks.ClearAll(); + + //attempt to defilter previous, if due to scene change these will be null + // the regular filter updates will still occur within UpdateBlockCollection + for (int i = 0; i < filteredBlocks.Length; i++) + { + if (filteredBlocks[i] != null) + { + filteredBlocks[i].IsFiltered = false; + } + } + UpdateBlockCollection(); + + if(flowchart != null) + flowchart.ReverseUpdateSelectedCache();//becomes reverse restore selected cache + Repaint(); return true; }