ServiceCollectionHelpers.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System.Linq;
  2. using System.Reflection;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using PixiEditor.AvaloniaUI.Models.Commands;
  5. using PixiEditor.AvaloniaUI.Models.Controllers;
  6. using PixiEditor.AvaloniaUI.Models.ExtensionServices;
  7. using PixiEditor.AvaloniaUI.Models.Handlers;
  8. using PixiEditor.AvaloniaUI.Models.Handlers.Tools;
  9. using PixiEditor.AvaloniaUI.Models.IO.PaletteParsers;
  10. using PixiEditor.AvaloniaUI.Models.IO.PaletteParsers.JascPalFile;
  11. using PixiEditor.AvaloniaUI.Models.Localization;
  12. using PixiEditor.AvaloniaUI.Models.Palettes;
  13. using PixiEditor.AvaloniaUI.Models.Preferences;
  14. using PixiEditor.AvaloniaUI.ViewModels.Dock;
  15. using PixiEditor.AvaloniaUI.ViewModels.Document;
  16. using PixiEditor.AvaloniaUI.ViewModels.Menu;
  17. using PixiEditor.AvaloniaUI.ViewModels.Menu.MenuBuilders;
  18. using PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
  19. using PixiEditor.AvaloniaUI.ViewModels.SubViewModels.AdditionalContent;
  20. using PixiEditor.AvaloniaUI.ViewModels.Tools.Tools;
  21. using PixiEditor.Extensions.Common.Localization;
  22. using PixiEditor.Extensions.Common.UserPreferences;
  23. using PixiEditor.Extensions.IO;
  24. using PixiEditor.Extensions.LayoutBuilding;
  25. using PixiEditor.Extensions.Palettes;
  26. using PixiEditor.Extensions.Palettes.Parsers;
  27. using PixiEditor.Extensions.Runtime;
  28. using PixiEditor.Extensions.Windowing;
  29. using ViewModelMain = PixiEditor.AvaloniaUI.ViewModels.ViewModelMain;
  30. namespace PixiEditor.AvaloniaUI.Helpers;
  31. internal static class ServiceCollectionHelpers
  32. {
  33. /// <summary>
  34. /// Adds all the services required to fully run PixiEditor's MainWindow
  35. /// </summary>
  36. public static IServiceCollection
  37. AddPixiEditor(this IServiceCollection collection, ExtensionLoader extensionLoader)
  38. {
  39. return collection
  40. .AddSingleton<ViewModelMain>()
  41. .AddSingleton<IPreferences, PreferencesSettings>()
  42. .AddSingleton<ILocalizationProvider, LocalizationProvider>(x => new LocalizationProvider(extensionLoader))
  43. // View Models
  44. .AddSingleton<ToolsViewModel>()
  45. .AddSingleton<IToolsHandler, ToolsViewModel>(x => x.GetRequiredService<ToolsViewModel>())
  46. .AddSingleton<StylusViewModel>()
  47. .AddSingleton<WindowViewModel>()
  48. .AddSingleton<FileViewModel>()
  49. .AddSingleton<UpdateViewModel>()
  50. .AddSingleton<IoViewModel>()
  51. .AddSingleton<LayersViewModel>()
  52. .AddSingleton<ClipboardViewModel>()
  53. .AddSingleton<UndoViewModel>()
  54. .AddSingleton<SelectionViewModel>()
  55. .AddSingleton<ViewOptionsViewModel>()
  56. .AddSingleton<ColorsViewModel>()
  57. .AddSingleton<IColorsHandler, ColorsViewModel>(x => x.GetRequiredService<ColorsViewModel>())
  58. .AddSingleton<RegistryViewModel>()
  59. .AddSingleton(static x => new DiscordViewModel(x.GetService<ViewModelMain>(), "764168193685979138"))
  60. .AddSingleton<DebugViewModel>()
  61. .AddSingleton<SearchViewModel>()
  62. .AddSingleton<ISearchHandler, SearchViewModel>(x => x.GetRequiredService<SearchViewModel>())
  63. .AddSingleton<AdditionalContentViewModel>()
  64. .AddSingleton<LayoutManager>()
  65. .AddSingleton<LayoutViewModel>()
  66. .AddSingleton(x => new ExtensionsViewModel(x.GetService<ViewModelMain>(), extensionLoader))
  67. // Controllers
  68. .AddSingleton<ShortcutController>()
  69. .AddSingleton<CommandController>()
  70. .AddSingleton<DocumentManagerViewModel>()
  71. // Tools
  72. .AddSingleton<IToolHandler, MoveViewportToolViewModel>()
  73. .AddSingleton<IToolHandler, RotateViewportToolViewModel>()
  74. .AddSingleton<IMoveToolHandler, MoveToolViewModel>()
  75. .AddSingleton<IToolHandler, MoveToolViewModel>(x => (MoveToolViewModel)x.GetService<IMoveToolHandler>())
  76. .AddSingleton<IPenToolHandler, PenToolViewModel>()
  77. .AddSingleton<IToolHandler, PenToolViewModel>(x => (PenToolViewModel)x.GetService<IPenToolHandler>())
  78. .AddSingleton<ISelectToolHandler, SelectToolViewModel>()
  79. .AddSingleton<IToolHandler, SelectToolViewModel>(x => (SelectToolViewModel)x.GetService<ISelectToolHandler>())
  80. .AddSingleton<IMagicWandToolHandler, MagicWandToolViewModel>()
  81. .AddSingleton<IToolHandler, MagicWandToolViewModel>(x => (MagicWandToolViewModel)x.GetService<IMagicWandToolHandler>())
  82. .AddSingleton<ILassoToolHandler, LassoToolViewModel>()
  83. .AddSingleton<IToolHandler, LassoToolViewModel>(x => (LassoToolViewModel)x.GetService<ILassoToolHandler>())
  84. .AddSingleton<IFloodFillToolHandler, FloodFillToolViewModel>()
  85. .AddSingleton<IToolHandler, FloodFillToolViewModel>(x => (FloodFillToolViewModel)x.GetService<IFloodFillToolHandler>())
  86. .AddSingleton<ILineToolHandler, LineToolViewModel>()
  87. .AddSingleton<IToolHandler, LineToolViewModel>(x => (LineToolViewModel)x.GetService<ILineToolHandler>())
  88. .AddSingleton<IEllipseToolHandler, EllipseToolViewModel>()
  89. .AddSingleton<IToolHandler, EllipseToolViewModel>(x => (EllipseToolViewModel)x.GetService<IEllipseToolHandler>())
  90. .AddSingleton<IRectangleToolHandler, RectangleToolViewModel>()
  91. .AddSingleton<IToolHandler, RectangleToolViewModel>(x => (RectangleToolViewModel)x.GetService<IRectangleToolHandler>())
  92. .AddSingleton<IEraserToolHandler, EraserToolViewModel>()
  93. .AddSingleton<IToolHandler, EraserToolViewModel>(x => (EraserToolViewModel)x.GetService<IEraserToolHandler>())
  94. .AddSingleton<IColorPickerHandler, ColorPickerToolViewModel>()
  95. .AddSingleton<IToolHandler, ColorPickerToolViewModel>(x => (ColorPickerToolViewModel)x.GetService<IColorPickerHandler>())
  96. .AddSingleton<IBrightnessToolHandler, BrightnessToolViewModel>()
  97. .AddSingleton<IToolHandler, BrightnessToolViewModel>(x => (BrightnessToolViewModel)x.GetService<IBrightnessToolHandler>())
  98. .AddSingleton<IToolHandler, ZoomToolViewModel>()
  99. // Palette Parsers
  100. .AddSingleton<PaletteFileParser, JascFileParser>()
  101. .AddSingleton<PaletteFileParser, ClsFileParser>()
  102. .AddSingleton<PaletteFileParser, DeluxePaintParser>()
  103. .AddSingleton<PaletteFileParser, CorelDrawPalParser>()
  104. .AddSingleton<PaletteFileParser, PngPaletteParser>()
  105. .AddSingleton<PaletteFileParser, PaintNetTxtParser>()
  106. .AddSingleton<PaletteFileParser, HexPaletteParser>()
  107. .AddSingleton<PaletteFileParser, GimpGplParser>()
  108. .AddSingleton<PaletteFileParser, PixiPaletteParser>()
  109. // Palette data sources
  110. .AddSingleton<PaletteListDataSource, LocalPalettesFetcher>()
  111. .AddMenuBuilders();
  112. }
  113. private static IServiceCollection AddMenuBuilders(this IServiceCollection collection)
  114. {
  115. return collection
  116. .AddSingleton<MenuItemBuilder, RecentFilesMenuBuilder>()
  117. .AddSingleton<MenuItemBuilder, FileExitMenuBuilder>()
  118. .AddSingleton<MenuItemBuilder, SymmetryMenuBuilder>()
  119. .AddSingleton<MenuItemBuilder, OpenDockablesMenuBuilder>()
  120. .AddSingleton<MenuItemBuilder, ToggleGridLinesMenuBuilder>();
  121. }
  122. public static IServiceCollection AddExtensionServices(this IServiceCollection collection, ExtensionLoader loader) =>
  123. collection.AddSingleton<IWindowProvider, WindowProvider>(x => new WindowProvider(loader, x))
  124. .AddSingleton<IPaletteProvider, PaletteProvider>()
  125. .AddSingleton<ElementMap>(x =>
  126. {
  127. ElementMap elementMap = new ElementMap();
  128. Assembly[] pixiEditorAssemblies = AppDomain.CurrentDomain.GetAssemblies()
  129. .Where(x => x.FullName.StartsWith("PixiEditor")).ToArray();
  130. foreach (Assembly assembly in pixiEditorAssemblies)
  131. {
  132. elementMap.AddElementsFromAssembly(assembly);
  133. }
  134. return elementMap;
  135. })
  136. .AddSingleton<IFileSystemProvider, FileSystemProvider>();
  137. }