Esempio n. 1
0
        /// <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);
                }
            }
        }