IoViewModel.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Input;
  4. using PixiEditor.Helpers;
  5. using PixiEditor.Models.Controllers.Shortcuts;
  6. using PixiEditor.Models.Position;
  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 KeyDownCommand { get; set; }
  14. public RelayCommand KeyUpCommand { get; set; }
  15. private bool restoreToolOnKeyUp = false;
  16. public IoViewModel(ViewModelMain owner)
  17. : base(owner)
  18. {
  19. MouseMoveCommand = new RelayCommand(MouseMove);
  20. MouseDownCommand = new RelayCommand(MouseDown);
  21. KeyDownCommand = new RelayCommand(KeyDown);
  22. KeyUpCommand = new RelayCommand(KeyUp);
  23. }
  24. public void MouseHook_OnMouseUp(object sender, Point p, MouseButton button)
  25. {
  26. GlobalMouseHook.OnMouseUp -= MouseHook_OnMouseUp;
  27. if (button == MouseButton.Left)
  28. {
  29. Owner.BitmapManager.MouseController.StopRecordingMouseMovementChanges();
  30. }
  31. Owner.BitmapManager.MouseController.MouseUp(new MouseEventArgs(
  32. Mouse.PrimaryDevice,
  33. (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds()));
  34. }
  35. public void KeyDown(object parameter)
  36. {
  37. KeyEventArgs args = (KeyEventArgs)parameter;
  38. if (args.IsRepeat && !restoreToolOnKeyUp && Owner.ShortcutController.LastShortcut != null &&
  39. Owner.ShortcutController.LastShortcut.Command == Owner.ToolsSubViewModel.SelectToolCommand)
  40. {
  41. restoreToolOnKeyUp = true;
  42. ShortcutController.BlockShortcutExecution = true;
  43. }
  44. Owner.ShortcutController.KeyPressed(args.Key, Keyboard.Modifiers);
  45. Owner.BitmapManager.SelectedTool.OnKeyDown(args);
  46. }
  47. private void MouseDown(object parameter)
  48. {
  49. if (Owner.BitmapManager.ActiveDocument == null || Owner.BitmapManager.ActiveDocument.Layers.Count == 0)
  50. {
  51. return;
  52. }
  53. if (Mouse.LeftButton == MouseButtonState.Pressed)
  54. {
  55. if (!Owner.BitmapManager.MouseController.IsRecordingChanges)
  56. {
  57. bool clickedOnCanvas = Owner.BitmapManager.ActiveDocument.MouseXOnCanvas >= 0 &&
  58. Owner.BitmapManager.ActiveDocument.MouseXOnCanvas <= Owner.BitmapManager.ActiveDocument.Width &&
  59. Owner.BitmapManager.ActiveDocument.MouseYOnCanvas >= 0 &&
  60. Owner.BitmapManager.ActiveDocument.MouseYOnCanvas <= Owner.BitmapManager.ActiveDocument.Height;
  61. Owner.BitmapManager.MouseController.StartRecordingMouseMovementChanges(clickedOnCanvas);
  62. Owner.BitmapManager.MouseController.RecordMouseMovementChange(MousePositionConverter.CurrentCoordinates);
  63. }
  64. }
  65. Owner.BitmapManager.MouseController.MouseDown(new MouseEventArgs(
  66. Mouse.PrimaryDevice,
  67. (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds()));
  68. // Mouse down is guaranteed to only be raised from within this application, so by subscribing here we
  69. // only listen for mouse up events that occurred as a result of a mouse down within this application.
  70. // This seems better than maintaining a global listener indefinitely.
  71. GlobalMouseHook.OnMouseUp += MouseHook_OnMouseUp;
  72. }
  73. /// <summary>
  74. /// Method connected with command, it executes tool "activity".
  75. /// </summary>
  76. /// <param name="parameter">CommandParameter.</param>
  77. private void MouseMove(object parameter)
  78. {
  79. if (Owner.BitmapManager.ActiveDocument == null) return;
  80. Coordinates cords = new Coordinates(
  81. (int)Owner.BitmapManager.ActiveDocument.MouseXOnCanvas,
  82. (int)Owner.BitmapManager.ActiveDocument.MouseYOnCanvas);
  83. MousePositionConverter.CurrentCoordinates = cords;
  84. if (Owner.BitmapManager.MouseController.IsRecordingChanges && Mouse.LeftButton == MouseButtonState.Pressed)
  85. {
  86. Owner.BitmapManager.MouseController.RecordMouseMovementChange(cords);
  87. }
  88. Owner.BitmapManager.MouseController.MouseMoved(cords);
  89. }
  90. private void KeyUp(object parameter)
  91. {
  92. KeyEventArgs args = (KeyEventArgs)parameter;
  93. if (restoreToolOnKeyUp && Owner.ShortcutController.LastShortcut != null &&
  94. Owner.ShortcutController.LastShortcut.ShortcutKey == args.Key)
  95. {
  96. restoreToolOnKeyUp = false;
  97. Owner.ToolsSubViewModel.SetActiveTool(Owner.ToolsSubViewModel.LastActionTool);
  98. ShortcutController.BlockShortcutExecution = false;
  99. }
  100. Owner.BitmapManager.SelectedTool.OnKeyUp(args);
  101. }
  102. }
  103. }