WindowViewModel.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. using System.Collections.ObjectModel;
  2. using System.Linq;
  3. using Avalonia.Input;
  4. using CommunityToolkit.Mvvm.Input;
  5. using PixiEditor.AvaloniaUI.Models.Commands;
  6. using PixiEditor.AvaloniaUI.ViewModels.Document;
  7. using PixiEditor.AvaloniaUI.Views;
  8. using PixiEditor.AvaloniaUI.Views.Dialogs;
  9. using PixiEditor.AvaloniaUI.Views.Windows;
  10. using PixiEditor.Views.UserControls;
  11. using Command = PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands.Command;
  12. using SettingsWindow = PixiEditor.AvaloniaUI.Views.Windows.Settings.SettingsWindow;
  13. namespace PixiEditor.AvaloniaUI.ViewModels.SubViewModels;
  14. #nullable enable
  15. [Command.Group("PixiEditor.Window", "WINDOWS")]
  16. internal class WindowViewModel : SubViewModel<ViewModelMain>
  17. {
  18. private CommandController commandController;
  19. private ShortcutsPopup? shortcutPopup;
  20. private ShortcutsPopup ShortcutsPopup => shortcutPopup ??= new(commandController);
  21. public RelayCommand<string> ShowAvalonDockWindowCommand { get; set; }
  22. public ObservableCollection<ViewportWindowViewModel> Viewports { get; } = new();
  23. public event EventHandler<ViewportWindowViewModel>? ActiveViewportChanged;
  24. public event Action<ViewportWindowViewModel> ViewportAdded;
  25. public event Action<ViewportWindowViewModel> ViewportClosed;
  26. private object? activeWindow;
  27. public object? ActiveWindow
  28. {
  29. get => activeWindow;
  30. set
  31. {
  32. if (activeWindow == value)
  33. return;
  34. activeWindow = value;
  35. OnPropertyChanged(nameof(ActiveWindow));
  36. if (activeWindow is ViewportWindowViewModel viewport)
  37. ActiveViewportChanged?.Invoke(this, viewport);
  38. }
  39. }
  40. public WindowViewModel(ViewModelMain owner, CommandController commandController)
  41. : base(owner)
  42. {
  43. ShowAvalonDockWindowCommand = new(ShowAvalonDockWindow);
  44. this.commandController = commandController;
  45. }
  46. [Command.Basic("PixiEditor.Window.CreateNewViewport", "NEW_WINDOW_FOR_IMG", "NEW_WINDOW_FOR_IMG", IconPath = "@Images/Plus-square.png", CanExecute = "PixiEditor.HasDocument")]
  47. public void CreateNewViewport()
  48. {
  49. var doc = ViewModelMain.Current?.DocumentManagerSubViewModel.ActiveDocument;
  50. if (doc is null)
  51. return;
  52. CreateNewViewport(doc);
  53. }
  54. [Command.Basic("PixiEditor.Window.CenterActiveViewport", "CENTER_ACTIVE_VIEWPORT", "CENTER_ACTIVE_VIEWPORT", CanExecute = "PixiEditor.HasDocument")]
  55. public void CenterCurrentViewport()
  56. {
  57. if (ActiveWindow is ViewportWindowViewModel viewport)
  58. viewport.CenterViewportTrigger.Execute(this, viewport.Document.SizeBindable);
  59. }
  60. [Command.Basic("PixiEditor.Window.FlipHorizontally", "FLIP_VIEWPORT_HORIZONTALLY", "FLIP_VIEWPORT_HORIZONTALLY", CanExecute = "PixiEditor.HasDocument", IconPath = "FlipHorizontal.png")]
  61. public void FlipViewportHorizontally()
  62. {
  63. if (ActiveWindow is ViewportWindowViewModel viewport)
  64. {
  65. viewport.FlipX = !viewport.FlipX;
  66. }
  67. }
  68. [Command.Basic("PixiEditor.Window.FlipVertically", "FLIP_VIEWPORT_VERTICALLY", "FLIP_VIEWPORT_VERTICALLY", CanExecute = "PixiEditor.HasDocument", IconPath = "FlipVertical.png")]
  69. public void FlipViewportVertically()
  70. {
  71. if (ActiveWindow is ViewportWindowViewModel viewport)
  72. {
  73. viewport.FlipY = !viewport.FlipY;
  74. }
  75. }
  76. public void CreateNewViewport(DocumentViewModel doc)
  77. {
  78. ViewportWindowViewModel newViewport = new ViewportWindowViewModel(this, doc);
  79. Viewports.Add(newViewport);
  80. foreach (var viewport in Viewports.Where(vp => vp.Document == doc))
  81. {
  82. viewport.IndexChanged();
  83. }
  84. ViewportAdded?.Invoke(newViewport);
  85. }
  86. public void MakeDocumentViewportActive(DocumentViewModel? doc)
  87. {
  88. if (doc is null)
  89. {
  90. ActiveWindow = null;
  91. Owner.DocumentManagerSubViewModel.MakeActiveDocumentNull();
  92. return;
  93. }
  94. ActiveWindow = Viewports.Where(viewport => viewport.Document == doc).FirstOrDefault();
  95. }
  96. public string CalculateViewportIndex(ViewportWindowViewModel viewport)
  97. {
  98. ViewportWindowViewModel[] viewports = Viewports.Where(a => a.Document == viewport.Document).ToArray();
  99. if (viewports.Length < 2)
  100. return "";
  101. return $"[{Array.IndexOf(viewports, viewport) + 1}]";
  102. }
  103. public void OnViewportWindowCloseButtonPressed(ViewportWindowViewModel viewport)
  104. {
  105. var viewports = Viewports.Where(vp => vp.Document == viewport.Document).ToArray();
  106. if (viewports.Length == 1)
  107. {
  108. Owner.DisposeDocumentWithSaveConfirmation(viewport.Document);
  109. }
  110. else
  111. {
  112. Viewports.Remove(viewport);
  113. foreach (var sibling in viewports)
  114. {
  115. sibling.IndexChanged();
  116. }
  117. ViewportClosed?.Invoke(viewport);
  118. }
  119. }
  120. public void CloseViewportsForDocument(DocumentViewModel document)
  121. {
  122. var viewports = Viewports.Where(vp => vp.Document == document).ToArray();
  123. foreach (ViewportWindowViewModel viewport in viewports)
  124. {
  125. Viewports.Remove(viewport);
  126. ViewportClosed?.Invoke(viewport);
  127. }
  128. }
  129. [Command.Basic("PixiEditor.Window.OpenSettingsWindow", "OPEN_SETTINGS", "OPEN_SETTINGS_DESCRIPTIVE", Key = Key.OemComma, Modifiers = KeyModifiers.Control)]
  130. public static void OpenSettingsWindow(int page)
  131. {
  132. if (page < 0)
  133. {
  134. page = 0;
  135. }
  136. var settings = new SettingsWindow(page);
  137. settings.Show();
  138. }
  139. [Command.Basic("PixiEditor.Window.OpenStartupWindow", "OPEN_STARTUP_WINDOW", "OPEN_STARTUP_WINDOW")]
  140. public void OpenHelloThereWindow()
  141. {
  142. new HelloTherePopup(Owner.FileSubViewModel).Show(MainWindow.Current);
  143. }
  144. [Command.Basic("PixiEditor.Window.OpenShortcutWindow", "OPEN_SHORTCUT_WINDOW", "OPEN_SHORTCUT_WINDOW", Key = Key.F1)]
  145. public void ShowShortcutWindow()
  146. {
  147. ShortcutsPopup.Show();
  148. ShortcutsPopup.Activate();
  149. }
  150. [Command.Basic("PixiEditor.Window.OpenPalettesBrowserWindow", "OPEN_PALETTE_BROWSER", "OPEN_PALETTE_BROWSER",
  151. IconPath = "Database.png")]
  152. public void ShowPalettesBrowserWindow()
  153. {
  154. PalettesBrowser.Open(Owner.ColorsSubViewModel.PaletteProvider, Owner.ColorsSubViewModel.ImportPaletteCommand,
  155. Owner.DocumentManagerSubViewModel.ActiveDocument?.Palette);
  156. }
  157. [Command.Basic("PixiEditor.Window.OpenAboutWindow", "OPEN_ABOUT_WINDOW", "OPEN_ABOUT_WINDOW")]
  158. public void OpenAboutWindow()
  159. {
  160. new AboutPopup().Show();
  161. }
  162. [Command.Basic("PixiEditor.Window.OpenNavigationWindow", "navigation", "OPEN_NAVIGATION_WINDOW", "OPEN_NAVIGATION_WINDOW")]
  163. public static void ShowAvalonDockWindow(string id)
  164. {
  165. //TODO: Implement this
  166. /*if (MainWindow.Current?.LayoutRoot?.Manager?.Layout == null) return;
  167. var anchorables = new List<LayoutAnchorable>(MainWindow.Current.LayoutRoot.Manager.Layout
  168. .Descendents()
  169. .OfType<LayoutAnchorable>());
  170. foreach (var la in anchorables)
  171. {
  172. if (la.ContentId == id)
  173. {
  174. la.Show();
  175. la.IsActive = true;
  176. }
  177. }*/
  178. }
  179. }