StylusViewModel.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using GalaSoft.MvvmLight.CommandWpf;
  2. using PixiEditor.Models.Tools;
  3. using PixiEditor.Models.Tools.Tools;
  4. using PixiEditor.Models.UserPreferences;
  5. using System.Windows.Input;
  6. using PixiEditor.Models.Commands.Attributes;
  7. namespace PixiEditor.ViewModels.SubViewModels.Main
  8. {
  9. public class StylusViewModel : SubViewModel<ViewModelMain>
  10. {
  11. private bool isPenModeEnabled;
  12. private bool useTouchGestures;
  13. public bool ToolSetByStylus { get; set; }
  14. /// <summary>
  15. /// Gets or sets a value indicating whether touch gestures are enabled even when the MoveViewportTool and ZoomTool are not selected.
  16. /// </summary>
  17. public bool IsPenModeEnabled
  18. {
  19. get => isPenModeEnabled;
  20. set
  21. {
  22. if (SetProperty(ref isPenModeEnabled, value))
  23. {
  24. IPreferences.Current.UpdateLocalPreference(nameof(IsPenModeEnabled), value);
  25. UpdateUseTouchGesture();
  26. }
  27. }
  28. }
  29. public bool UseTouchGestures
  30. {
  31. get => useTouchGestures;
  32. set => SetProperty(ref useTouchGestures, value);
  33. }
  34. private Tool PreviousTool { get; set; }
  35. public RelayCommand<StylusButtonEventArgs> StylusDownCommand { get; }
  36. public RelayCommand<StylusButtonEventArgs> StylusUpCommand { get; }
  37. public RelayCommand<StylusEventArgs> StylusOutOfRangeCommand { get; }
  38. public RelayCommand<StylusSystemGestureEventArgs> StylusGestureCommand { get; }
  39. public StylusViewModel(ViewModelMain owner)
  40. : base(owner)
  41. {
  42. StylusDownCommand = new(StylusDown);
  43. StylusUpCommand = new(StylusUp);
  44. StylusOutOfRangeCommand = new(StylusOutOfRange);
  45. StylusGestureCommand = new(StylusSystemGesture);
  46. isPenModeEnabled = IPreferences.Current.GetLocalPreference<bool>(nameof(IsPenModeEnabled));
  47. Owner.ToolsSubViewModel.AddPropertyChangedCallback(nameof(ToolsViewModel.ActiveTool), UpdateUseTouchGesture);
  48. UpdateUseTouchGesture();
  49. }
  50. [Command.Basic("PixiEditor.Stylus.TogglePenMode", "Toggle Pen Mode", "Toggle Pen Mode")]
  51. public void TogglePenMode()
  52. {
  53. IsPenModeEnabled = !IsPenModeEnabled;
  54. }
  55. private void UpdateUseTouchGesture()
  56. {
  57. if (Owner.ToolsSubViewModel.ActiveTool is not (MoveViewportTool or ZoomTool))
  58. {
  59. UseTouchGestures = IsPenModeEnabled;
  60. }
  61. else
  62. {
  63. UseTouchGestures = true;
  64. }
  65. }
  66. private void StylusOutOfRange(StylusEventArgs e)
  67. {
  68. Owner.BitmapManager.UpdateHighlightIfNecessary(true);
  69. }
  70. private void StylusSystemGesture(StylusSystemGestureEventArgs e)
  71. {
  72. if (e.SystemGesture == SystemGesture.Drag || e.SystemGesture == SystemGesture.Tap)
  73. {
  74. return;
  75. }
  76. e.Handled = true;
  77. }
  78. private void StylusDown(StylusButtonEventArgs e)
  79. {
  80. e.Handled = true;
  81. if (e.StylusButton.Guid == StylusPointProperties.TipButton.Id && e.Inverted)
  82. {
  83. PreviousTool = Owner.ToolsSubViewModel.ActiveTool;
  84. Owner.ToolsSubViewModel.SetActiveTool<EraserTool>();
  85. ToolSetByStylus = true;
  86. }
  87. }
  88. private void StylusUp(StylusButtonEventArgs e)
  89. {
  90. e.Handled = true;
  91. if (ToolSetByStylus && e.StylusButton.Guid == StylusPointProperties.TipButton.Id && e.Inverted)
  92. {
  93. Owner.ToolsSubViewModel.SetActiveTool(PreviousTool);
  94. }
  95. }
  96. }
  97. }