ToolSession.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using PixiEditor.Models.Position;
  2. using PixiEditor.Models.Tools;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Windows.Input;
  6. namespace PixiEditor.Models.Controllers
  7. {
  8. public class ToolSession
  9. {
  10. private List<Coordinates> mouseMovement = new();
  11. private bool ended = false;
  12. public IReadOnlyList<Coordinates> MouseMovement => mouseMovement;
  13. public Tool Tool { get; }
  14. public bool IsCtrlDown { get; private set; }
  15. public bool IsShiftDown { get; private set; }
  16. public bool IsAltDown { get; private set; }
  17. public ToolSession(
  18. Tool tool,
  19. double mouseXOnCanvas,
  20. double mouseYOnCanvas,
  21. IReadOnlyDictionary<Key, KeyStates> keyboardStates)
  22. {
  23. if (tool == null)
  24. throw new ArgumentNullException(nameof(tool));
  25. Tool = tool;
  26. Tool.Session = this;
  27. InvokeKeyboardEvents(keyboardStates);
  28. mouseMovement.Add(new((int)Math.Floor(mouseXOnCanvas), (int)Math.Floor(mouseYOnCanvas)));
  29. Tool.BeforeUse();
  30. }
  31. private void InvokeKeyboardEvents(IReadOnlyDictionary<Key, KeyStates> keyboardStates)
  32. {
  33. foreach (var pair in keyboardStates)
  34. {
  35. if (pair.Value == KeyStates.None)
  36. OnKeyUp(pair.Key);
  37. else if (pair.Value == KeyStates.Down)
  38. OnKeyDown(pair.Key);
  39. }
  40. }
  41. public void EndSession(IReadOnlyDictionary<Key, KeyStates> keyboardStates)
  42. {
  43. if (ended)
  44. throw new Exception("Session has ended already");
  45. ended = true;
  46. Tool.AfterUse();
  47. InvokeReleaseKeyboardEvents(keyboardStates);
  48. Tool.Session = null;
  49. }
  50. private void InvokeReleaseKeyboardEvents(IReadOnlyDictionary<Key, KeyStates> keyboardStates)
  51. {
  52. foreach (var pair in keyboardStates)
  53. {
  54. if (pair.Value == KeyStates.Down)
  55. OnKeyUp(pair.Key);
  56. }
  57. }
  58. public void OnKeyDown(Key key)
  59. {
  60. if (key == Key.LeftCtrl)
  61. IsCtrlDown = true;
  62. else if (key == Key.LeftShift)
  63. IsShiftDown = true;
  64. else if (key == Key.LeftAlt)
  65. IsAltDown = true;
  66. Tool.OnKeyDown(key);
  67. }
  68. public void OnKeyUp(Key key)
  69. {
  70. if (key == Key.LeftCtrl)
  71. IsCtrlDown = false;
  72. else if (key == Key.LeftShift)
  73. IsShiftDown = false;
  74. else if (key == Key.LeftAlt)
  75. IsAltDown = false;
  76. Tool.OnKeyUp(key);
  77. }
  78. public void OnPixelPositionChange(Coordinates pos)
  79. {
  80. mouseMovement.Add(pos);
  81. }
  82. }
  83. }