From 24b2f4bf77d962d2fd05fe35443f6aabd688016b Mon Sep 17 00:00:00 2001 From: chrisgregan Date: Wed, 25 Feb 2015 16:58:55 +0000 Subject: [PATCH] Added shortcuts for copy, paste, etc. in SequenceEditor #84 --- .../FungusScript/Editor/SequenceEditor.cs | 322 ++++++++++++++---- 1 file changed, 265 insertions(+), 57 deletions(-) diff --git a/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs b/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs index d8629e70..7a0b194c 100644 --- a/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs +++ b/Assets/Fungus/FungusScript/Editor/SequenceEditor.cs @@ -32,69 +32,202 @@ namespace Fungus Sequence sequence = target as Sequence; - SerializedProperty descriptionProp = serializedObject.FindProperty("description"); - EditorGUILayout.PropertyField(descriptionProp); - - SerializedProperty runSlowInEditorProp = serializedObject.FindProperty("runSlowInEditor"); - EditorGUILayout.PropertyField(runSlowInEditorProp); - - DrawEventHandlerGUI(fungusScript); - - UpdateIndentLevels(sequence); - - SerializedProperty sequenceNameProperty = serializedObject.FindProperty("sequenceName"); - Rect sequenceLabelRect = new Rect(45, 5, 120, 16); - EditorGUI.LabelField(sequenceLabelRect, new GUIContent("Sequence Name")); - Rect sequenceNameRect = new Rect(45, 21, 180, 16); - EditorGUI.PropertyField(sequenceNameRect, sequenceNameProperty, new GUIContent("")); - - // Ensure sequence name is unique for this Fungus Script - string uniqueName = fungusScript.GetUniqueSequenceKey(sequenceNameProperty.stringValue, sequence); - if (uniqueName != sequence.sequenceName) + SerializedProperty commandListProperty = serializedObject.FindProperty("commandList"); + + if (sequence == fungusScript.selectedSequence) { - sequenceNameProperty.stringValue = uniqueName; - } + SerializedProperty descriptionProp = serializedObject.FindProperty("description"); + EditorGUILayout.PropertyField(descriptionProp); + + SerializedProperty runSlowInEditorProp = serializedObject.FindProperty("runSlowInEditor"); + EditorGUILayout.PropertyField(runSlowInEditorProp); + + DrawEventHandlerGUI(fungusScript); + + UpdateIndentLevels(sequence); + + SerializedProperty sequenceNameProperty = serializedObject.FindProperty("sequenceName"); + Rect sequenceLabelRect = new Rect(45, 5, 120, 16); + EditorGUI.LabelField(sequenceLabelRect, new GUIContent("Sequence Name")); + Rect sequenceNameRect = new Rect(45, 21, 180, 16); + EditorGUI.PropertyField(sequenceNameRect, sequenceNameProperty, new GUIContent("")); + + // Ensure sequence name is unique for this Fungus Script + string uniqueName = fungusScript.GetUniqueSequenceKey(sequenceNameProperty.stringValue, sequence); + if (uniqueName != sequence.sequenceName) + { + sequenceNameProperty.stringValue = uniqueName; + } + + // Make sure each command has a reference to its parent sequence + foreach (Command command in sequence.commandList) + { + if (command == null) // Will be deleted from the list later on + { + continue; + } + command.parentSequence = sequence; + } - // Make sure each command has a reference to its parent sequence - foreach (Command command in sequence.commandList) - { - if (command == null) // Will be deleted from the list later on + ReorderableListGUI.Title("Commands"); + CommandListAdaptor adaptor = new CommandListAdaptor(commandListProperty, 0); + adaptor.nodeRect = sequence.nodeRect; + + ReorderableListFlags flags = ReorderableListFlags.HideAddButton | ReorderableListFlags.HideRemoveButtons | ReorderableListFlags.DisableContextMenu; + + ReorderableListControl.DrawControlFromState(adaptor, null, flags); + + if (Event.current.type == EventType.ContextClick) { - continue; + ShowContextMenu(); } - command.parentSequence = sequence; - } - SerializedProperty commandListProperty = serializedObject.FindProperty("commandList"); + GUILayout.BeginHorizontal(); - ReorderableListGUI.Title("Commands"); - CommandListAdaptor adaptor = new CommandListAdaptor(commandListProperty, 0); - adaptor.nodeRect = sequence.nodeRect; + // Previous Command + if ((Event.current.type == EventType.keyDown) && (Event.current.keyCode == KeyCode.PageUp)) + { + SelectPrevious(); + GUI.FocusControl("dummycontrol"); + Event.current.Use(); + } + // Next Command + if ((Event.current.type == EventType.keyDown) && (Event.current.keyCode == KeyCode.PageDown)) + { + SelectNext(); + GUI.FocusControl("dummycontrol"); + Event.current.Use(); + } - ReorderableListFlags flags = ReorderableListFlags.HideAddButton | ReorderableListFlags.HideRemoveButtons | ReorderableListFlags.DisableContextMenu; + if (GUIUtility.keyboardControl == 0) //Only call keyboard shortcuts when not typing in a text field + { + Event e = Event.current; - ReorderableListControl.DrawControlFromState(adaptor, null, flags); + // Copy keyboard shortcut + if (e.type == EventType.ValidateCommand && e.commandName == "Copy") + { + if (fungusScript.selectedCommands.Count > 0) + { + e.Use(); + } + } + if (e.type == EventType.ExecuteCommand && e.commandName == "Copy") + { + Copy(); + e.Use(); + } - if (Event.current.type == EventType.ContextClick) - { - ShowContextMenu(); - } + // Cut keyboard shortcut + if (e.type == EventType.ValidateCommand && e.commandName == "Cut") + { + if (fungusScript.selectedCommands.Count > 0) + { + e.Use(); + } + } + if (e.type == EventType.ExecuteCommand && e.commandName == "Cut") + { + Cut(); + e.Use(); + } - if (sequence == fungusScript.selectedSequence) - { - // Show add command button - { - GUILayout.BeginHorizontal(); + // Paste keyboard shortcut + if (e.type == EventType.ValidateCommand && e.commandName == "Paste") + { + CommandCopyBuffer commandCopyBuffer = CommandCopyBuffer.GetInstance(); + if (commandCopyBuffer.HasCommands()) + { + e.Use(); + } + } + if (e.type == EventType.ExecuteCommand && e.commandName == "Paste") + { + Paste(); + e.Use(); + } - GUILayout.FlexibleSpace(); + // Duplicate keyboard shortcut + if (e.type == EventType.ValidateCommand && e.commandName == "Duplicate") + { + if (fungusScript.selectedCommands.Count > 0) + { + e.Use(); + } + } + if (e.type == EventType.ExecuteCommand && e.commandName == "Duplicate") + { + Copy(); + Paste(); + e.Use(); + } + + // Delete keyboard shortcut + if (e.type == EventType.ValidateCommand && e.commandName == "Delete") + { + if (fungusScript.selectedCommands.Count > 0) + { + e.Use(); + } + } + if (e.type == EventType.ExecuteCommand && e.commandName == "Delete") + { + Delete(); + e.Use(); + } - if (GUILayout.Button(FungusEditorResources.texAddButton)) + // SelectAll keyboard shortcut + if (e.type == EventType.ValidateCommand && e.commandName == "SelectAll") { - ShowCommandMenu(); + e.Use(); } + if (e.type == EventType.ExecuteCommand && e.commandName == "SelectAll") + { + SelectAll(); + e.Use(); + } + } + + // Up Button + Texture2D upIcon = Resources.Load("Icons/up") as Texture2D; + if (GUILayout.Button(upIcon)) + { + SelectPrevious(); + } + + // Down Button + Texture2D downIcon = Resources.Load("Icons/down") as Texture2D; + if (GUILayout.Button(downIcon)) + { + SelectNext(); + } + + GUILayout.FlexibleSpace(); - GUILayout.EndHorizontal(); + GUILayout.FlexibleSpace(); + + // Add Button + Texture2D addIcon = Resources.Load("Icons/add") as Texture2D; + if (GUILayout.Button(addIcon)) + { + ShowCommandMenu(); } + + // Duplicate Button + Texture2D duplicateIcon = Resources.Load("Icons/duplicate") as Texture2D; + if (GUILayout.Button(duplicateIcon)) + { + Copy(); + Paste(); + } + + // Delete Button + Texture2D deleteIcon = Resources.Load("Icons/delete") as Texture2D; + if (GUILayout.Button(deleteIcon)) + { + Delete(); + } + + GUILayout.EndHorizontal(); } // Remove any null entries in the command list. @@ -308,7 +441,7 @@ namespace Fungus } // Compare delegate for sorting the list of command attributes - static int CompareCommandAttributes(KeyValuePair x, KeyValuePair y) + protected static int CompareCommandAttributes(KeyValuePair x, KeyValuePair y) { int compare = (x.Value.Category.CompareTo(y.Value.Category)); if (compare == 0) @@ -354,8 +487,8 @@ namespace Fungus commandMenu.ShowAsContext(); } - - List> GetFilteredCommandInfoAttribute(List menuTypes) + + protected static List> GetFilteredCommandInfoAttribute(List menuTypes) { Dictionary> filteredAttributes = new Dictionary>(); @@ -385,8 +518,8 @@ namespace Fungus } return filteredAttributes.Values.ToList>(); } - - void AddCommandCallback(object obj) + + protected static void AddCommandCallback(object obj) { AddCommandOperation commandOperation = obj as AddCommandOperation; @@ -630,7 +763,7 @@ namespace Fungus { return; } - + int lastSelectedIndex = 0; for (int i = fungusScript.selectedSequence.commandList.Count - 1; i >= 0; --i) { Command command = fungusScript.selectedSequence.commandList[i]; @@ -639,11 +772,11 @@ namespace Fungus if (command == selectedCommand) { command.OnCommandRemoved(sequence); - + Undo.RecordObject(fungusScript.selectedSequence, "Delete"); fungusScript.selectedSequence.commandList.RemoveAt(i); Undo.DestroyObjectImmediate(command); - + lastSelectedIndex = i; break; } } @@ -651,9 +784,84 @@ namespace Fungus Undo.RecordObject(fungusScript, "Delete"); fungusScript.ClearSelectedCommands(); - + + if (lastSelectedIndex < fungusScript.selectedSequence.commandList.Count) + { + Command nextCommand = fungusScript.selectedSequence.commandList[lastSelectedIndex]; + sequence.GetFungusScript().AddSelectedCommand(nextCommand); + } + + Repaint(); + } + + protected void SelectPrevious() + { + Sequence sequence = target as Sequence; + FungusScript fungusScript = sequence.GetFungusScript(); + + int firstSelectedIndex = fungusScript.selectedSequence.commandList.Count; + bool firstSelectedCommandFound = false; + if (fungusScript.selectedCommands.Count > 0) + { + for (int i = 0; i < fungusScript.selectedSequence.commandList.Count; i++) + { + Command commandInSequence = fungusScript.selectedSequence.commandList[i]; + + foreach (Command selectedCommand in fungusScript.selectedCommands) + { + if (commandInSequence == selectedCommand) + { + if (!firstSelectedCommandFound) + { + firstSelectedIndex = i; + firstSelectedCommandFound = true; + break; + } + } + } + if (firstSelectedCommandFound) + { + break; + } + } + } + if (firstSelectedIndex > 0) + { + fungusScript.ClearSelectedCommands(); + fungusScript.AddSelectedCommand(fungusScript.selectedSequence.commandList[firstSelectedIndex-1]); + } + + Repaint(); + } + protected void SelectNext() + { + Sequence sequence = target as Sequence; + FungusScript fungusScript = sequence.GetFungusScript(); + + int lastSelectedIndex = -1; + if (fungusScript.selectedCommands.Count > 0) + { + for (int i = 0; i < fungusScript.selectedSequence.commandList.Count; i++) + { + Command commandInSequence = fungusScript.selectedSequence.commandList[i]; + + foreach (Command selectedCommand in fungusScript.selectedCommands) + { + if (commandInSequence == selectedCommand) + { + lastSelectedIndex = i; + } + } + } + } + if (lastSelectedIndex < fungusScript.selectedSequence.commandList.Count-1) + { + fungusScript.ClearSelectedCommands(); + fungusScript.AddSelectedCommand(fungusScript.selectedSequence.commandList[lastSelectedIndex+1]); + } + Repaint(); } } - + } \ No newline at end of file