IoViewModel.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. using PixiEditor.Helpers;
  2. using PixiEditor.Models.Controllers;
  3. using PixiEditor.Models.Controllers.Shortcuts;
  4. using PixiEditor.Models.Tools.Tools;
  5. using System;
  6. using System.Windows.Input;
  7. namespace PixiEditor.ViewModels.SubViewModels.Main
  8. {
  9. public class IoViewModel : SubViewModel<ViewModelMain>
  10. {
  11. public RelayCommand MouseMoveCommand { get; set; }
  12. public RelayCommand MouseDownCommand { get; set; }
  13. public RelayCommand PreviewMouseMiddleButtonCommand { get; set; }
  14. public RelayCommand MouseUpCommand { get; set; }
  15. public RelayCommand KeyDownCommand { get; set; }
  16. public RelayCommand KeyUpCommand { get; set; }
  17. private bool restoreToolOnKeyUp = false;
  18. private MouseInputFilter filter = new();
  19. public IoViewModel(ViewModelMain owner)
  20. : base(owner)
  21. {
  22. MouseDownCommand = new RelayCommand(filter.MouseDown);
  23. MouseMoveCommand = new RelayCommand(filter.MouseMove);
  24. MouseUpCommand = new RelayCommand(filter.MouseUp);
  25. PreviewMouseMiddleButtonCommand = new RelayCommand(OnPreviewMiddleMouseButton);
  26. GlobalMouseHook.OnMouseUp += filter.MouseUp;
  27. KeyDownCommand = new RelayCommand(OnKeyDown);
  28. KeyUpCommand = new RelayCommand(OnKeyUp);
  29. filter.OnMouseDown += OnMouseDown;
  30. filter.OnMouseMove += OnMouseMove;
  31. filter.OnMouseUp += OnMouseUp;
  32. }
  33. private void OnKeyDown(object parameter)
  34. {
  35. KeyEventArgs args = (KeyEventArgs)parameter;
  36. var key = args.Key;
  37. if (key == Key.System)
  38. key = args.SystemKey;
  39. ProcessShortcutDown(args.IsRepeat, key);
  40. if (Owner.BitmapManager.ActiveDocument != null)
  41. {
  42. Owner.BitmapManager.InputTarget.OnKeyDown(key);
  43. }
  44. if (args.Key == ShortcutController.MoveViewportToolTransientChangeKey)
  45. ChangeMoveViewportToolState(true);
  46. }
  47. private void ProcessShortcutDown(bool isRepeat, Key key)
  48. {
  49. if (isRepeat && !restoreToolOnKeyUp && Owner.ShortcutController.LastShortcut != null &&
  50. Owner.ShortcutController.LastShortcut.Command == Owner.ToolsSubViewModel.SelectToolCommand)
  51. {
  52. restoreToolOnKeyUp = true;
  53. ShortcutController.BlockShortcutExecution = true;
  54. }
  55. Owner.ShortcutController.KeyPressed(key, Keyboard.Modifiers);
  56. }
  57. private void OnKeyUp(object parameter)
  58. {
  59. KeyEventArgs args = (KeyEventArgs)parameter;
  60. var key = args.Key;
  61. if (key == Key.System)
  62. key = args.SystemKey;
  63. ProcessShortcutUp(key);
  64. if (Owner.BitmapManager.ActiveDocument != null)
  65. Owner.BitmapManager.InputTarget.OnKeyUp(key);
  66. if (args.Key == ShortcutController.MoveViewportToolTransientChangeKey)
  67. {
  68. ChangeMoveViewportToolState(false);
  69. }
  70. }
  71. private void ProcessShortcutUp(Key key)
  72. {
  73. if (restoreToolOnKeyUp && Owner.ShortcutController.LastShortcut != null &&
  74. Owner.ShortcutController.LastShortcut.ShortcutKey == key)
  75. {
  76. restoreToolOnKeyUp = false;
  77. Owner.ToolsSubViewModel.SetActiveTool(Owner.ToolsSubViewModel.LastActionTool);
  78. ShortcutController.BlockShortcutExecution = false;
  79. }
  80. }
  81. private void OnMouseDown(object sender, MouseButton button)
  82. {
  83. if (button == MouseButton.Left)
  84. {
  85. BitmapManager bitmapManager = Owner.BitmapManager;
  86. var activeDocument = bitmapManager.ActiveDocument;
  87. if (activeDocument == null)
  88. return;
  89. bitmapManager.InputTarget.OnLeftMouseButtonDown(activeDocument.MouseXOnCanvas, activeDocument.MouseYOnCanvas);
  90. }
  91. }
  92. private void OnPreviewMiddleMouseButton(object sender)
  93. {
  94. ChangeMoveViewportToolState(true);
  95. }
  96. void ChangeMoveViewportToolState(bool setOn)
  97. {
  98. if (setOn)
  99. {
  100. var moveViewportToolIsActive = Owner.ToolsSubViewModel.ActiveTool is MoveViewportTool;
  101. if (!moveViewportToolIsActive)
  102. {
  103. Owner.ToolsSubViewModel.SetActiveTool<MoveViewportTool>();
  104. Owner.ToolsSubViewModel.MoveToolIsTransient = true;
  105. }
  106. }
  107. else if (Owner.ToolsSubViewModel.LastActionTool != null && Owner.ToolsSubViewModel.MoveToolIsTransient)
  108. {
  109. Owner.ToolsSubViewModel.SetActiveTool(Owner.ToolsSubViewModel.LastActionTool);
  110. }
  111. }
  112. private void OnMouseMove(object sender, EventArgs args)
  113. {
  114. var activeDocument = Owner.BitmapManager.ActiveDocument;
  115. if (activeDocument == null)
  116. return;
  117. Owner.BitmapManager.InputTarget.OnMouseMove(activeDocument.MouseXOnCanvas, activeDocument.MouseYOnCanvas);
  118. }
  119. private void OnMouseUp(object sender, MouseButton button)
  120. {
  121. if (Owner.BitmapManager.ActiveDocument == null)
  122. return;
  123. if (button == MouseButton.Left)
  124. {
  125. Owner.BitmapManager.InputTarget.OnLeftMouseButtonUp();
  126. }
  127. else if (button == MouseButton.Middle)
  128. {
  129. ChangeMoveViewportToolState(false);
  130. }
  131. }
  132. }
  133. }