FunctionsMapper.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. using Avalonia;
  2. using Avalonia.Controls.ApplicationLifetimes;
  3. using Avalonia.Threading;
  4. using PicView.Avalonia.Clipboard;
  5. using PicView.Avalonia.ColorManagement;
  6. using PicView.Avalonia.Crop;
  7. using PicView.Avalonia.FileSystem;
  8. using PicView.Avalonia.Gallery;
  9. using PicView.Avalonia.ImageHandling;
  10. using PicView.Avalonia.ImageTransformations.Rotation;
  11. using PicView.Avalonia.Navigation;
  12. using PicView.Avalonia.SettingsManagement;
  13. using PicView.Avalonia.UI;
  14. using PicView.Avalonia.ViewModels;
  15. using PicView.Avalonia.WindowBehavior;
  16. using PicView.Core.FileHistory;
  17. using PicView.Core.FileSorting;
  18. using PicView.Core.ImageDecoding;
  19. using PicView.Core.Keybindings;
  20. using PicView.Core.ProcessHandling;
  21. namespace PicView.Avalonia.Functions;
  22. /// <summary>
  23. /// Used to map functions to their names, used for keyboard shortcuts
  24. /// </summary>
  25. public static class FunctionsMapper
  26. {
  27. public static MainViewModel? Vm;
  28. public static Task<Func<Task>> GetFunctionByName(string functionName)
  29. {
  30. // Remember to have exact matching names, or it will be null
  31. return Task.FromResult<Func<Task>>(functionName switch
  32. {
  33. // Navigation values
  34. "Next" => Next,
  35. "Prev" => Prev,
  36. "NextFolder" => NextFolder,
  37. "PrevFolder" => PrevFolder,
  38. "Up" => Up,
  39. "Down" => Down,
  40. "Last" => Last,
  41. "First" => First,
  42. "Next10" => Next10,
  43. "Prev10" => Prev10,
  44. "Next100" => Next100,
  45. "Prev100" => Prev100,
  46. // Rotate
  47. "RotateLeft" => RotateLeft,
  48. "RotateRight" => RotateRight,
  49. // Scroll
  50. "ScrollUp" => ScrollUp,
  51. "ScrollDown" => ScrollDown,
  52. "ScrollToTop" => ScrollToTop,
  53. "ScrollToBottom" => ScrollToBottom,
  54. // Zoom
  55. "ZoomIn" => ZoomIn,
  56. "ZoomOut" => ZoomOut,
  57. "ResetZoom" => ResetZoom,
  58. "ChangeCtrlZoom" => ChangeCtrlZoom,
  59. // Toggles
  60. "ToggleScroll" => ToggleScroll,
  61. "ToggleLooping" => ToggleLooping,
  62. "ToggleGallery" => ToggleGallery,
  63. // Scale Window
  64. "AutoFitWindow" => AutoFitWindow,
  65. "AutoFitWindowAndStretch" => AutoFitWindowAndStretch,
  66. "NormalWindow" => NormalWindow,
  67. "NormalWindowAndStretch" => NormalWindowAndStretch,
  68. // Window functions
  69. "Fullscreen" => Fullscreen,
  70. "ToggleFullscreen" => ToggleFullscreen,
  71. "SetTopMost" => SetTopMost,
  72. "Close" => Close,
  73. "ToggleInterface" => ToggleInterface,
  74. "NewWindow" => NewWindow,
  75. "Center" => Center,
  76. "Maximize" => Maximize,
  77. "Restore" => Restore,
  78. // Windows
  79. "AboutWindow" => AboutWindow,
  80. "EffectsWindow" => EffectsWindow,
  81. "ImageInfoWindow" => ImageInfoWindow,
  82. "ResizeWindow" => ResizeWindow,
  83. "SettingsWindow" => SettingsWindow,
  84. "KeybindingsWindow" => KeybindingsWindow,
  85. "BatchResizeWindow" => BatchResizeWindow,
  86. // Open functions
  87. "Open" => Open,
  88. "OpenWith" => OpenWith,
  89. "OpenInExplorer" => OpenInExplorer,
  90. "Save" => Save,
  91. "SaveAs" => SaveAs,
  92. "Print" => Print,
  93. "Reload" => Reload,
  94. // Copy functions
  95. "CopyFile" => CopyFile,
  96. "CopyFilePath" => CopyFilePath,
  97. "CopyImage" => CopyImage,
  98. "CopyBase64" => CopyBase64,
  99. "DuplicateFile" => DuplicateFile,
  100. "CutFile" => CutFile,
  101. "Paste" => Paste,
  102. // File functions
  103. "DeleteFile" => DeleteFile,
  104. "DeleteFilePermanently" => DeleteFilePermanently,
  105. "Rename" => Rename,
  106. "ShowFileProperties" => ShowFileProperties,
  107. "ShowSettingsFile" => ShowSettingsFile,
  108. "ShowKeybindingsFile" => ShowKeybindingsFile,
  109. // Image functions
  110. "ResizeImage" => ResizeImage,
  111. "Crop" => Crop,
  112. "Flip" => Flip,
  113. "OptimizeImage" => OptimizeImage,
  114. "Stretch" => Stretch,
  115. // Set stars
  116. "Set0Star" => Set0Star,
  117. "Set1Star" => Set1Star,
  118. "Set2Star" => Set2Star,
  119. "Set3Star" => Set3Star,
  120. "Set4Star" => Set4Star,
  121. "Set5Star" => Set5Star,
  122. // Background and lock screen image
  123. "SetAsLockScreen" => SetAsLockScreen,
  124. "SetAsLockscreenCentered" => SetAsLockscreenCentered,
  125. "SetAsWallpaper" => SetAsWallpaper,
  126. "SetAsWallpaperFitted" => SetAsWallpaperFitted,
  127. "SetAsWallpaperStretched" => SetAsWallpaperStretched,
  128. "SetAsWallpaperFilled" => SetAsWallpaperFilled,
  129. "SetAsWallpaperCentered" => SetAsWallpaperCentered,
  130. "SetAsWallpaperTiled" => SetAsWallpaperTiled,
  131. // Misc
  132. "ChangeBackground" => ChangeBackground,
  133. "SideBySide" => SideBySide,
  134. "GalleryClick" => GalleryClick,
  135. "Slideshow" => Slideshow,
  136. "ColorPicker" => ColorPicker,
  137. "Restart" => Restart,
  138. _ => null
  139. });
  140. }
  141. #region Functions
  142. #region Menus
  143. public static Task CloseMenus()
  144. {
  145. if (Vm is null)
  146. {
  147. return Task.CompletedTask;
  148. }
  149. MenuManager.CloseMenus(Vm);
  150. return Task.CompletedTask;
  151. }
  152. public static Task ToggleFileMenu()
  153. {
  154. if (Vm is null)
  155. {
  156. return Task.CompletedTask;
  157. }
  158. MenuManager.ToggleFileMenu(Vm);
  159. return Task.CompletedTask;
  160. }
  161. public static Task ToggleImageMenu()
  162. {
  163. if (Vm is null)
  164. {
  165. return Task.CompletedTask;
  166. }
  167. MenuManager.ToggleImageMenu(Vm);
  168. return Task.CompletedTask;
  169. }
  170. public static Task ToggleSettingsMenu()
  171. {
  172. if (Vm is null)
  173. {
  174. return Task.CompletedTask;
  175. }
  176. MenuManager.ToggleSettingsMenu(Vm);
  177. return Task.CompletedTask;
  178. }
  179. public static Task ToggleToolsMenu()
  180. {
  181. if (Vm is null)
  182. {
  183. return Task.CompletedTask;
  184. }
  185. MenuManager.ToggleToolsMenu(Vm);
  186. return Task.CompletedTask;
  187. }
  188. #endregion Menus
  189. #region Navigation, zoom and rotation
  190. /// <inheritdoc cref="NavigationManager.Iterate(bool, MainViewModel)" />
  191. public static async Task Next() =>
  192. await NavigationManager.Iterate(next: true, Vm).ConfigureAwait(false);
  193. /// <inheritdoc cref="NavigationManager.NavigateBetweenDirectories(bool, MainViewModel)" />
  194. public static async Task NextFolder() =>
  195. await NavigationManager.NavigateBetweenDirectories(true, Vm).ConfigureAwait(false);
  196. /// <inheritdoc cref="NavigationManager.NavigateFirstOrLast(bool, MainViewModel)" />
  197. public static async Task Last() =>
  198. await NavigationManager.NavigateFirstOrLast(last: true, Vm).ConfigureAwait(false);
  199. /// <inheritdoc cref="NavigationManager.Iterate(bool, MainViewModel)" />
  200. public static async Task Prev() =>
  201. await NavigationManager.Iterate(next: false, Vm).ConfigureAwait(false);
  202. /// <inheritdoc cref="NavigationManager.NavigateBetweenDirectories(bool, MainViewModel)" />
  203. public static async Task PrevFolder() =>
  204. await NavigationManager.NavigateBetweenDirectories(false, Vm).ConfigureAwait(false);
  205. /// <inheritdoc cref="NavigationManager.NavigateFirstOrLast(bool, MainViewModel)" />
  206. public static async Task First() =>
  207. await NavigationManager.NavigateFirstOrLast(last: false, Vm).ConfigureAwait(false);
  208. /// <inheritdoc cref="NavigationManager.Next10(MainViewModel)" />
  209. public static async Task Next10() =>
  210. await NavigationManager.Next10(Vm).ConfigureAwait(false);
  211. /// <inheritdoc cref="NavigationManager.Next100(MainViewModel)" />
  212. public static async Task Next100() =>
  213. await NavigationManager.Next100(Vm).ConfigureAwait(false);
  214. /// <inheritdoc cref="NavigationManager.Prev10(MainViewModel)" />
  215. public static async Task Prev10() =>
  216. await NavigationManager.Prev10(Vm).ConfigureAwait(false);
  217. /// <inheritdoc cref="NavigationManager.Prev100(MainViewModel)" />
  218. public static async Task Prev100() =>
  219. await NavigationManager.Prev100(Vm).ConfigureAwait(false);
  220. /// <inheritdoc cref="RotationNaRotationNavigationp(MainViewModel)" />
  221. public static async Task Up() =>
  222. await RotationNavigation.NavigateUp(Vm).ConfigureAwait(false);
  223. /// <inheritdoc cref="RotationNavigation.RotateRight(MainViewModel)" />
  224. public static async Task RotateRight() =>
  225. await RotationNavigation.RotateRight(Vm).ConfigureAwait(false);
  226. /// <inheritdoc cref="RotationNavigation.RotateLeft(MainViewModel)" />
  227. public static async Task RotateLeft() =>
  228. await RotationNavigation.RotateLeft(Vm).ConfigureAwait(false);
  229. /// <inheritdoc cref="RotationNavigation.NavigateDown(MainViewModel)" />
  230. public static async Task Down() =>
  231. await RotationNavigation.NavigateDown(Vm).ConfigureAwait(false);
  232. public static async Task ScrollDown()
  233. {
  234. // TODO: ImageViewer Needs refactor
  235. await Dispatcher.UIThread.InvokeAsync(() =>
  236. {
  237. Vm.ImageViewer.ImageScrollViewer.LineDown();
  238. });
  239. }
  240. public static async Task ScrollUp()
  241. {
  242. // TODO: ImageViewer Needs refactor
  243. await Dispatcher.UIThread.InvokeAsync(() =>
  244. {
  245. Vm.ImageViewer.ImageScrollViewer.LineUp();
  246. });
  247. }
  248. public static async Task ScrollToTop()
  249. {
  250. // TODO: ImageViewer Needs refactor
  251. await Dispatcher.UIThread.InvokeAsync(() =>
  252. {
  253. Vm.ImageViewer.ImageScrollViewer.ScrollToHome();
  254. });
  255. }
  256. public static async Task ScrollToBottom()
  257. {
  258. // TODO: ImageViewer Needs refactor
  259. await Dispatcher.UIThread.InvokeAsync(() =>
  260. {
  261. Vm.ImageViewer.ImageScrollViewer.ScrollToEnd();
  262. });
  263. }
  264. public static async Task ZoomIn()
  265. {
  266. // TODO: ImageViewer Needs refactor
  267. if (Vm is null)
  268. {
  269. return;
  270. }
  271. await Dispatcher.UIThread.InvokeAsync(Vm.ImageViewer.ZoomIn);
  272. }
  273. public static async Task ZoomOut()
  274. {
  275. // TODO: ImageViewer Needs refactor
  276. if (Vm is null)
  277. {
  278. return;
  279. }
  280. await Dispatcher.UIThread.InvokeAsync(Vm.ImageViewer.ZoomOut);
  281. }
  282. public static async Task ResetZoom()
  283. {
  284. // TODO: ImageViewer Needs refactor
  285. if (Vm is null)
  286. {
  287. return;
  288. }
  289. await Dispatcher.UIThread.InvokeAsync(() => Vm.ImageViewer.ResetZoom(true));
  290. }
  291. #endregion
  292. #region Toggle UI functions
  293. /// <inheritdoc cref="SettingsUpdater.ToggleScroll(MainViewModel)" />
  294. public static async Task ToggleScroll() =>
  295. await SettingsUpdater.ToggleScroll(Vm).ConfigureAwait(false);
  296. /// <inheritdoc cref="SettingsUpdater.ToggleCtrlZoom(MainViewModel)" />
  297. public static async Task ChangeCtrlZoom() =>
  298. await SettingsUpdater.ToggleCtrlZoom(Vm).ConfigureAwait(false);
  299. /// <inheritdoc cref="SettingsUpdater.ToggleLooping(MainViewModel)" />
  300. public static async Task ToggleLooping() =>
  301. await SettingsUpdater.ToggleLooping(Vm).ConfigureAwait(false);
  302. /// <inheritdoc cref="HideInterfaceLogic.ToggleUI(MainViewModel)" />
  303. public static async Task ToggleInterface() =>
  304. await HideInterfaceLogic.ToggleUI(Vm).ConfigureAwait(false);
  305. /// <inheritdoc cref="SettingsUpdater.ToggleSubdirectories(MainViewModel)" />
  306. public static async Task ToggleSubdirectories() =>
  307. await SettingsUpdater.ToggleSubdirectories(vm: Vm).ConfigureAwait(false);
  308. /// <inheritdoc cref="HideInterfaceLogic.ToggleBottomToolbar(MainViewModel)" />
  309. public static async Task ToggleBottomToolbar() =>
  310. await HideInterfaceLogic.ToggleBottomToolbar(Vm).ConfigureAwait(false);
  311. /// <inheritdoc cref="SettingsUpdater.ToggleTaskbarProgress(MainViewModel)" />
  312. public static async Task ToggleTaskbarProgress() =>
  313. await SettingsUpdater.ToggleTaskbarProgress(Vm).ConfigureAwait(false);
  314. /// <inheritdoc cref="SettingsUpdater.ToggleConstrainBackgroundColor(MainViewModel)" />
  315. public static async Task ToggleConstrainBackgroundColor() =>
  316. await SettingsUpdater.ToggleConstrainBackgroundColor(Vm).ConfigureAwait(false);
  317. #endregion
  318. #region Gallery functions
  319. /// <inheritdoc cref="GalleryFunctions.ToggleGallery(MainViewModel)" />
  320. public static Task ToggleGallery() =>
  321. Task.Run(() => GalleryFunctions.ToggleGallery(Vm));
  322. /// <inheritdoc cref="GalleryFunctions.OpenCloseBottomGallery(MainViewModel)" />
  323. public static Task OpenCloseBottomGallery() =>
  324. Task.Run(() => GalleryFunctions.OpenCloseBottomGallery(Vm));
  325. /// <inheritdoc cref="GalleryFunctions.CloseGallery(MainViewModel)" />
  326. public static Task CloseGallery() =>
  327. Task.Run(() => GalleryFunctions.CloseGallery(Vm));
  328. /// <inheritdoc cref="GalleryNavigation.GalleryClick(MainViewModel)" />
  329. public static async Task GalleryClick() =>
  330. await GalleryNavigation.GalleryClick(Vm).ConfigureAwait(false);
  331. #endregion
  332. #region Windows and window functions
  333. public static async Task ShowStartUpMenu()
  334. {
  335. //TODO: Needs refactor, add async overload for ShowStartUpMenu
  336. await Dispatcher.UIThread.InvokeAsync(() =>
  337. {
  338. ErrorHandling.ShowStartUpMenu(Vm);
  339. });
  340. }
  341. /// <inheritdoc cref="DialogManager.Close(MainViewModel)" />
  342. public static async Task Close() =>
  343. await DialogManager.Close(Vm).ConfigureAwait(false);
  344. public static async Task Center() =>
  345. await UIHelper.CenterAsync(Vm).ConfigureAwait(false);
  346. /// <inheritdoc cref="Interfaces.IPlatformWindowService.MaximizeRestore" />
  347. public static Task Maximize()
  348. {
  349. Vm.PlatformWindowService.MaximizeRestore();
  350. return Task.CompletedTask;
  351. }
  352. /// <inheritdoc cref="Interfaces.IPlatformWindowService.Restore" />
  353. public static Task Restore()
  354. {
  355. Vm.PlatformWindowService.Restore();
  356. return Task.CompletedTask;
  357. }
  358. /// <inheritdoc cref="ProcessHelper.StartNewProcess()" />
  359. public static async Task NewWindow() =>
  360. await Task.Run(ProcessHelper.StartNewProcess).ConfigureAwait(false);
  361. public static Task AboutWindow()
  362. {
  363. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowAboutWindow());
  364. return Task.CompletedTask;
  365. }
  366. public static Task KeybindingsWindow()
  367. {
  368. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowKeybindingsWindow());
  369. return Task.CompletedTask;
  370. }
  371. public static Task EffectsWindow()
  372. {
  373. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowEffectsWindow());
  374. return Task.CompletedTask;
  375. }
  376. public static Task ImageInfoWindow()
  377. {
  378. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowExifWindow());
  379. return Task.CompletedTask;
  380. }
  381. public static Task ResizeWindow()
  382. {
  383. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowSingleImageResizeWindow());
  384. return Task.CompletedTask;
  385. }
  386. public static Task BatchResizeWindow()
  387. {
  388. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowBatchResizeWindow());
  389. return Task.CompletedTask;
  390. }
  391. public static Task SettingsWindow()
  392. {
  393. Dispatcher.UIThread.Invoke(() => Vm?.PlatformWindowService?.ShowSettingsWindow());
  394. return Task.CompletedTask;
  395. }
  396. #endregion Windows
  397. #region Image Scaling and Window Behavior
  398. /// <inheritdoc cref="WindowFunctions.Stretch(MainViewModel)" />
  399. public static async Task Stretch() =>
  400. await WindowFunctions.Stretch(Vm).ConfigureAwait(false);
  401. /// <inheritdoc cref="WindowFunctions.ToggleAutoFit(MainViewModel)" />
  402. public static async Task AutoFitWindow() =>
  403. await WindowFunctions.ToggleAutoFit(Vm).ConfigureAwait(false);
  404. /// <inheritdoc cref="WindowFunctions.AutoFitAndStretch(MainViewModel)" />
  405. public static async Task AutoFitWindowAndStretch() =>
  406. await WindowFunctions.AutoFitAndStretch(Vm).ConfigureAwait(false);
  407. /// <inheritdoc cref="WindowFunctions.NormalWindow(MainViewModel)" />
  408. public static async Task NormalWindow() =>
  409. await WindowFunctions.NormalWindow(Vm).ConfigureAwait(false);
  410. /// <inheritdoc cref="WindowFunctions.NormalWindowStretch(MainViewModel)" />
  411. public static async Task NormalWindowAndStretch() =>
  412. await WindowFunctions.NormalWindowStretch(Vm).ConfigureAwait(false);
  413. /// <inheritdoc cref="Interfaces.IPlatformWindowService.ToggleFullscreen" />
  414. public static async Task ToggleFullscreen() =>
  415. await Vm.PlatformWindowService.ToggleFullscreen().ConfigureAwait(false);
  416. // This shouldn't be here, but keep as alias and backwards compatibility.
  417. public static Task Fullscreen() => ToggleFullscreen();
  418. /// <inheritdoc cref="WindowFunctions.ToggleTopMost(MainViewModel)" />
  419. public static async Task SetTopMost() =>
  420. await WindowFunctions.ToggleTopMost(Vm).ConfigureAwait(false);
  421. #endregion
  422. #region File funnctions
  423. /// <inheritdoc cref="NavigationManager.LoadPicFromStringAsync(string, MainViewModel)" />
  424. public static async Task OpenLastFile() =>
  425. await NavigationManager.LoadPicFromStringAsync(FileHistoryManager.GetLastEntry(), Vm).ConfigureAwait(false);
  426. /// <inheritdoc cref="NavigationManager.LoadPicFromStringAsync(string, MainViewModel)" />
  427. public static async Task OpenPreviousFileHistoryEntry() =>
  428. await NavigationManager.LoadPicFromStringAsync(FileHistoryManager.GetPreviousEntry(), Vm).ConfigureAwait(false);
  429. /// <inheritdoc cref="NavigationManager.LoadPicFromStringAsync(string, MainViewModel)" />
  430. public static async Task OpenNextFileHistoryEntry() =>
  431. await NavigationManager.LoadPicFromStringAsync(FileHistoryManager.GetNextEntry(), Vm).ConfigureAwait(false);
  432. /// <inheritdoc cref="FileManager.Print(string, MainViewModel)" />
  433. public static async Task Print() =>
  434. await FileManager.Print(null, Vm).ConfigureAwait(false);
  435. /// <inheritdoc cref="FilePicker.SelectAndLoadFile(MainViewModel)" />
  436. public static async Task Open() =>
  437. await FilePicker.SelectAndLoadFile(Vm).ConfigureAwait(false);
  438. /// <inheritdoc cref="FileManager.OpenWith(string, MainViewModel)" />
  439. public static async Task OpenWith() =>
  440. await Task.Run(() => Vm?.PlatformService?.OpenWith(Vm.PicViewer.FileInfo?.CurrentValue.FullName)).ConfigureAwait(false);
  441. /// <inheritdoc cref="FileManager.LocateOnDisk(string, MainViewModel)" />
  442. public static async Task OpenInExplorer()=>
  443. await Task.Run(() => Vm?.PlatformService?.LocateOnDisk(Vm.PicViewer.FileInfo?.CurrentValue.FullName)).ConfigureAwait(false);
  444. /// <inheritdoc cref="FileSaverHelper.SaveCurrentFile(MainViewModel)" />
  445. public static async Task Save() =>
  446. await FileSaverHelper.SaveCurrentFile(Vm).ConfigureAwait(false);
  447. /// <inheritdoc cref="FileSaverHelper.SaveFileAs(MainViewModel)" />
  448. public static async Task SaveAs() =>
  449. await FileSaverHelper.SaveFileAs(Vm).ConfigureAwait(false);
  450. /// <inheritdoc cref="FileManager.DeleteFileWithOptionalDialog" />
  451. public static async Task DeleteFile() =>
  452. await FileManager.DeleteFileWithOptionalDialog(true, Vm.PicViewer?.FileInfo?.CurrentValue.FullName, Vm.PlatformService).ConfigureAwait(false);
  453. /// <inheritdoc cref="FileManager.DeleteFileWithOptionalDialog" />
  454. public static async Task DeleteFilePermanently() =>
  455. await FileManager.DeleteFileWithOptionalDialog(false, Vm.PicViewer?.FileInfo?.CurrentValue.FullName, Vm.PlatformService).ConfigureAwait(false);
  456. public static async Task Rename()
  457. {
  458. // TODO: Needs refactor for selecting file name
  459. await Dispatcher.UIThread.InvokeAsync(() =>
  460. {
  461. UIHelper.GetEditableTitlebar.SelectFileName();
  462. });
  463. }
  464. /// <inheritdoc cref="FileManager.ShowFileProperties(string, MainViewModel)" />
  465. public static async Task ShowFileProperties() =>
  466. await Task.Run(() => Vm?.PlatformService?.ShowFileProperties(Vm.PicViewer.FileInfo?.CurrentValue.FullName)).ConfigureAwait(false);
  467. #endregion
  468. #region Copy and Paste functions
  469. /// <inheritdoc cref="ClipboardFileOperations.CopyFileToClipboard(string, MainViewModel)" />
  470. public static async Task CopyFile() =>
  471. await ClipboardFileOperations.CopyFileToClipboard(Vm?.PicViewer.FileInfo?.CurrentValue.FullName, Vm).ConfigureAwait(false);
  472. /// <inheritdoc cref="ClipboardTextOperations.CopyTextToClipboard(string)" />
  473. public static async Task CopyFilePath() =>
  474. await ClipboardTextOperations.CopyTextToClipboard(Vm?.PicViewer.FileInfo?.CurrentValue.FullName).ConfigureAwait(false);
  475. /// <inheritdoc cref="ClipboardImageOperations.CopyImageToClipboard(MainViewModel)" />
  476. public static async Task CopyImage() =>
  477. await ClipboardImageOperations.CopyImageToClipboard(Vm).ConfigureAwait(false);
  478. /// <inheritdoc cref="ClipboardImageOperations.CopyBase64ToClipboard(string, MainViewModel)" />
  479. public static async Task CopyBase64() =>
  480. await ClipboardImageOperations.CopyBase64ToClipboard(Vm.PicViewer.FileInfo?.CurrentValue.FullName, vm: Vm).ConfigureAwait(false);
  481. /// <inheritdoc cref="ClipboardFileOperations.Duplicate(string, MainViewModel)" />
  482. public static async Task DuplicateFile() =>
  483. await ClipboardFileOperations.Duplicate(Vm.PicViewer.FileInfo?.CurrentValue.FullName, Vm).ConfigureAwait(false);
  484. /// <inheritdoc cref="ClipboardFileOperations.CutFile(string, MainViewModel)" />
  485. public static async Task CutFile() =>
  486. await ClipboardFileOperations.CutFile(Vm.PicViewer.FileInfo.CurrentValue.FullName, Vm).ConfigureAwait(false);
  487. /// <inheritdoc cref="ClipboardPasteOperations.Paste(MainViewModel)" />
  488. public static async Task Paste() =>
  489. await ClipboardPasteOperations.Paste(Vm).ConfigureAwait(false);
  490. #endregion
  491. #region Image Functions
  492. /// <inheritdoc cref="BackgroundManager.ChangeBackground(MainViewModel)" />
  493. public static async Task ChangeBackground() =>
  494. await BackgroundManager.ChangeBackgroundAsync(Vm).ConfigureAwait(false);
  495. /// <inheritdoc cref="SettingsUpdater.ToggleSideBySide(MainViewModel)" />
  496. public static async Task SideBySide() =>
  497. await SettingsUpdater.ToggleSideBySide(Vm).ConfigureAwait(false);
  498. /// <inheritdoc cref="ErrorHandling.ReloadAsync(MainViewModel)" />
  499. public static async Task Reload() =>
  500. await ErrorHandling.ReloadAsync(Vm).ConfigureAwait(false);
  501. public static Task ResizeImage() =>
  502. ResizeWindow();
  503. /// <inheritdoc cref="CropFunctions.StartCropControl(MainViewModel)" />
  504. public static async Task Crop() =>
  505. await CropFunctions.StartCropControlAsync(Vm).ConfigureAwait(false);
  506. public static Task Flip()
  507. {
  508. RotationNavigation.Flip(Vm);
  509. return Task.CompletedTask;
  510. }
  511. /// <inheritdoc cref="ImageOptimizer.OptimizeImageAsync(MainViewModel)" />
  512. public static async Task OptimizeImage() =>
  513. await ImageOptimizer.OptimizeImageAsync(Vm).ConfigureAwait(false);
  514. /// <inheritdoc cref="Navigation.Slideshow.StartSlideshow(MainViewModel)" />
  515. public static async Task Slideshow() =>
  516. await Navigation.Slideshow.StartSlideshow(Vm).ConfigureAwait(false);
  517. public static Task ColorPicker()
  518. {
  519. return Task.CompletedTask;
  520. }
  521. #endregion
  522. #region Sorting
  523. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  524. public static async Task SortFilesByName() =>
  525. await FileListManager.UpdateFileList(Vm.PlatformService, Vm, SortFilesBy.Name).ConfigureAwait(false);
  526. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  527. public static async Task SortFilesByCreationTime() =>
  528. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, SortFilesBy.CreationTime).ConfigureAwait(false);
  529. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  530. public static async Task SortFilesByLastAccessTime() =>
  531. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, SortFilesBy.LastAccessTime).ConfigureAwait(false);
  532. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  533. public static async Task SortFilesByLastWriteTime() =>
  534. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, SortFilesBy.LastWriteTime).ConfigureAwait(false);
  535. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  536. public static async Task SortFilesBySize() =>
  537. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, SortFilesBy.FileSize).ConfigureAwait(false);
  538. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  539. public static async Task SortFilesByExtension() =>
  540. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, SortFilesBy.Extension).ConfigureAwait(false);
  541. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, FileSortOrder.SortFilesBy)" />
  542. public static async Task SortFilesRandomly() =>
  543. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, SortFilesBy.Random).ConfigureAwait(false);
  544. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, bool)" />
  545. public static async Task SortFilesAscending() =>
  546. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, ascending: true).ConfigureAwait(false);
  547. /// <inheritdoc cref="FileListManager.UpdateFileList(PicView.Avalonia.Interfaces.IPlatformSpecificService, MainViewModel, bool)" />
  548. public static async Task SortFilesDescending() =>
  549. await FileListManager.UpdateFileList(Vm?.PlatformService, Vm, ascending: false).ConfigureAwait(false);
  550. #endregion Sorting
  551. #region Rating
  552. public static async Task Set0Star()
  553. {
  554. // TODO: Needs refactoring into EXIFHelper
  555. if (Vm is null)
  556. {
  557. return;
  558. }
  559. await Task.Run(() => { EXIFHelper.SetEXIFRating(Vm.PicViewer.FileInfo.CurrentValue.FullName, 0); });
  560. Vm.EXIFRating = 0;
  561. }
  562. public static async Task Set1Star()
  563. {
  564. // TODO: Needs refactoring into EXIFHelper
  565. if (Vm is null)
  566. {
  567. return;
  568. }
  569. await Task.Run(() => { EXIFHelper.SetEXIFRating(Vm.PicViewer.FileInfo.CurrentValue.FullName, 1); });
  570. Vm.EXIFRating = 1;
  571. }
  572. public static async Task Set2Star()
  573. {
  574. // TODO: Needs refactoring into EXIFHelper
  575. if (Vm is null)
  576. {
  577. return;
  578. }
  579. await Task.Run(() => { EXIFHelper.SetEXIFRating(Vm.PicViewer.FileInfo.CurrentValue.FullName, 2); });
  580. Vm.EXIFRating = 2;
  581. }
  582. public static async Task Set3Star()
  583. {
  584. // TODO: Needs refactoring into EXIFHelper
  585. if (Vm is null)
  586. {
  587. return;
  588. }
  589. await Task.Run(() => { EXIFHelper.SetEXIFRating(Vm.PicViewer.FileInfo.CurrentValue.FullName, 3); });
  590. Vm.EXIFRating = 3;
  591. }
  592. public static async Task Set4Star()
  593. {
  594. // TODO: Needs refactoring into EXIFHelper
  595. if (Vm is null)
  596. {
  597. return;
  598. }
  599. await Task.Run(() => { EXIFHelper.SetEXIFRating(Vm.PicViewer.FileInfo.CurrentValue.FullName, 4); });
  600. Vm.EXIFRating = 4;
  601. }
  602. public static async Task Set5Star()
  603. {
  604. // TODO: Needs refactoring into EXIFHelper
  605. if (Vm is null)
  606. {
  607. return;
  608. }
  609. await Task.Run(() => { EXIFHelper.SetEXIFRating(Vm.PicViewer.FileInfo.CurrentValue.FullName, 5); });
  610. Vm.EXIFRating = 5;
  611. }
  612. #endregion
  613. #region Open GPS link
  614. public static async Task OpenGoogleMaps()
  615. {
  616. // TODO: Needs refactoring into its own method
  617. if (Vm is null)
  618. {
  619. return;
  620. }
  621. if (string.IsNullOrEmpty(Vm.Exif.GoogleLink))
  622. {
  623. return;
  624. }
  625. await Task.Run(() => ProcessHelper.OpenLink(Vm.Exif.GoogleLink));
  626. }
  627. public static async Task OpenBingMaps()
  628. {
  629. // TODO: Needs refactoring into its own method
  630. if (Vm is null)
  631. {
  632. return;
  633. }
  634. if (string.IsNullOrEmpty(Vm.Exif.BingLink))
  635. {
  636. return;
  637. }
  638. await Task.Run(() => ProcessHelper.OpenLink(Vm.Exif.BingLink));
  639. }
  640. #endregion
  641. #region Wallpaper and lockscreen image
  642. public static async Task SetAsWallpaper() =>
  643. await SetAsWallpaperFilled();
  644. public static async Task SetAsWallpaperTiled() =>
  645. await Task.Run(() => Vm.PlatformService.SetAsWallpaper(Vm.PicViewer.FileInfo.CurrentValue.FullName, 0)).ConfigureAwait(false);
  646. public static async Task SetAsWallpaperCentered() =>
  647. await Task.Run(() => Vm.PlatformService.SetAsWallpaper(Vm.PicViewer.FileInfo.CurrentValue.FullName, 1)).ConfigureAwait(false);
  648. public static async Task SetAsWallpaperStretched() =>
  649. await Task.Run(() => Vm.PlatformService.SetAsWallpaper(Vm.PicViewer.FileInfo.CurrentValue.FullName, 2)).ConfigureAwait(false);
  650. public static async Task SetAsWallpaperFitted() =>
  651. await Task.Run(() => Vm.PlatformService.SetAsWallpaper(Vm.PicViewer.FileInfo.CurrentValue.FullName, 3)).ConfigureAwait(false);
  652. public static async Task SetAsWallpaperFilled() =>
  653. await Task.Run(() => Vm.PlatformService.SetAsWallpaper(Vm.PicViewer.FileInfo.CurrentValue.FullName, 4)).ConfigureAwait(false);
  654. public static async Task SetAsLockscreenCentered() =>
  655. await Task.Run(() => Vm.PlatformService.SetAsLockScreen(Vm.PicViewer.FileInfo.CurrentValue.FullName)).ConfigureAwait(false);
  656. public static async Task SetAsLockScreen() =>
  657. await Task.Run(() => Vm.PlatformService.SetAsLockScreen(Vm.PicViewer.FileInfo.CurrentValue.FullName)).ConfigureAwait(false);
  658. #endregion
  659. #region Other settings
  660. /// <inheritdoc cref="SettingsUpdater.ResetSettings(MainViewModel)" />
  661. public static async Task ResetSettings() =>
  662. await SettingsUpdater.ResetSettings(Vm).ConfigureAwait(false);
  663. public static async Task Restart()
  664. {
  665. // TODO: Needs refactoring into its own method
  666. var openFile = string.Empty;
  667. var getFromArgs = false;
  668. if (Vm?.PicViewer.FileInfo is not null)
  669. {
  670. if (Vm.PicViewer.FileInfo.CurrentValue.Exists)
  671. {
  672. openFile = Vm.PicViewer.FileInfo.CurrentValue.FullName;
  673. }
  674. else
  675. {
  676. getFromArgs = true;
  677. }
  678. }
  679. else
  680. {
  681. getFromArgs = true;
  682. }
  683. if (getFromArgs)
  684. {
  685. var args = Environment.GetCommandLineArgs();
  686. if (args is not null && args.Length > 0)
  687. {
  688. openFile = args[1];
  689. }
  690. }
  691. ProcessHelper.RestartApp(openFile);
  692. if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
  693. {
  694. Environment.Exit(0);
  695. return;
  696. }
  697. await Dispatcher.UIThread.InvokeAsync(() =>
  698. {
  699. desktop.MainWindow?.Close();
  700. });
  701. }
  702. public static async Task ShowSettingsFile() =>
  703. await Task.Run(() => Vm?.PlatformService?.OpenWith(CurrentSettingsPath)).ConfigureAwait(false);
  704. public static async Task ShowKeybindingsFile() =>
  705. await Task.Run(() => Vm?.PlatformService?.OpenWith(KeybindingFunctions.CurrentKeybindingsPath)).ConfigureAwait(false);
  706. public static async Task ShowRecentHistoryFile() =>
  707. await Task.Run(() => Vm?.PlatformService?.OpenWith(FileHistoryManager.CurrentFileHistoryFile)).ConfigureAwait(false);
  708. /// <inheritdoc cref="SettingsUpdater.ToggleUsingTouchpad(MainViewModel)" />
  709. public static async Task ToggleUsingTouchpad() =>
  710. await SettingsUpdater.ToggleUsingTouchpad(Vm).ConfigureAwait(false);
  711. public static async Task ToggleOpeningInSameWindow() =>
  712. await SettingsUpdater.ToggleOpeningInSameWindow(Vm).ConfigureAwait(false);
  713. #endregion
  714. #endregion
  715. #if DEBUG
  716. public static void Invalidate()
  717. {
  718. Vm?.ImageViewer?.MainImage?.InvalidateVisual();
  719. Vm?.ImageViewer?.InvalidateVisual();
  720. Vm?.ImageViewer?.MainImage?.InvalidateMeasure();
  721. Vm?.ImageViewer?.InvalidateMeasure();
  722. }
  723. #endif
  724. }