private static List <RenamePreview> GetPreviewsWithInvalidCharacters(BulkRenamePreview preview) { var invalidCharacters = new char[] { '?', '.', '/', '<', '>', '\\', '|', '*', ':', '"' }; var problemPreviews = new List <RenamePreview>(); for (int i = 0; i < preview.NumObjects; ++i) { var previewForObject = preview.GetPreviewAtIndex(i); var thisObject = previewForObject.ObjectToRename; if (!AssetDatabase.Contains(thisObject)) { // Scene objects can have symbols continue; } var thisResult = previewForObject.RenameResultSequence; foreach (var invalidCharacter in invalidCharacters) { if (thisResult.NewName.Contains(invalidCharacter)) { problemPreviews.Add(previewForObject); break; } } } return(problemPreviews); }
public static PreviewPanelContents CreatePreviewContentsForObjects(BulkRenamePreview preview) { var previewPanelContents = new PreviewPanelContents(); previewPanelContents.PreviewRowInfos = new PreviewRowModel[preview.NumObjects]; for (int i = 0; i < preview.NumObjects; ++i) { var info = new PreviewRowModel(); var previewForIndex = preview.GetPreviewAtIndex(i); info.RenameResultSequence = previewForIndex.RenameResultSequence; info.Icon = previewForIndex.ObjectToRename.GetEditorIcon(); if (previewForIndex.HasWarnings) { info.WarningIcon = (Texture2D)EditorGUIUtility.Load("icons/console.warnicon.sml.png"); info.WarningMessage = previewForIndex.WarningMessage; } else { info.WarningIcon = null; info.WarningMessage = string.Empty; } previewPanelContents.PreviewRowInfos[i] = info; } float paddingScaleForBold = 1.11f; previewPanelContents.LongestOriginalNameWidth = 0.0f; previewPanelContents.LongestNewNameWidth = 0.0f; foreach (var previewRowInfo in previewPanelContents.PreviewRowInfos) { float originalNameWidth = GUI.skin.label.CalcSize( new GUIContent(previewRowInfo.RenameResultSequence.OriginalName)).x *paddingScaleForBold; if (originalNameWidth > previewPanelContents.LongestOriginalNameWidth) { previewPanelContents.LongestOriginalNameWidth = originalNameWidth; } float newNameWidth = GUI.skin.label.CalcSize( new GUIContent(previewRowInfo.RenameResultSequence.NewName)).x *paddingScaleForBold; if (newNameWidth > previewPanelContents.LongestNewNameWidth) { previewPanelContents.LongestNewNameWidth = newNameWidth; } } previewPanelContents.LongestOriginalNameWidth = Mathf.Max(MinColumnWidth, previewPanelContents.LongestOriginalNameWidth); previewPanelContents.LongestNewNameWidth = Mathf.Max(MinColumnWidth, previewPanelContents.LongestNewNameWidth); previewPanelContents.LongestFinalNameWidth = previewPanelContents.LongestNewNameWidth; return(previewPanelContents); }
private static void CacheAssetsInSameDirectories(BulkRenamePreview preview, ref AssetCache assetCache) { for (int i = 0; i < preview.NumObjects; ++i) { var previewForObject = preview.GetPreviewAtIndex(i); var thisObject = previewForObject.ObjectToRename; if (!thisObject.IsAsset()) { // Scene objects can be named the same thing, so skip these continue; } var assetDirectory = AssetDatabaseUtility.GetAssetPathDirectory(thisObject); assetCache.LoadAssetsInAssetDirectory(assetDirectory); } }
private static List <RenamePreview> GetPreviewsWithEmptyNames(BulkRenamePreview preview) { var problemPreviews = new List <RenamePreview>(); for (int i = 0; i < preview.NumObjects; ++i) { var previewForObject = preview.GetPreviewAtIndex(i); var thisObject = previewForObject.ObjectToRename; if (!AssetDatabase.Contains(thisObject)) { // Scene objects can be empty names... even though that's a terrible idea. But still, skip them. continue; } var thisResult = previewForObject.RenameResultSequence; if (string.IsNullOrEmpty(thisResult.NewName)) { problemPreviews.Add(previewForObject); } } return(problemPreviews); }
public static PreviewPanelContents CreatePreviewContentsForObjects( BulkRenamePreview preview, int firstPreviewIndex, int numObjectsToShow, int stepIndex, Color deletionColor, Color insertionColor) { var previewPanelContents = new PreviewPanelContents(); var numVisibleObjects = Mathf.Min(numObjectsToShow, preview.NumObjects); previewPanelContents.PreviewRowInfos = new PreviewRowModel[numVisibleObjects]; for (int j = 0; j < numVisibleObjects && j < preview.NumObjects - firstPreviewIndex; ++j) { var info = new PreviewRowModel(); var indexOfVisibleObject = firstPreviewIndex + j; var previewForIndex = preview.GetPreviewAtIndex(indexOfVisibleObject); var originalName = stepIndex >= 0 && stepIndex < preview.NumSteps ? previewForIndex.RenameResultSequence.GetNameBeforeAtStep(stepIndex, deletionColor) : previewForIndex.RenameResultSequence.OriginalName; info.NameBeforeStep = originalName; var nameAtStep = stepIndex >= 0 && stepIndex < preview.NumSteps ? previewForIndex.RenameResultSequence.GetNewNameAtStep(stepIndex, insertionColor) : previewForIndex.RenameResultSequence.NewName; info.NameAtStep = nameAtStep; info.FinalName = previewForIndex.RenameResultSequence.NewName; info.Icon = previewForIndex.ObjectToRename.GetEditorIcon(); if (previewForIndex.HasWarnings || preview.WillRenameCollideWithExistingAsset(previewForIndex)) { info.WarningIcon = (Texture2D)EditorGUIUtility.Load("icons/console.warnicon.sml.png"); if (previewForIndex.HasWarnings) { info.WarningMessage = GetWarningMessageForRenamePreview(previewForIndex); } else { info.WarningMessage = "New name matches an existing file or another renamed object."; } } else { info.WarningIcon = null; info.WarningMessage = string.Empty; } info.IndexInPreview = indexOfVisibleObject; previewPanelContents.PreviewRowInfos[j] = info; } // Note that CalcSize is very slow, so it is a problem to do it to the entire list of objects... // For now we only measure the ones that are visible. It causes the columns to resize as you scroll, // but that's not the worst. float paddingScaleForBold = 1.11f; previewPanelContents.LongestOriginalNameWidth = 0.0f; previewPanelContents.LongestNewNameWidth = 0.0f; foreach (var previewRowInfo in previewPanelContents.PreviewRowInfos) { var labelStyle = GUI.skin.label; labelStyle.richText = true; float originalNameWidth = labelStyle.CalcSize( new GUIContent(previewRowInfo.NameBeforeStep)).x *paddingScaleForBold; if (originalNameWidth > previewPanelContents.LongestOriginalNameWidth) { previewPanelContents.LongestOriginalNameWidth = originalNameWidth; } float newNameWidth = labelStyle.CalcSize( new GUIContent(previewRowInfo.NameAtStep)).x *paddingScaleForBold; if (newNameWidth > previewPanelContents.LongestNewNameWidth) { previewPanelContents.LongestNewNameWidth = newNameWidth; } } previewPanelContents.LongestOriginalNameWidth = Mathf.Max(MinColumnWidth, previewPanelContents.LongestOriginalNameWidth); previewPanelContents.LongestNewNameWidth = Mathf.Max(MinColumnWidth, previewPanelContents.LongestNewNameWidth); previewPanelContents.LongestFinalNameWidth = previewPanelContents.LongestNewNameWidth; previewPanelContents.TotalNumRows = preview.NumObjects; return(previewPanelContents); }
private static List <RenamePreview> GetPreviewsWithDuplicateNames(BulkRenamePreview preview, ref AssetCache assetCache) { // First collect all assets in directories of preview objects into the assetCache. CacheAssetsInSameDirectories(preview, ref assetCache); var assetPreviews = new List <RenamePreview>(); for (int i = 0; i < preview.NumObjects; ++i) { var previewForObject = preview.GetPreviewAtIndex(i); if (previewForObject.ObjectToRename.IsAsset()) { assetPreviews.Add(previewForObject); } } // Get all the cached file paths, but remove any that are in the preview // because those names could be different. We want to test that NEW names // don't collide with existing assets. HashSet <string> allFinalFilePaths = assetCache.GetAllPathsHashed(); foreach (var assetPreview in assetPreviews) { var thisObject = assetPreview.ObjectToRename; var assetPath = AssetDatabaseUtility.GetAssetPathWithSubAsset(thisObject); allFinalFilePaths.Remove(assetPath); } // Now hash the new names and check if they collide with the existing assets var problemPreviews = new List <RenamePreview>(); var unchangedAssetPreviews = new List <RenamePreview>(); var changedAssetPreviews = new List <RenamePreview>(); // Separate unchangedAssets from changedAsests foreach (var assetPreview in assetPreviews) { var thisObject = assetPreview.ObjectToRename; var thisResult = assetPreview.RenameResultSequence; if (thisResult.NewName == thisResult.OriginalName) { unchangedAssetPreviews.Add(assetPreview); } else { changedAssetPreviews.Add(assetPreview); } } // First add all the unchanged results, so that we collide on the // first time adding new names. This fixes an issue where // you'd rename one object which now matches a second, but the second gets // the warning instead of the first. var previewsSorted = new List <RenamePreview>(); previewsSorted.AddRange(unchangedAssetPreviews); previewsSorted.AddRange(changedAssetPreviews); foreach (var renamePreview in previewsSorted) { var resultingPath = renamePreview.GetResultingPath(); if (allFinalFilePaths.Contains(resultingPath)) { problemPreviews.Add(renamePreview); } else { allFinalFilePaths.Add(resultingPath); } } return(problemPreviews); }