|
|
|
@ -15,7 +15,7 @@ using System.Reflection;
|
|
|
|
|
|
|
|
|
|
namespace Fungus.EditorUtils |
|
|
|
|
{ |
|
|
|
|
[CustomEditor (typeof(Block))] |
|
|
|
|
[CustomEditor(typeof(Block))] |
|
|
|
|
public class BlockEditor : Editor |
|
|
|
|
{ |
|
|
|
|
protected class SetEventHandlerOperation |
|
|
|
@ -26,11 +26,14 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
protected class AddCommandOperation |
|
|
|
|
{ |
|
|
|
|
public Block block; |
|
|
|
|
public Type commandType; |
|
|
|
|
public int index; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static readonly char[] SPLIT_INPUT_ON = new char[] { ' ', '/', '\\' }; |
|
|
|
|
private static readonly int MAX_PREVIEW_GRID = 7; |
|
|
|
|
private static readonly string ELIPSIS = "..."; |
|
|
|
|
|
|
|
|
|
public static List<Action> actionList = new List<Action>(); |
|
|
|
|
|
|
|
|
|
protected Texture2D upIcon; |
|
|
|
@ -39,6 +42,10 @@ namespace Fungus.EditorUtils
|
|
|
|
|
protected Texture2D duplicateIcon; |
|
|
|
|
protected Texture2D deleteIcon; |
|
|
|
|
|
|
|
|
|
protected string commandTextFieldContents = string.Empty; |
|
|
|
|
protected int filteredCommandPreviewSelectedItem = 0; |
|
|
|
|
protected Type commandSelectedByTextInput; |
|
|
|
|
|
|
|
|
|
static List<System.Type> commandTypes; |
|
|
|
|
static List<System.Type> eventHandlerTypes; |
|
|
|
|
|
|
|
|
@ -280,6 +287,33 @@ namespace Fungus.EditorUtils
|
|
|
|
|
{ |
|
|
|
|
GUILayout.BeginHorizontal(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//handle movement along our selection grid before something else eats our inputs |
|
|
|
|
if (Event.current.type == EventType.keyDown) |
|
|
|
|
{ |
|
|
|
|
//up down to change selection / esc to clear field |
|
|
|
|
if (Event.current.keyCode == KeyCode.UpArrow) |
|
|
|
|
{ |
|
|
|
|
filteredCommandPreviewSelectedItem--; |
|
|
|
|
} |
|
|
|
|
else if (Event.current.keyCode == KeyCode.DownArrow) |
|
|
|
|
{ |
|
|
|
|
filteredCommandPreviewSelectedItem++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (commandSelectedByTextInput != null && |
|
|
|
|
Event.current.keyCode == KeyCode.Return || Event.current.keyCode == KeyCode.KeypadEnter) |
|
|
|
|
{ |
|
|
|
|
AddCommandCallback(commandSelectedByTextInput); |
|
|
|
|
commandSelectedByTextInput = null; |
|
|
|
|
commandTextFieldContents = String.Empty; |
|
|
|
|
//GUI.FocusControl("dummycontrol"); |
|
|
|
|
Event.current.Use(); |
|
|
|
|
filteredCommandPreviewSelectedItem = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Previous Command |
|
|
|
|
if ((Event.current.type == EventType.keyDown) && (Event.current.keyCode == KeyCode.PageUp)) |
|
|
|
|
{ |
|
|
|
@ -308,6 +342,9 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
GUILayout.FlexibleSpace(); |
|
|
|
|
|
|
|
|
|
//should track if text actually changes and pass that to the ShowPartialMatches so it can cache |
|
|
|
|
commandTextFieldContents = GUILayout.TextField(commandTextFieldContents, GUILayout.MinWidth(20), GUILayout.MaxWidth(200)); |
|
|
|
|
|
|
|
|
|
// Add Button |
|
|
|
|
if (GUILayout.Button(addIcon)) |
|
|
|
|
{ |
|
|
|
@ -328,6 +365,85 @@ namespace Fungus.EditorUtils
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GUILayout.EndHorizontal(); |
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(commandTextFieldContents)) |
|
|
|
|
ShowPartialMatches(); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//Handles showing partial matches against the text input next to the AddCommand button |
|
|
|
|
// Splits and matches and can use up down arrows and return/enter/numenter to confirm |
|
|
|
|
// TODO add sorting of results so we get best match at the not just just a match |
|
|
|
|
// e.g. "if" should show Flow/If at the top not Flow/Else If |
|
|
|
|
private void ShowPartialMatches() |
|
|
|
|
{ |
|
|
|
|
var block = target as Block; |
|
|
|
|
|
|
|
|
|
var flowchart = (Flowchart)block.GetFlowchart(); |
|
|
|
|
|
|
|
|
|
//TODO this could be cached if input hasn't changed to avoid thrashing |
|
|
|
|
var filteredAttributes = GetFilteredSupportedCommands(flowchart); |
|
|
|
|
|
|
|
|
|
var upperCommandText = commandTextFieldContents.ToUpper().Trim(); |
|
|
|
|
|
|
|
|
|
if (upperCommandText.Length == 0) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
var tokens = upperCommandText.Split(SPLIT_INPUT_ON); |
|
|
|
|
|
|
|
|
|
//we want commands that have all the elements you have typed |
|
|
|
|
filteredAttributes = filteredAttributes.Where((x) => |
|
|
|
|
{ |
|
|
|
|
bool catAny = tokens.Any(x.Value.Category.ToUpper().Contains); |
|
|
|
|
bool comAny = tokens.Any(x.Value.CommandName.ToUpper().Contains); |
|
|
|
|
bool catAll = tokens.All(x.Value.Category.ToUpper().Contains); |
|
|
|
|
bool comAll = tokens.All(x.Value.CommandName.ToUpper().Contains); |
|
|
|
|
|
|
|
|
|
//so if both category and command found something, then there are multiple tokens and they line up with category and command |
|
|
|
|
if (catAny && comAny) |
|
|
|
|
return true; |
|
|
|
|
//or its a single token or a complex token that matches entirely in cat or com |
|
|
|
|
else if (catAll || comAll) |
|
|
|
|
return true; |
|
|
|
|
//this setup avoids multiple bad suggestions due to a complex category name that gives many false matches on complex partials |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
}).ToList(); |
|
|
|
|
|
|
|
|
|
if (filteredAttributes == null || filteredAttributes.Count == 0) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
//show results |
|
|
|
|
GUILayout.Space(5); |
|
|
|
|
|
|
|
|
|
GUILayout.BeginHorizontal(); |
|
|
|
|
|
|
|
|
|
filteredCommandPreviewSelectedItem = Mathf.Clamp(filteredCommandPreviewSelectedItem, 0, filteredAttributes.Count - 1); |
|
|
|
|
|
|
|
|
|
var toShow = filteredAttributes.Select(x => x.Value.Category + "/" + x.Value.CommandName).ToArray(); |
|
|
|
|
|
|
|
|
|
//show the first x max that match our filters |
|
|
|
|
if(toShow.Length > MAX_PREVIEW_GRID) |
|
|
|
|
{ |
|
|
|
|
toShow = toShow.Take(MAX_PREVIEW_GRID).ToArray(); |
|
|
|
|
toShow[MAX_PREVIEW_GRID - 1] = ELIPSIS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
filteredCommandPreviewSelectedItem = GUILayout.SelectionGrid(filteredCommandPreviewSelectedItem, toShow, 1); |
|
|
|
|
|
|
|
|
|
if (toShow[filteredCommandPreviewSelectedItem] != ELIPSIS) |
|
|
|
|
{ |
|
|
|
|
commandSelectedByTextInput = filteredAttributes[filteredCommandPreviewSelectedItem].Key; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
commandSelectedByTextInput = null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GUILayout.EndHorizontal(); |
|
|
|
|
|
|
|
|
|
GUILayout.Space(5); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected virtual void DrawEventHandlerGUI(Flowchart flowchart) |
|
|
|
@ -539,17 +655,17 @@ namespace Fungus.EditorUtils
|
|
|
|
|
// Dump command info |
|
|
|
|
List<System.Type> menuTypes = EditorExtensions.FindDerivedTypes(typeof(Command)).ToList(); |
|
|
|
|
List<KeyValuePair<System.Type, CommandInfoAttribute>> filteredAttributes = GetFilteredCommandInfoAttribute(menuTypes); |
|
|
|
|
filteredAttributes.Sort( CompareCommandAttributes ); |
|
|
|
|
filteredAttributes.Sort(CompareCommandAttributes); |
|
|
|
|
|
|
|
|
|
// Build list of command categories |
|
|
|
|
List<string> commandCategories = new List<string>(); |
|
|
|
|
foreach(var keyPair in filteredAttributes) |
|
|
|
|
foreach (var keyPair in filteredAttributes) |
|
|
|
|
{ |
|
|
|
|
CommandInfoAttribute info = keyPair.Value; |
|
|
|
|
if (info.Category != "" && |
|
|
|
|
!commandCategories.Contains(info.Category)) |
|
|
|
|
{ |
|
|
|
|
commandCategories.Add (info.Category); |
|
|
|
|
commandCategories.Add(info.Category); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
commandCategories.Sort(); |
|
|
|
@ -560,7 +676,7 @@ namespace Fungus.EditorUtils
|
|
|
|
|
string markdown = "# " + category + " commands # {#" + category.ToLower() + "_commands}\n\n"; |
|
|
|
|
markdown += "[TOC]\n"; |
|
|
|
|
|
|
|
|
|
foreach(var keyPair in filteredAttributes) |
|
|
|
|
foreach (var keyPair in filteredAttributes) |
|
|
|
|
{ |
|
|
|
|
CommandInfoAttribute info = keyPair.Value; |
|
|
|
|
|
|
|
|
@ -629,10 +745,10 @@ namespace Fungus.EditorUtils
|
|
|
|
|
protected static string GetPropertyInfo(System.Type type) |
|
|
|
|
{ |
|
|
|
|
string markdown = ""; |
|
|
|
|
foreach(FieldInfo field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) |
|
|
|
|
foreach (FieldInfo field in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) |
|
|
|
|
{ |
|
|
|
|
TooltipAttribute attribute = (TooltipAttribute)Attribute.GetCustomAttribute(field, typeof(TooltipAttribute)); |
|
|
|
|
if (attribute == null ) |
|
|
|
|
if (attribute == null) |
|
|
|
|
{ |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
@ -641,7 +757,7 @@ namespace Fungus.EditorUtils
|
|
|
|
|
string propertyName = Regex.Replace(field.Name, "(\\B[A-Z])", " $1"); |
|
|
|
|
if (propertyName.Length > 1) |
|
|
|
|
{ |
|
|
|
|
propertyName = propertyName.Substring(0,1).ToUpper() + propertyName.Substring(1); |
|
|
|
|
propertyName = propertyName.Substring(0, 1).ToUpper() + propertyName.Substring(1); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -665,40 +781,16 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
var flowchart = (Flowchart)block.GetFlowchart(); |
|
|
|
|
|
|
|
|
|
// Use index of last selected command in list, or end of list if nothing selected. |
|
|
|
|
int index = -1; |
|
|
|
|
foreach (var command in flowchart.SelectedCommands) |
|
|
|
|
{ |
|
|
|
|
if (command.CommandIndex + 1 > index) |
|
|
|
|
{ |
|
|
|
|
index = command.CommandIndex + 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (index == -1) |
|
|
|
|
{ |
|
|
|
|
index = block.CommandList.Count; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
GenericMenu commandMenu = new GenericMenu(); |
|
|
|
|
|
|
|
|
|
// Build menu list |
|
|
|
|
List<KeyValuePair<System.Type, CommandInfoAttribute>> filteredAttributes = GetFilteredCommandInfoAttribute(commandTypes); |
|
|
|
|
|
|
|
|
|
filteredAttributes.Sort( CompareCommandAttributes ); |
|
|
|
|
var filteredAttributes = GetFilteredSupportedCommands(flowchart); |
|
|
|
|
|
|
|
|
|
foreach(var keyPair in filteredAttributes) |
|
|
|
|
foreach (var keyPair in filteredAttributes) |
|
|
|
|
{ |
|
|
|
|
// Skip command type if the Flowchart doesn't support it |
|
|
|
|
if (!flowchart.IsCommandSupported(keyPair.Value)) |
|
|
|
|
{ |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
AddCommandOperation commandOperation = new AddCommandOperation(); |
|
|
|
|
|
|
|
|
|
commandOperation.block = block; |
|
|
|
|
commandOperation.commandType = keyPair.Key; |
|
|
|
|
commandOperation.index = index; |
|
|
|
|
|
|
|
|
|
GUIContent menuItem; |
|
|
|
|
if (keyPair.Value.Category == "") |
|
|
|
@ -707,7 +799,7 @@ namespace Fungus.EditorUtils
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
menuItem = new GUIContent (keyPair.Value.Category + "/" + keyPair.Value.CommandName); |
|
|
|
|
menuItem = new GUIContent(keyPair.Value.Category + "/" + keyPair.Value.CommandName); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
commandMenu.AddItem(menuItem, false, AddCommandCallback, commandOperation); |
|
|
|
@ -716,7 +808,18 @@ namespace Fungus.EditorUtils
|
|
|
|
|
commandMenu.ShowAsContext(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected static List<KeyValuePair<System.Type,CommandInfoAttribute>> GetFilteredCommandInfoAttribute(List<System.Type> menuTypes) |
|
|
|
|
protected static List<KeyValuePair<System.Type, CommandInfoAttribute>> GetFilteredSupportedCommands(Flowchart flowchart) |
|
|
|
|
{ |
|
|
|
|
List<KeyValuePair<System.Type, CommandInfoAttribute>> filteredAttributes = GetFilteredCommandInfoAttribute(commandTypes); |
|
|
|
|
|
|
|
|
|
filteredAttributes.Sort(CompareCommandAttributes); |
|
|
|
|
|
|
|
|
|
filteredAttributes = filteredAttributes.Where(x => flowchart.IsCommandSupported(x.Value)).ToList(); |
|
|
|
|
|
|
|
|
|
return filteredAttributes; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected static List<KeyValuePair<System.Type, CommandInfoAttribute>> GetFilteredCommandInfoAttribute(List<System.Type> menuTypes) |
|
|
|
|
{ |
|
|
|
|
Dictionary<string, KeyValuePair<System.Type, CommandInfoAttribute>> filteredAttributes = new Dictionary<string, KeyValuePair<System.Type, CommandInfoAttribute>>(); |
|
|
|
|
|
|
|
|
@ -744,14 +847,22 @@ namespace Fungus.EditorUtils
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return filteredAttributes.Values.ToList<KeyValuePair<System.Type,CommandInfoAttribute>>(); |
|
|
|
|
return filteredAttributes.Values.ToList<KeyValuePair<System.Type, CommandInfoAttribute>>(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected static void AddCommandCallback(object obj) |
|
|
|
|
//Used by GenericMenu Delegate |
|
|
|
|
protected void AddCommandCallback(object obj) |
|
|
|
|
{ |
|
|
|
|
AddCommandOperation commandOperation = obj as AddCommandOperation; |
|
|
|
|
if (commandOperation != null) |
|
|
|
|
{ |
|
|
|
|
AddCommandCallback(commandOperation.commandType); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var block = commandOperation.block; |
|
|
|
|
protected void AddCommandCallback(Type commandType) |
|
|
|
|
{ |
|
|
|
|
var block = target as Block; |
|
|
|
|
if (block == null) |
|
|
|
|
{ |
|
|
|
|
return; |
|
|
|
@ -759,9 +870,21 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
var flowchart = (Flowchart)block.GetFlowchart(); |
|
|
|
|
|
|
|
|
|
flowchart.ClearSelectedCommands(); |
|
|
|
|
// Use index of last selected command in list, or end of list if nothing selected. |
|
|
|
|
int index = -1; |
|
|
|
|
foreach (var command in flowchart.SelectedCommands) |
|
|
|
|
{ |
|
|
|
|
if (command.CommandIndex + 1 > index) |
|
|
|
|
{ |
|
|
|
|
index = command.CommandIndex + 1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (index == -1) |
|
|
|
|
{ |
|
|
|
|
index = block.CommandList.Count; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var newCommand = Undo.AddComponent(block.gameObject, commandOperation.commandType) as Command; |
|
|
|
|
var newCommand = Undo.AddComponent(block.gameObject, commandType) as Command; |
|
|
|
|
block.GetFlowchart().AddSelectedCommand(newCommand); |
|
|
|
|
newCommand.ParentBlock = block; |
|
|
|
|
newCommand.ItemId = flowchart.NextItemId(); |
|
|
|
@ -770,9 +893,9 @@ namespace Fungus.EditorUtils
|
|
|
|
|
newCommand.OnCommandAdded(block); |
|
|
|
|
|
|
|
|
|
Undo.RecordObject(block, "Set command type"); |
|
|
|
|
if (commandOperation.index < block.CommandList.Count - 1) |
|
|
|
|
if (index < block.CommandList.Count - 1) |
|
|
|
|
{ |
|
|
|
|
block.CommandList.Insert(commandOperation.index, newCommand); |
|
|
|
|
block.CommandList.Insert(index, newCommand); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
@ -781,6 +904,10 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
// Because this is an async call, we need to force prefab instances to record changes |
|
|
|
|
PrefabUtility.RecordPrefabInstancePropertyModifications(block); |
|
|
|
|
|
|
|
|
|
flowchart.ClearSelectedCommands(); |
|
|
|
|
|
|
|
|
|
commandTextFieldContents = string.Empty; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public virtual void ShowContextMenu() |
|
|
|
@ -823,38 +950,38 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
if (showCut) |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddItem (new GUIContent ("Cut"), false, Cut); |
|
|
|
|
commandMenu.AddItem(new GUIContent("Cut"), false, Cut); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent ("Cut")); |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent("Cut")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (showCopy) |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddItem (new GUIContent ("Copy"), false, Copy); |
|
|
|
|
commandMenu.AddItem(new GUIContent("Copy"), false, Copy); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent ("Copy")); |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent("Copy")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (showPaste) |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddItem (new GUIContent ("Paste"), false, Paste); |
|
|
|
|
commandMenu.AddItem(new GUIContent("Paste"), false, Paste); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent ("Paste")); |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent("Paste")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (showDelete) |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddItem (new GUIContent ("Delete"), false, Delete); |
|
|
|
|
commandMenu.AddItem(new GUIContent("Delete"), false, Delete); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent ("Delete")); |
|
|
|
|
commandMenu.AddDisabledItem(new GUIContent("Delete")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (showPlay) |
|
|
|
@ -865,8 +992,8 @@ namespace Fungus.EditorUtils
|
|
|
|
|
|
|
|
|
|
commandMenu.AddSeparator(""); |
|
|
|
|
|
|
|
|
|
commandMenu.AddItem (new GUIContent ("Select All"), false, SelectAll); |
|
|
|
|
commandMenu.AddItem (new GUIContent ("Select None"), false, SelectNone); |
|
|
|
|
commandMenu.AddItem(new GUIContent("Select All"), false, SelectAll); |
|
|
|
|
commandMenu.AddItem(new GUIContent("Select None"), false, SelectNone); |
|
|
|
|
|
|
|
|
|
commandMenu.ShowAsContext(); |
|
|
|
|
} |
|
|
|
@ -1133,7 +1260,7 @@ namespace Fungus.EditorUtils
|
|
|
|
|
if (firstSelectedIndex > 0) |
|
|
|
|
{ |
|
|
|
|
flowchart.ClearSelectedCommands(); |
|
|
|
|
flowchart.AddSelectedCommand(flowchart.SelectedBlock.CommandList[firstSelectedIndex-1]); |
|
|
|
|
flowchart.AddSelectedCommand(flowchart.SelectedBlock.CommandList[firstSelectedIndex - 1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Repaint(); |
|
|
|
@ -1160,10 +1287,10 @@ namespace Fungus.EditorUtils
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (lastSelectedIndex < flowchart.SelectedBlock.CommandList.Count-1) |
|
|
|
|
if (lastSelectedIndex < flowchart.SelectedBlock.CommandList.Count - 1) |
|
|
|
|
{ |
|
|
|
|
flowchart.ClearSelectedCommands(); |
|
|
|
|
flowchart.AddSelectedCommand(flowchart.SelectedBlock.CommandList[lastSelectedIndex+1]); |
|
|
|
|
flowchart.AddSelectedCommand(flowchart.SelectedBlock.CommandList[lastSelectedIndex + 1]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Repaint(); |
|
|
|
|