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);
}