ToolsViewModel.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. using System.Collections.ObjectModel;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Windows.Input;
  6. using PixiEditor.Helpers;
  7. using PixiEditor.Models.Tools;
  8. using PixiEditor.Models.Tools.Tools;
  9. namespace PixiEditor.ViewModels.SubViewModels.Main
  10. {
  11. public class ToolsViewModel : SubViewModel<ViewModelMain>
  12. {
  13. private Cursor toolCursor;
  14. public RelayCommand SelectToolCommand { get; set; } // Command that handles tool switching.
  15. public RelayCommand ChangeToolSizeCommand { get; set; }
  16. public Tool LastActionTool { get; private set; }
  17. public ObservableCollection<Tool> ToolSet { get; set; }
  18. public Cursor ToolCursor
  19. {
  20. get => toolCursor;
  21. set
  22. {
  23. toolCursor = value;
  24. RaisePropertyChanged("ToolCursor");
  25. }
  26. }
  27. public ToolsViewModel(ViewModelMain owner)
  28. : base(owner)
  29. {
  30. SelectToolCommand = new RelayCommand(SetTool, Owner.DocumentIsNotNull);
  31. ChangeToolSizeCommand = new RelayCommand(ChangeToolSize);
  32. }
  33. public void SetupTools(IServiceProvider services)
  34. {
  35. ToolBuilder builder = new ToolBuilder(services);
  36. builder
  37. .Add<MoveViewportTool>().Add<MoveTool>().Add<PenTool>().Add<SelectTool>().Add<FloodFill>()
  38. .Add<LineTool>().Add<CircleTool>().Add<RectangleTool>().Add<EraserTool>().Add<ColorPickerTool>().Add<BrightnessTool>()
  39. .Add<ZoomTool>();
  40. ToolSet = new(builder.Build());
  41. SetActiveTool<MoveViewportTool>();
  42. }
  43. public void SetActiveTool<T>()
  44. where T : Tool
  45. {
  46. SetActiveTool(typeof(T));
  47. }
  48. public void SetActiveTool(Tool tool)
  49. {
  50. Tool activeTool = ToolSet.FirstOrDefault(x => x.IsActive);
  51. if (activeTool != null)
  52. {
  53. activeTool.IsActive = false;
  54. }
  55. tool.IsActive = true;
  56. LastActionTool = Owner.BitmapManager.SelectedTool;
  57. Owner.BitmapManager.SetActiveTool(tool);
  58. SetToolCursor(tool.GetType());
  59. if (Owner.StylusSubViewModel != null)
  60. {
  61. Owner.StylusSubViewModel.ToolSetByStylus = false;
  62. }
  63. }
  64. public void SetTool(object parameter)
  65. {
  66. if (parameter is Type type)
  67. {
  68. SetActiveTool(type);
  69. return;
  70. }
  71. Tool tool = (Tool)parameter;
  72. SetActiveTool(tool.GetType());
  73. }
  74. private static T CreateTool<T>(IServiceProvider provider)
  75. where T : new()
  76. {
  77. T tool = default;
  78. Type toolType = typeof(T);
  79. foreach (PropertyInfo info in toolType.GetProperties(BindingFlags.Public))
  80. {
  81. if (!info.CanWrite)
  82. {
  83. continue;
  84. }
  85. info.SetValue(tool, provider.GetService(info.PropertyType));
  86. }
  87. return tool;
  88. }
  89. private void ChangeToolSize(object parameter)
  90. {
  91. int increment = (int)parameter;
  92. int newSize = Owner.BitmapManager.ToolSize + increment;
  93. if (newSize > 0)
  94. {
  95. Owner.BitmapManager.ToolSize = newSize;
  96. }
  97. }
  98. private void SetActiveTool(Type toolType)
  99. {
  100. if (toolType == null && toolType.IsAssignableTo(typeof(Tool)))
  101. {
  102. return;
  103. }
  104. Tool foundTool = ToolSet.First(x => x.GetType() == toolType);
  105. SetActiveTool(foundTool);
  106. }
  107. private void SetToolCursor(Type tool)
  108. {
  109. if (tool != null)
  110. {
  111. ToolCursor = Owner.BitmapManager.SelectedTool.Cursor;
  112. }
  113. else
  114. {
  115. ToolCursor = Cursors.Arrow;
  116. }
  117. }
  118. }
  119. }