void InitiateDeleteSelectedInAssetList(BuildInfo buildReportToDisplay, 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; 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.ReportGenerator.SegregateAssetSizesPerCategory(allWithRemoved, buildReportToDisplay.FileFilters); listToDeleteFrom.Reinit(allWithRemoved, perCategoryOfList, IsShowingUsedAssets ? BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow : BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow); listToDeleteFrom.ClearSelection(); // print info about the delete operation to console string finalMessage = string.Format("{0} file{1} removed from your project.", deletedCount.ToString(), plural); if (deleteIsRecoverable) { finalMessage += " They can be recovered from your " + BuildReportTool.Util.NameOfOSTrashFolder + "."; } EditorApplication.Beep(); EditorUtility.DisplayDialog("Delete successful", finalMessage, "OK"); Debug.LogWarning(finalMessage); }
public override void DrawGUI(Rect position, BuildInfo buildReportToDisplay) { if (!buildReportToDisplay.HasUsedAssets) { return; } // init variables to use // -------------------------------------------------------------------------- BuildReportTool.FileFilterGroup fileFilterGroupToUse = buildReportToDisplay.FileFilters; if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) { fileFilterGroupToUse = _configuredFileFilterGroup; } BuildReportTool.AssetList listToDisplay = GetAssetListToDisplay(buildReportToDisplay); //BuildReportTool.SizePart[] assetListToUse = listToDisplay.GetListToDisplay(fileFilterGroupToUse); // //if (assetListToUse == null || assetListToUse.Length == 0) //{ // fileFilterGroupToUse.ForceSetSelectedFilterIdx(0); //} if (listToDisplay == null) { if (IsShowingUsedAssets) { Utility.DrawCentralMessage(position, "No \"Used Assets\" included in this build report."); } else if (IsShowingUnusedAssets) { Utility.DrawCentralMessage(position, "No \"Unused Assets\" included in this build report."); } return; } // gui // -------------------------------------------------------------------------- GUILayout.Space(1); DrawTopBar(position, buildReportToDisplay, fileFilterGroupToUse); if (buildReportToDisplay.HasUsedAssets) { DrawAssetList(position, listToDisplay, fileFilterGroupToUse, BuildReportTool.Options.AssetListPaginationLength); } // status bar at bottom // -------------------------------------------------------------------------- GUILayout.Space(20); string selectedInfoLabel = string.Format("{0}{1}. {2}{3} ({4}%) Click on an asset's checkbox to include it in size calculation. Click on the filename to highlight it on your Project window.", Labels.SELECTED_QTY_LABEL, listToDisplay.GetSelectedCount().ToString("N0"), Labels.SELECTED_SIZE_LABEL, listToDisplay.GetReadableSizeOfSumSelection(), listToDisplay.GetPercentageOfSumSelection().ToString("N")); GUI.Label(new Rect(0, position.height - 20, position.width, 20), selectedInfoLabel, BuildReportTool.Window.Settings.STATUS_BAR_LABEL_STYLE_NAME); }