Browse Source

Delete shortcut is no longer handled globally so it doesn't conflict with GUI input

BearishSun 9 years ago
parent
commit
44fd022333

+ 0 - 13
Source/MBansheeEditor/EditorApplication.cs

@@ -296,8 +296,6 @@ namespace BansheeEditor
                 monitor.OnRemoved += OnAssetModified;
                 monitor.OnModified += OnAssetModified;
             }
-
-            EditorVirtualInput.OnButtonUp += OnButtonUp;
         }
 
         /// <summary>
@@ -309,17 +307,6 @@ namespace BansheeEditor
             ProjectLibrary.Refresh(path);
         }
 
-
-        /// <summary>
-        /// Triggered when the user presses a virtual button.
-        /// </summary>
-        /// <param name="btn">Button that was pressed.</param>
-        /// <param name="deviceIdx">Index of the device it was pressed on. </param>
-        private static void OnButtonUp(VirtualButton btn, int deviceIdx)
-        {
-            TriggerGlobalShortcut(btn);
-        }
-
         /// <summary>
         /// Called every frame by the runtime.
         /// </summary>

+ 0 - 1
Source/MBansheeEditor/EditorWindow.cs

@@ -1,7 +1,6 @@
 //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
 //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
 using System;
-using System.Collections.Generic;
 using System.Runtime.CompilerServices;
 using BansheeEngine;
 

+ 35 - 0
Source/MBansheeEditor/HierarchyWindow.cs

@@ -69,11 +69,46 @@ namespace BansheeEditor
 
             treeView = new GUISceneTreeView(GUIOption.FlexibleHeight(20), GUIOption.FlexibleWidth(20));
             scrollArea.Layout.AddElement(treeView);
+
+            EditorVirtualInput.OnButtonUp += OnButtonUp;
         }
 
         private void OnEditorUpdate()
         {
             treeView.Update();
         }
+
+        private void OnDestroy()
+        {
+            EditorVirtualInput.OnButtonUp -= OnButtonUp;
+        }
+
+        /// <summary>
+        /// Triggered when the user presses a virtual button.
+        /// </summary>
+        /// <param name="btn">Button that was pressed.</param>
+        /// <param name="deviceIdx">Index of the device it was pressed on. </param>
+        private void OnButtonUp(VirtualButton btn, int deviceIdx)
+        {
+            if (!HasFocus)
+                return;
+
+            IGlobalShortcuts shortcuts = this;
+
+            if (btn == EditorApplication.CopyKey)
+                shortcuts.OnCopyPressed();
+            else if (btn == EditorApplication.CutKey)
+                shortcuts.OnCutPressed();
+            else if (btn == EditorApplication.PasteKey)
+                shortcuts.OnPastePressed();
+            else if (btn == EditorApplication.DuplicateKey)
+                shortcuts.OnDuplicatePressed();
+            else if (btn == EditorApplication.RenameKey)
+                shortcuts.OnRenamePressed();
+            else if (btn == EditorApplication.DeleteKey)
+                shortcuts.OnDeletePressed();
+            else if(btn == EditorApplication.PasteKey)
+                shortcuts.OnPastePressed();
+        }
     }
 }

+ 15 - 24
Source/MBansheeEditor/Library/LibraryWindow.cs

@@ -233,6 +233,21 @@ namespace BansheeEditor
             {
                 if (!isRenameInProgress)
                 {
+                    IGlobalShortcuts shortcuts = this;
+
+                    if (VirtualInput.IsButtonDown(EditorApplication.CopyKey))
+                        shortcuts.OnCopyPressed();
+                    else if (VirtualInput.IsButtonDown(EditorApplication.CutKey))
+                        shortcuts.OnCutPressed();
+                    else if (VirtualInput.IsButtonDown(EditorApplication.PasteKey))
+                        shortcuts.OnPastePressed();
+                    else if (VirtualInput.IsButtonDown(EditorApplication.DuplicateKey))
+                        shortcuts.OnDuplicatePressed();
+                    else if (VirtualInput.IsButtonDown(EditorApplication.RenameKey))
+                        shortcuts.OnRenamePressed();
+                    else if (VirtualInput.IsButtonDown(EditorApplication.DeleteKey))
+                        shortcuts.OnDeletePressed();
+
                     if (Input.IsButtonDown(ButtonCode.Return))
                     {
                         if (selectionPaths.Count == 1)
@@ -401,60 +416,36 @@ namespace BansheeEditor
         /// <inheritdoc/>
         void IGlobalShortcuts.OnDeletePressed()
         {
-            bool isRenameInProgress = inProgressRenameElement != null;
-            if (isRenameInProgress)
-                return;
-
             DeleteSelection();
         }
 
         /// <inheritdoc/>
         void IGlobalShortcuts.OnRenamePressed()
         {
-            bool isRenameInProgress = inProgressRenameElement != null;
-            if (isRenameInProgress)
-                return;
-
             RenameSelection();
         }
 
         /// <inheritdoc/>
         void IGlobalShortcuts.OnDuplicatePressed()
         {
-            bool isRenameInProgress = inProgressRenameElement != null;
-            if (isRenameInProgress)
-                return;
-
             DuplicateSelection();
         }
 
         /// <inheritdoc/>
         void IGlobalShortcuts.OnCopyPressed()
         {
-            bool isRenameInProgress = inProgressRenameElement != null;
-            if (isRenameInProgress)
-                return;
-
             CopySelection();
         }
 
         /// <inheritdoc/>
         void IGlobalShortcuts.OnCutPressed()
         {
-            bool isRenameInProgress = inProgressRenameElement != null;
-            if (isRenameInProgress)
-                return;
-
             CutSelection();
         }
 
         /// <inheritdoc/>
         void IGlobalShortcuts.OnPastePressed()
         {
-            bool isRenameInProgress = inProgressRenameElement != null;
-            if (isRenameInProgress)
-                return;
-
             PasteToSelection();
         }
 

+ 55 - 0
Source/MBansheeEditor/MenuItems.cs

@@ -115,7 +115,9 @@ namespace BansheeEditor
             if (so == null)
             {
                 so = UndoRedo.CreateSO("BoxCollider", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a BoxCollider component");
@@ -134,7 +136,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("SphereCollider", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a SphereCollider component");
@@ -152,7 +156,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("CapsuleCollider", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a CapsuleCollider component");
@@ -170,7 +176,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("MeshCollider", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a MeshCollider component");
@@ -188,7 +196,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("PlaneCollider", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a PlaneCollider component");
@@ -206,7 +216,9 @@ namespace BansheeEditor
             if (so == null)
             {
                 so = UndoRedo.CreateSO("Rigidbody", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a Rigidbody component");
@@ -224,7 +236,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("CharacterController", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a CharacterController component");
@@ -242,7 +256,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("FixedJoint", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a FixedJoint component");
@@ -260,7 +276,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("DistanceJoint", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a DistanceJoint component");
@@ -278,7 +296,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("HingeJoint", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a HingeJoint component");
@@ -296,7 +316,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("SphericalJoint", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a SphericalJoint component");
@@ -314,7 +336,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("SliderJoint", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a SliderJoint component");
@@ -332,7 +356,9 @@ namespace BansheeEditor
             if (so == null)
             { 
                 so = UndoRedo.CreateSO("D6Joint", "New scene object");
+
                 Selection.SceneObject = so;
+                FocusOnHierarchyOrScene();
             }
 
             UndoRedo.RecordSO(so, false, "Added a D6Joint component");
@@ -350,6 +376,7 @@ namespace BansheeEditor
             SceneObject so = UndoRedo.CreateSO("SceneObject", "New scene object");
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -365,6 +392,7 @@ namespace BansheeEditor
             cam.Main = true;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -379,6 +407,7 @@ namespace BansheeEditor
             so.AddComponent<Renderable>();
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -394,6 +423,7 @@ namespace BansheeEditor
             light.Type = LightType.Point;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -409,6 +439,7 @@ namespace BansheeEditor
             light.Type = LightType.Spot;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -424,6 +455,7 @@ namespace BansheeEditor
             light.Type = LightType.Directional;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -437,6 +469,7 @@ namespace BansheeEditor
             so.AddComponent<GUIWidget>();
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -452,6 +485,7 @@ namespace BansheeEditor
             renderable.Mesh = Builtin.Box;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -467,6 +501,7 @@ namespace BansheeEditor
             renderable.Mesh = Builtin.Sphere;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -482,6 +517,7 @@ namespace BansheeEditor
             renderable.Mesh = Builtin.Cone;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -497,6 +533,7 @@ namespace BansheeEditor
             renderable.Mesh = Builtin.Quad;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -511,6 +548,7 @@ namespace BansheeEditor
             renderable.Mesh = Builtin.Disc;
 
             Selection.SceneObject = so;
+            FocusOnHierarchyOrScene();
             EditorApplication.SetSceneDirty();
         }
 
@@ -601,5 +639,22 @@ namespace BansheeEditor
         {
             EditorApplication.TriggerGlobalShortcut(EditorApplication.DuplicateKey);
         }
+
+        /// <summary>
+        /// Sets keyboard focus to the Hierarchy or Scene windows if open.
+        /// </summary>
+        private static void FocusOnHierarchyOrScene()
+        {
+            HierarchyWindow hierarchyWindow = EditorWindow.GetWindow<HierarchyWindow>();
+            if (hierarchyWindow != null)
+            {
+                hierarchyWindow.HasFocus = true;
+                return;
+            }
+
+            SceneWindow sceneWindow = EditorWindow.GetWindow<SceneWindow>();
+            if (sceneWindow != null)
+                sceneWindow.HasFocus = true;
+        }
     }
 }

+ 35 - 19
Source/MBansheeEditor/Scene/SceneWindow.cs

@@ -293,8 +293,10 @@ namespace BansheeEditor
             sceneAxesGUI = null;
         }
 
-        /// <inheritdoc/>
-        void IGlobalShortcuts.OnDeletePressed()
+        /// <summary>
+        /// Deletes all currently selected objects.
+        /// </summary>
+        private void DeleteSelection()
         {
             SceneObject[] selectedObjects = Selection.SceneObjects;
             CleanDuplicates(ref selectedObjects);
@@ -311,14 +313,10 @@ namespace BansheeEditor
             }
         }
 
-        /// <inheritdoc/>
-        void IGlobalShortcuts.OnRenamePressed()
-        {
-            // Do nothing
-        }
-
-        /// <inheritdoc/>
-        void IGlobalShortcuts.OnDuplicatePressed()
+        /// <summary>
+        /// Duplicates all currently selected objects.
+        /// </summary>
+        private void DuplicateSelection()
         {
             SceneObject[] selectedObjects = Selection.SceneObjects;
             CleanDuplicates(ref selectedObjects);
@@ -336,6 +334,24 @@ namespace BansheeEditor
             }
         }
 
+        /// <inheritdoc/>
+        void IGlobalShortcuts.OnRenamePressed()
+        {
+            // Do nothing
+        }
+
+        /// <inheritdoc/>
+        void IGlobalShortcuts.OnDuplicatePressed()
+        {
+            DuplicateSelection();
+        }
+
+        /// <inheritdoc/>
+        void IGlobalShortcuts.OnDeletePressed()
+        {
+            DeleteSelection();
+        }
+
         /// <inheritdoc/>
         void IGlobalShortcuts.OnCopyPressed()
         {
@@ -429,19 +445,19 @@ namespace BansheeEditor
             {
                 if (!Input.IsPointerButtonHeld(PointerButton.Right))
                 {
-                    if (VirtualInput.IsButtonDown(toggleProfilerOverlayKey))
+                    if (VirtualInput.IsButtonDown(EditorApplication.DuplicateKey))
+                        DuplicateSelection();
+                    else if (VirtualInput.IsButtonDown(EditorApplication.DeleteKey))
+                        DeleteSelection();
+                    else if (VirtualInput.IsButtonDown(toggleProfilerOverlayKey))
                         EditorSettings.SetBool(ProfilerOverlayActiveKey, !EditorSettings.GetBool(ProfilerOverlayActiveKey));
-
-                    if (VirtualInput.IsButtonDown(viewToolKey))
+                    else if(VirtualInput.IsButtonDown(viewToolKey))
                         EditorApplication.ActiveSceneTool = SceneViewTool.View;
-
-                    if (VirtualInput.IsButtonDown(moveToolKey))
+                    else if(VirtualInput.IsButtonDown(moveToolKey))
                         EditorApplication.ActiveSceneTool = SceneViewTool.Move;
-
-                    if (VirtualInput.IsButtonDown(rotateToolKey))
+                    else if(VirtualInput.IsButtonDown(rotateToolKey))
                         EditorApplication.ActiveSceneTool = SceneViewTool.Rotate;
-
-                    if (VirtualInput.IsButtonDown(scaleToolKey))
+                    else if(VirtualInput.IsButtonDown(scaleToolKey))
                         EditorApplication.ActiveSceneTool = SceneViewTool.Scale;
                 }
             }