DrawingViewPort.xaml.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. using PixiEditor.Helpers;
  2. using System;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Input;
  6. namespace PixiEditor.Views.UserControls
  7. {
  8. /// <summary>
  9. /// Interaction logic for DrawingViewPort.xaml.
  10. /// </summary>
  11. public partial class DrawingViewPort : UserControl
  12. {
  13. public static readonly DependencyProperty MiddleMouseClickedCommandProperty =
  14. DependencyProperty.Register(nameof(MiddleMouseClickedCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  15. public static readonly DependencyProperty MouseMoveCommandProperty =
  16. DependencyProperty.Register(nameof(MouseMoveCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  17. public static readonly DependencyProperty MouseDownCommandProperty =
  18. DependencyProperty.Register(nameof(MouseDownCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  19. public static readonly DependencyProperty MouseUpCommandProperty =
  20. DependencyProperty.Register(nameof(MouseUpCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  21. public static readonly DependencyProperty StylusButtonDownCommandProperty =
  22. DependencyProperty.Register(nameof(StylusButtonDownCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  23. public static readonly DependencyProperty StylusGestureCommandProperty =
  24. DependencyProperty.Register(nameof(StylusGestureCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  25. public static readonly DependencyProperty StylusButtonUpCommandProperty =
  26. DependencyProperty.Register(nameof(StylusButtonUpCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  27. public static readonly DependencyProperty StylusOutOfRangeCommandProperty =
  28. DependencyProperty.Register(nameof(StylusOutOfRangeCommand), typeof(ICommand), typeof(DrawingViewPort), new PropertyMetadata(default(ICommand)));
  29. public static readonly DependencyProperty MouseXOnCanvasProperty =
  30. DependencyProperty.Register(nameof(MouseXOnCanvas), typeof(double), typeof(DrawingViewPort), new PropertyMetadata(0.0));
  31. public static readonly DependencyProperty MouseYOnCanvasProperty =
  32. DependencyProperty.Register(nameof(MouseYOnCanvas), typeof(double), typeof(DrawingViewPort), new PropertyMetadata(0.0));
  33. public static readonly DependencyProperty GridLinesVisibleProperty =
  34. DependencyProperty.Register(nameof(GridLinesVisible), typeof(bool), typeof(DrawingViewPort), new PropertyMetadata(false));
  35. public static readonly DependencyProperty IsUsingZoomToolProperty =
  36. DependencyProperty.Register(nameof(IsUsingZoomTool), typeof(bool), typeof(DrawingViewPort), new PropertyMetadata(false, ToolChanged));
  37. public static readonly DependencyProperty IsUsingMoveViewportToolProperty =
  38. DependencyProperty.Register(nameof(IsUsingMoveViewportTool), typeof(bool), typeof(DrawingViewPort), new PropertyMetadata(false, ToolChanged));
  39. public static readonly DependencyProperty CenterViewportTriggerProperty =
  40. DependencyProperty.Register(nameof(CenterViewportTrigger), typeof(ExecutionTrigger<Size>), typeof(DrawingViewPort),
  41. new PropertyMetadata(default(ExecutionTrigger<Size>), CenterViewportTriggerChanged));
  42. public static readonly DependencyProperty ZoomViewportTriggerProperty =
  43. DependencyProperty.Register(nameof(ZoomViewportTrigger), typeof(ExecutionTrigger<double>), typeof(DrawingViewPort),
  44. new PropertyMetadata(default(ExecutionTrigger<double>), ZoomViewportTriggerChanged));
  45. public static readonly DependencyProperty UseTouchGesturesProperty =
  46. DependencyProperty.Register(nameof(UseTouchGestures), typeof(bool), typeof(DrawingViewPort));
  47. public ICommand MiddleMouseClickedCommand
  48. {
  49. get => (ICommand)GetValue(MiddleMouseClickedCommandProperty);
  50. set => SetValue(MiddleMouseClickedCommandProperty, value);
  51. }
  52. public ICommand MouseMoveCommand
  53. {
  54. get => (ICommand)GetValue(MouseMoveCommandProperty);
  55. set => SetValue(MouseMoveCommandProperty, value);
  56. }
  57. public ICommand MouseDownCommand
  58. {
  59. get => (ICommand)GetValue(MouseDownCommandProperty);
  60. set => SetValue(MouseDownCommandProperty, value);
  61. }
  62. public ICommand MouseUpCommand
  63. {
  64. get => (ICommand)GetValue(MouseUpCommandProperty);
  65. set => SetValue(MouseUpCommandProperty, value);
  66. }
  67. public ICommand StylusButtonDownCommand
  68. {
  69. get => (ICommand)GetValue(StylusButtonDownCommandProperty);
  70. set => SetValue(StylusButtonDownCommandProperty, value);
  71. }
  72. public ICommand StylusButtonUpCommand
  73. {
  74. get => (ICommand)GetValue(StylusButtonUpCommandProperty);
  75. set => SetValue(StylusButtonUpCommandProperty, value);
  76. }
  77. public ICommand StylusGestureCommand
  78. {
  79. get => (ICommand)GetValue(StylusGestureCommandProperty);
  80. set => SetValue(StylusGestureCommandProperty, value);
  81. }
  82. public ICommand StylusOutOfRangeCommand
  83. {
  84. get => (ICommand)GetValue(StylusOutOfRangeCommandProperty);
  85. set => SetValue(StylusOutOfRangeCommandProperty, value);
  86. }
  87. public double MouseXOnCanvas
  88. {
  89. get => (double)GetValue(MouseXOnCanvasProperty);
  90. set => SetValue(MouseXOnCanvasProperty, value);
  91. }
  92. public double MouseYOnCanvas
  93. {
  94. get => (double)GetValue(MouseYOnCanvasProperty);
  95. set => SetValue(MouseYOnCanvasProperty, value);
  96. }
  97. public bool GridLinesVisible
  98. {
  99. get => (bool)GetValue(GridLinesVisibleProperty);
  100. set => SetValue(GridLinesVisibleProperty, value);
  101. }
  102. public bool IsUsingZoomTool
  103. {
  104. get => (bool)GetValue(IsUsingZoomToolProperty);
  105. set => SetValue(IsUsingZoomToolProperty, value);
  106. }
  107. public bool IsUsingMoveViewportTool
  108. {
  109. get => (bool)GetValue(IsUsingMoveViewportToolProperty);
  110. set => SetValue(IsUsingMoveViewportToolProperty, value);
  111. }
  112. public bool UseTouchGestures
  113. {
  114. get => (bool)GetValue(UseTouchGesturesProperty);
  115. set => SetValue(UseTouchGesturesProperty, value);
  116. }
  117. public ExecutionTrigger<Size> CenterViewportTrigger
  118. {
  119. get => (ExecutionTrigger<Size>)GetValue(CenterViewportTriggerProperty);
  120. set => SetValue(CenterViewportTriggerProperty, value);
  121. }
  122. public ExecutionTrigger<double> ZoomViewportTrigger
  123. {
  124. get => (ExecutionTrigger<double>)GetValue(ZoomViewportTriggerProperty);
  125. set => SetValue(ZoomViewportTriggerProperty, value);
  126. }
  127. public RelayCommand PreviewMouseDownCommand { get; private set; }
  128. private static void ToolChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
  129. {
  130. var panel = (DrawingViewPort)sender;
  131. if (panel.IsUsingZoomTool)
  132. panel.zoombox.ZoomMode = Zoombox.Mode.ZoomTool;
  133. else if (panel.IsUsingMoveViewportTool)
  134. panel.zoombox.ZoomMode = Zoombox.Mode.MoveTool;
  135. else
  136. panel.zoombox.ZoomMode = Zoombox.Mode.Normal;
  137. }
  138. private static void CenterViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
  139. {
  140. var viewport = (DrawingViewPort)sender;
  141. if (args.OldValue != null)
  142. ((ExecutionTrigger<Size>)args.OldValue).Triggered -= viewport.CenterZoomboxContent;
  143. ((ExecutionTrigger<Size>)args.NewValue).Triggered += viewport.CenterZoomboxContent;
  144. }
  145. private static void ZoomViewportTriggerChanged(DependencyObject sender, DependencyPropertyChangedEventArgs args)
  146. {
  147. var viewport = (DrawingViewPort)sender;
  148. if (args.OldValue != null)
  149. ((ExecutionTrigger<double>)args.OldValue).Triggered -= viewport.ZoomZoomboxContent;
  150. ((ExecutionTrigger<double>)args.NewValue).Triggered += viewport.ZoomZoomboxContent;
  151. }
  152. private bool loaded = false;
  153. public DrawingViewPort()
  154. {
  155. PreviewMouseDownCommand = new RelayCommand(ProcessMouseDown);
  156. InitializeComponent();
  157. }
  158. private void CenterZoomboxContent(object sender, Size args)
  159. {
  160. zoombox.CenterContent(args);
  161. }
  162. private void ZoomZoomboxContent(object sender, double args)
  163. {
  164. zoombox.ZoomIntoCenter(args);
  165. }
  166. private void ProcessMouseDown(object parameter)
  167. {
  168. if (Mouse.MiddleButton == MouseButtonState.Pressed && MiddleMouseClickedCommand.CanExecute(null))
  169. MiddleMouseClickedCommand.Execute(null);
  170. }
  171. private void OnCanvasLoaded(object sender, EventArgs e)
  172. {
  173. if (loaded)
  174. return;
  175. zoombox.CenterContent();
  176. loaded = true;
  177. }
  178. }
  179. }