|
@@ -1,8 +1,10 @@
|
|
|
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;
|
|
|
using System.Windows.Input;
|
|
|
|
|
|
namespace PixiEditor.ViewModels.SubViewModels.Main
|
|
@@ -17,10 +19,6 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
|
|
|
|
|
|
public RelayCommand MouseUpCommand { get; set; }
|
|
|
|
|
|
- public RelayCommand KeyDownCommand { get; set; }
|
|
|
-
|
|
|
- public RelayCommand KeyUpCommand { get; set; }
|
|
|
-
|
|
|
private bool restoreToolOnKeyUp = false;
|
|
|
|
|
|
private MouseInputFilter filter = new();
|
|
@@ -33,17 +31,42 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
|
|
|
MouseUpCommand = new RelayCommand(filter.MouseUp);
|
|
|
PreviewMouseMiddleButtonCommand = new RelayCommand(OnPreviewMiddleMouseButton);
|
|
|
GlobalMouseHook.OnMouseUp += filter.MouseUp;
|
|
|
- KeyDownCommand = new RelayCommand(OnKeyDown);
|
|
|
- KeyUpCommand = new RelayCommand(OnKeyUp);
|
|
|
+
|
|
|
+ InputManager.Current.PreProcessInput += Current_PreProcessInput;
|
|
|
|
|
|
filter.OnMouseDown += OnMouseDown;
|
|
|
filter.OnMouseMove += OnMouseMove;
|
|
|
filter.OnMouseUp += OnMouseUp;
|
|
|
}
|
|
|
|
|
|
- private void OnKeyDown(object parameter)
|
|
|
+ private void Current_PreProcessInput(object sender, PreProcessInputEventArgs e)
|
|
|
+ {
|
|
|
+ if (e != null && e.StagingItem != null && e.StagingItem.Input != null)
|
|
|
+ {
|
|
|
+ InputEventArgs inputEvent = e.StagingItem.Input;
|
|
|
+
|
|
|
+ if (inputEvent is KeyboardEventArgs)
|
|
|
+ {
|
|
|
+ KeyboardEventArgs k = inputEvent as KeyboardEventArgs;
|
|
|
+ RoutedEvent r = k.RoutedEvent;
|
|
|
+ KeyEventArgs keyEvent = k as KeyEventArgs;
|
|
|
+
|
|
|
+ if (keyEvent != null && keyEvent?.InputSource?.RootVisual != MainWindow.Current) return;
|
|
|
+ if (r == Keyboard.KeyDownEvent)
|
|
|
+ {
|
|
|
+ OnKeyDown(keyEvent);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (r == Keyboard.KeyUpEvent)
|
|
|
+ {
|
|
|
+ OnKeyUp(keyEvent);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void OnKeyDown(KeyEventArgs args)
|
|
|
{
|
|
|
- KeyEventArgs args = (KeyEventArgs)parameter;
|
|
|
var key = args.Key;
|
|
|
if (key == Key.System)
|
|
|
key = args.SystemKey;
|
|
@@ -55,8 +78,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)
|
|
@@ -71,9 +109,8 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
|
|
|
Owner.ShortcutController.KeyPressed(key, Keyboard.Modifiers);
|
|
|
}
|
|
|
|
|
|
- private void OnKeyUp(object parameter)
|
|
|
+ private void OnKeyUp(KeyEventArgs args)
|
|
|
{
|
|
|
- KeyEventArgs args = (KeyEventArgs)parameter;
|
|
|
var key = args.Key;
|
|
|
if (key == Key.System)
|
|
|
key = args.SystemKey;
|
|
@@ -83,10 +120,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 +149,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 +195,7 @@ namespace PixiEditor.ViewModels.SubViewModels.Main
|
|
|
}
|
|
|
else if (button == MouseButton.Middle)
|
|
|
{
|
|
|
- ChangeMoveViewportToolState(false);
|
|
|
+ ChangeToolState<MoveViewportTool>(false);
|
|
|
}
|
|
|
}
|
|
|
}
|