DrawingViewPort.xaml.cs 7.3 KB

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