Jelajahi Sumber

Added custom transient keys

Krzysztof Krysiński 3 tahun lalu
induk
melakukan
6790f3fadd

+ 4 - 2
PixiEditor/Models/Controllers/Shortcuts/ShortcutController.cs

@@ -1,4 +1,6 @@
-using System;
+using PixiEditor.Models.Tools;
+using PixiEditor.Models.Tools.Tools;
+using System;
 using System.Collections.Generic;
 using System.Collections.ObjectModel;
 using System.Linq;
@@ -22,7 +24,7 @@ namespace PixiEditor.Models.Controllers.Shortcuts
 
         public Shortcut LastShortcut { get; private set; }
 
-        public const Key MoveViewportToolTransientChangeKey = Key.Space;
+        public Dictionary<Key, Tool> TransientShortcuts { get; set; } = new Dictionary<Key, Tool>();
 
         public static void BlockShortcutExection(string blocker)
         {

+ 33 - 14
PixiEditor/ViewModels/SubViewModels/Main/IoViewModel.cs

@@ -1,6 +1,7 @@
 using PixiEditor.Helpers;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers.Shortcuts;
+using PixiEditor.Models.Tools;
 using PixiEditor.Models.Tools.Tools;
 using System;
 using System.Windows.Input;
@@ -55,8 +56,23 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
                 Owner.BitmapManager.InputTarget.OnKeyDown(key);
             }
 
-            if (args.Key == ShortcutController.MoveViewportToolTransientChangeKey)
-                ChangeMoveViewportToolState(true);
+            HandleTransientKey(args, true);
+        }
+
+        private void HandleTransientKey(KeyEventArgs args, bool state)
+        {
+            var controller = Owner.ShortcutController;
+
+            Key finalKey = args.Key;
+            if (finalKey == Key.System)
+            {
+                finalKey = args.SystemKey;
+            }
+
+            if (controller.TransientShortcuts.ContainsKey(finalKey))
+            {
+                ChangeToolState(controller.TransientShortcuts[finalKey].GetType(), state);
+            }
         }
 
         private void ProcessShortcutDown(bool isRepeat, Key key)
@@ -83,10 +99,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             if (Owner.BitmapManager.ActiveDocument != null)
                 Owner.BitmapManager.InputTarget.OnKeyUp(key);
 
-            if (args.Key == ShortcutController.MoveViewportToolTransientChangeKey)
-            {
-                ChangeMoveViewportToolState(false);     
-            }
+            HandleTransientKey(args, false);
         }
 
         private void ProcessShortcutUp(Key key)
@@ -115,21 +128,27 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         private void OnPreviewMiddleMouseButton(object sender)
         {
-            ChangeMoveViewportToolState(true);
+            ChangeToolState<MoveViewportTool>(true);
+        }
+
+        private void ChangeToolState<T>(bool setOn)
+            where T : Tool
+        {
+            ChangeToolState(typeof(T), setOn);
         }
 
-        void ChangeMoveViewportToolState(bool setOn)
+        private void ChangeToolState(Type type, bool setOn)
         {
             if (setOn)
             {
-                var moveViewportToolIsActive = Owner.ToolsSubViewModel.ActiveTool is MoveViewportTool;
-                if (!moveViewportToolIsActive)
+                var transientToolIsActive = Owner.ToolsSubViewModel.ActiveTool.GetType() == type;
+                if (!transientToolIsActive)
                 {
-                    Owner.ToolsSubViewModel.SetActiveTool<MoveViewportTool>();
-                    Owner.ToolsSubViewModel.MoveToolIsTransient = true;
+                    Owner.ToolsSubViewModel.SetActiveTool(type);
+                    Owner.ToolsSubViewModel.ActiveToolIsTransient = true;
                 }
             }
-            else if (Owner.ToolsSubViewModel.LastActionTool != null && Owner.ToolsSubViewModel.MoveToolIsTransient)
+            else if (Owner.ToolsSubViewModel.LastActionTool != null && Owner.ToolsSubViewModel.ActiveToolIsTransient)
             {
                 Owner.ToolsSubViewModel.SetActiveTool(Owner.ToolsSubViewModel.LastActionTool);
                 restoreToolOnKeyUp = false;
@@ -155,7 +174,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
             else if (button == MouseButton.Middle)
             {
-                ChangeMoveViewportToolState(false);
+                ChangeToolState<MoveViewportTool>(false);
             }
         }
     }

+ 6 - 5
PixiEditor/ViewModels/SubViewModels/Main/ToolsViewModel.cs

@@ -24,7 +24,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public Tool LastActionTool { get; private set; }
 
-        public bool MoveToolIsTransient { get; set; }
+        public bool ActiveToolIsTransient { get; set; }
 
         public Cursor ToolCursor
         {
@@ -57,7 +57,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
         }
 
-        public IEnumerable<Tool> ToolSet { get; private set; }
+        public List<Tool> ToolSet { get; private set; }
 
         public event EventHandler<SelectedToolEventArgs> SelectedToolChanged;
 
@@ -70,7 +70,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
 
         public void SetupTools(IServiceProvider services)
         {
-            ToolSet = services.GetServices<Tool>();
+            ToolSet = services.GetServices<Tool>().ToList();
             SetActiveTool<PenTool>();
 
             Owner.BitmapManager.BitmapOperations.BitmapChanged += (_, _) => TriggerCacheOutdated();
@@ -94,7 +94,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
         public void SetActiveTool(Tool tool)
         {
             if (ActiveTool == tool) return;
-            MoveToolIsTransient = false;
+            ActiveToolIsTransient = false;
             bool shareToolbar = IPreferences.Current.GetPreference<bool>("EnableSharedToolbar");
             if (ActiveTool != null)
             {
@@ -196,8 +196,9 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
             }
         }
 
-        private void SetActiveTool(Type toolType)
+        public void SetActiveTool(Type toolType)
         {
+            if (!typeof(Tool).IsAssignableFrom(toolType)) { throw new ArgumentException($"'{toolType}' does not inherit from {typeof(Tool)}"); }
             Tool foundTool = ToolSet.First(x => x.GetType() == toolType);
             SetActiveTool(foundTool);
         }

+ 3 - 0
PixiEditor/ViewModels/ViewModelMain.cs

@@ -217,6 +217,9 @@ namespace PixiEditor.ViewModels
                         "Misc",
                         new Shortcut(Key.F1, MiscSubViewModel.OpenShortcutWindowCommand, "Open shortcuts window", true)));
 
+            ShortcutController.TransientShortcuts[Key.Space] = ToolsSubViewModel.ToolSet.First(x => x is MoveViewportTool);
+            ShortcutController.TransientShortcuts[Key.LeftAlt] = ToolsSubViewModel.ToolSet.First(x => x is ColorPickerTool);
+
             BitmapManager.PrimaryColor = ColorsSubViewModel.PrimaryColor;
 
             ToolsSubViewModel?.SetupToolsTooltipShortcuts(services);