/// <summary> /// Deletes <paramref name="fm"/>'s archive from disk, asking the user for confirmation first. /// </summary> /// <param name="fm"></param> /// <returns></returns> internal static async Task Delete(FanMission fm) { if (fm.MarkedUnavailable) { return; } var archives = FindAllMatches(fm.Archive); if (archives.Count == 0) { Dialogs.ShowAlert(LText.FMDeletion.ArchiveNotFound, LText.AlertMessages.DeleteFMArchive, MessageBoxIcon.Error); return; } bool singleArchive = archives.Count == 1; var finalArchives = new List <string>(); using (var f = new MessageBoxCustomForm( messageTop: singleArchive ? LText.FMDeletion.AboutToDelete + "\r\n\r\n" + archives[0] : LText.FMDeletion.DuplicateArchivesFound, messageBottom: "", title: LText.AlertMessages.DeleteFMArchive, icon: MessageBoxIcon.Warning, okText: singleArchive ? LText.FMDeletion.DeleteFM : LText.FMDeletion.DeleteFMs, cancelText: LText.Global.Cancel, okIsDangerous: true, choiceStrings: singleArchive ? null : archives.ToArray())) { if (f.ShowDialogDark() != DialogResult.OK) { return; } finalArchives.AddRange(singleArchive ? archives : f.SelectedItems); } if (fm.Installed) { (bool cancel, bool cont, _) = Dialogs.AskToContinueWithCancelCustomStrings( message: LText.FMDeletion.AskToUninstallFMFirst, title: LText.AlertMessages.DeleteFMArchive, icon: MessageBoxIcon.Warning, showDontAskAgain: false, yes: LText.AlertMessages.Uninstall, no: LText.AlertMessages.LeaveInstalled, cancel: LText.Global.Cancel ); if (cancel) { return; } if (cont) { bool canceled = !await FMInstallAndPlay.UninstallFM(fm); if (canceled) { return; } } } try { Core.View.ShowProgressBox(ProgressTask.DeleteFMArchive); await Task.Run(() => { foreach (string archive in finalArchives) { try { FileSystem.DeleteFile(archive, UIOption.AllDialogs, RecycleOption.SendToRecycleBin); } catch (Exception ex) { Log("Exception deleting archive '" + archive + "'", ex); Core.View.InvokeSync(new Action(() => Dialogs.ShowError(LText.AlertMessages.DeleteFM_UnableToDelete + "\r\n\r\n" + archive))); } } }); } finally { var newArchives = await Task.Run(() => FindAllMatches(fm.Archive)); Core.View.HideProgressBox(); if (newArchives.Count == 0 && !fm.Installed) { fm.MarkedUnavailable = true; await Core.View.SortAndSetFilter(keepSelection : true); } } }