void DrawCategorySpriteListFooter(Rect rect, SerializedProperty category, SpriteCategoryGridState gridState, bool canRemove, Action <SerializedProperty, SpriteCategoryGridState> onRemove)
        {
            float num = rect.xMax - 10f;
            float x   = num - 8f;

            x   -= 25f;
            x   -= 25f;
            rect = new Rect(x, rect.y, num - x, rect.height);
            Rect rect1    = new Rect(x + 4f, rect.y, 25f, 16f);
            Rect position = new Rect(num - 29f, rect.y, 25f, 16f);


            if (Event.current.type == UnityEngine.EventType.Repaint)
            {
                m_Style.footerBackground.Draw(rect, false, false, false, false);
            }

            if (GUI.Button(rect1, m_Style.iconToolbarPlus, m_Style.preButton))
            {
                AddSpriteToCategory(category, null);
            }

            var spriteList = category.FindPropertyRelative(SpriteLibraryPropertyString.overrideEntries);

            using (new EditorGUI.DisabledScope(!canRemove || gridState.selectedIndex < 0 || spriteList.arraySize <= gridState.selectedIndex))
            {
                if (GUI.Button(position, m_Style.iconToolbarMinus, m_Style.preButton))
                {
                    onRemove(spriteList, gridState);
                }
            }
        }
        static void DeleteSpriteEntry(SerializedProperty spriteList, SpriteCategoryGridState gridState)
        {
            spriteList.DeleteArrayElementAtIndex(gridState.selectedIndex);
            var count = spriteList.arraySize;

            gridState.selectedIndex = (gridState.selectedIndex >= count) ? count - 1 : gridState.selectedIndex;
        }
        static void DeleteSpriteEntryOverride(SerializedProperty spriteList, SpriteCategoryGridState gridState)
        {
            var sp = spriteList.GetArrayElementAtIndex(gridState.selectedIndex);

            sp.FindPropertyRelative(SpriteLibraryPropertyString.spriteOverride).objectReferenceValue = sp.FindPropertyRelative(SpriteLibraryPropertyString.sprite).objectReferenceValue;
        }
        void DrawLabel(int index,
                       SerializedProperty spriteListProp,
                       SerializedProperty spriteOverrideProperty,
                       SpriteCategoryGridState gridState,
                       bool spriteOverride,
                       bool entryFromMain,
                       Rect backgroundSelectedRect,
                       Rect spriteObjectFieldRect,
                       Rect labelTextfieldRect,
                       ref bool canRemoveSelectedEntry,
                       ref bool selectedEntryIsOverwrite)
        {
            var element = spriteListProp.GetArrayElementAtIndex(index);

            if (gridState.selectedIndex == index)
            {
                canRemoveSelectedEntry   = entryFromMain && spriteOverride || !entryFromMain;
                selectedEntryIsOverwrite = entryFromMain && spriteOverride;
                if (Event.current.type == EventType.Repaint)
                {
                    m_Style.gridList.Draw(backgroundSelectedRect, true, true, true, false);
                }
            }
            spriteOverrideProperty.objectReferenceValue = EditorGUI.ObjectField(spriteObjectFieldRect, spriteOverrideProperty.objectReferenceValue, typeof(Sprite), false) as Sprite;
            if (Event.current.type == EventType.MouseUp &&
                backgroundSelectedRect.Contains(Event.current.mousePosition))
            {
                gridState.selectedIndex = index;
            }

            if (!entryFromMain || spriteOverride)
            {
                var overrideIconRect = spriteObjectFieldRect;
                overrideIconRect.x     -= 12;
                overrideIconRect.y     -= 12;
                overrideIconRect.width  = 20;
                overrideIconRect.height = 20;
                GUI.Label(overrideIconRect, m_Style.overrideIcon);
            }

            //disable m_Name editing if the entry is from main
            using (new EditorGUI.DisabledScope(entryFromMain))
            {
                EditorGUI.BeginChangeCheck();
                var oldName = element.FindPropertyRelative(SpriteLibraryPropertyString.name).stringValue;
                if (string.IsNullOrEmpty(oldName) && spriteOverrideProperty.objectReferenceValue != null && entryFromMain)
                {
                    oldName = spriteOverrideProperty.name;
                    SetPropertyName(element, oldName);
                }
                var  nameRect      = labelTextfieldRect;
                bool nameDuplicate = IsEntryNameUsed(oldName, spriteListProp, 1);
                if (nameDuplicate)
                {
                    nameRect.width -= 20;
                }

                var newName = EditorGUI.DelayedTextField(
                    nameRect,
                    GUIContent.none,
                    oldName);

                if (nameDuplicate)
                {
                    nameRect.x    += nameRect.width;
                    nameRect.width = 20;
                    GUI.Label(nameRect, m_Style.duplicateWarning);
                }
                if (EditorGUI.EndChangeCheck() && !string.IsNullOrEmpty(newName))
                {
                    newName = newName.Trim();
                    SetPropertyName(element, newName);
                }
            }
        }