Example #1
0
        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);
        }
Example #2
0
            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);
            }
Example #3
0
        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);
            }
        }
Example #4
0
        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);
        }
Example #5
0
            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);
            }
Example #6
0
        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);
        }