BRT_BuildReportWindow.InitiateDeleteSelectedInAssetList C# (CSharp) Method

InitiateDeleteSelectedInAssetList() private method

private InitiateDeleteSelectedInAssetList ( BuildReportTool listToDeleteFrom ) : void
listToDeleteFrom BuildReportTool
return void
    void InitiateDeleteSelectedInAssetList(BuildReportTool.AssetList listToDeleteFrom)
    {
        if (listToDeleteFrom.IsNothingSelected)
        {
            return;
        }

        BuildReportTool.SizePart[] all = listToDeleteFrom.All;

        int numOfFilesRequestedToDelete = listToDeleteFrom.GetSelectedCount();
        int numOfFilesToDelete = numOfFilesRequestedToDelete;
        int systemDeletionFileCount = 0;
        int brtFilesSelectedForDelete = 0;

        // filter out files that shouldn't be deleted
        // and identify unrecoverable files
        for (int n = 0, len = all.Length; n < len; ++n)
        {
            BuildReportTool.SizePart b = all[n];
            bool isThisFileToBeDeleted = listToDeleteFrom.InSumSelection(b);

            if (isThisFileToBeDeleted)
            {
                if (BuildReportTool.Util.IsFileInBuildReportFolder(b.Name) && !BuildReportTool.Util.IsUselessFile(b.Name))
                {
                    //Debug.Log("BRT file? " + b.Name);
                    --numOfFilesToDelete;
                    ++brtFilesSelectedForDelete;
                }
                else if (BuildReportTool.Util.HaveToUseSystemForDelete(b.Name))
                {
                    ++systemDeletionFileCount;
                }
            }
        }

        if (numOfFilesToDelete <= 0)
        {
            if (brtFilesSelectedForDelete > 0)
            {
                EditorApplication.Beep();
                EditorUtility.DisplayDialog("Can't delete!", "Take note that for safety, Build Report Tool assets themselves will not be included for deletion.", "OK");
            }
            return;
        }

        // prepare warning message for user

        bool deletingSystemFilesOnly = (systemDeletionFileCount == numOfFilesToDelete);
        bool deleteIsRecoverable = !deletingSystemFilesOnly;

        string plural = "";
        if (numOfFilesToDelete > 1)
        {
            plural = "s";
        }

        string message = null;

        if (numOfFilesRequestedToDelete != numOfFilesToDelete)
        {
            message = "Among " + numOfFilesRequestedToDelete + " file" + plural + " requested to be deleted, only " + numOfFilesToDelete + " will be deleted.";
        }
        else
        {
            message = "This will delete " + numOfFilesToDelete + " asset" + plural + " in your project.";
        }

        // add warning about BRT files that are skipped
        if (brtFilesSelectedForDelete > 0)
        {
            message += "\n\nTake note that for safety, " + brtFilesSelectedForDelete + " file" + ((brtFilesSelectedForDelete > 1) ? "s" : "") + " found to be Build Report Tool assets are not included for deletion.";
        }

        // add warning about unrecoverable files
        if (systemDeletionFileCount > 0)
        {
            if (deletingSystemFilesOnly)
            {
                message += "\n\nThe deleted file" + plural + " will not be recoverable from the " + BuildReportTool.Util.NameOfOSTrashFolder + ", unless you have your own backup.";
            }
            else
            {
                message += "\n\nAmong the " + numOfFilesToDelete + " file" + plural + " for deletion, " + systemDeletionFileCount + " will not be recoverable from the " + BuildReportTool.Util.NameOfOSTrashFolder + ", unless you have your own backup.";
            }
            message += "\n\nThis is a limitation in Unity and .NET code. To ensure deleting will move the files to the " + BuildReportTool.Util.NameOfOSTrashFolder + " instead, delete your files the usual way using your project view.";
        }
        else
        {
            message += "\n\nThe deleted file" + plural + " can be recovered from your " + BuildReportTool.Util.NameOfOSTrashFolder + ".";
        }

        message += "\n\nDeleting a large number of files may take a long time as Unity will rebuild the project's Library folder.\n\nProceed with deleting?";

        EditorApplication.Beep();
        if (!EditorUtility.DisplayDialog("Delete?", message, "Yes", "No"))
        {
            return;
        }

        List<BuildReportTool.SizePart> allList = new List<BuildReportTool.SizePart>(all);
        List<BuildReportTool.SizePart> toRemove = new List<BuildReportTool.SizePart>(all.Length/4);

        // finally, delete the files
        int deletedCount = 0;
        for (int n = 0, len = allList.Count; n < len; ++n)
        {
            BuildReportTool.SizePart b = allList[n];

            bool okToDelete = BuildReportTool.Util.IsUselessFile(b.Name) || !BuildReportTool.Util.IsFileInBuildReportFolder(b.Name);

            if (listToDeleteFrom.InSumSelection(b) && okToDelete)
            {
                // delete this

                if (BuildReportTool.Util.ShowFileDeleteProgress(deletedCount, numOfFilesToDelete, b.Name, deleteIsRecoverable))
                {
                    return;
                }

                BuildReportTool.Util.DeleteSizePartFile(b);
                toRemove.Add(b);
                ++deletedCount;
            }
        }
        EditorUtility.ClearProgressBar();

        // refresh the asset lists
        allList.RemoveAll(i => toRemove.Contains(i));
        BuildReportTool.SizePart[] allWithRemoved = allList.ToArray();

        // recreate per category list (maybe just remove from existing per category lists instead?)
        BuildReportTool.SizePart[][] perCategoryOfList = BuildReportTool.ReportManager.SegregateAssetSizesPerCategory(allWithRemoved, _buildInfo.FileFilters);

        listToDeleteFrom.Reinit(allWithRemoved, perCategoryOfList);
        listToDeleteFrom.ClearSelection();

        // print info about the delete operation to console
        string finalMessage = deletedCount + " file" + plural + " removed from your project.";
        if (deleteIsRecoverable)
        {
            finalMessage += " They can be recovered from your " + BuildReportTool.Util.NameOfOSTrashFolder + ".";
        }

        EditorApplication.Beep();
        EditorUtility.DisplayDialog("Delete successful", finalMessage, "OK");

        Debug.LogWarning(finalMessage);
    }