public int ChildrenSelected()            // -1: Any, 0: None, 1: All
        {
            bool any = false, all = true;

            foreach (AssetItem asset in children)
            {
                if (asset is FolderItem)
                {
                    FolderItem folder = (FolderItem)asset;
                    int        cs     = folder.ChildrenSelected();

                    any |= cs != 0;
                    all &= cs == 1;
                }
                else
                {
                    any |= asset.selected;
                    all &= asset.selected;
                }
                if (any && !all)
                {
                    break;
                }
            }
            return(any ? (all ? 1 : -1) : 0);
        }
    void DoItemGUI(AssetItem item)
    {
        GUIContent content = new GUIContent(EditorGUIUtility.ObjectContent(item.asset, item.asset.GetType()));

        content.text = item.name;

        if (item is FolderItem)
        {
            FolderItem folder = (FolderItem)item;

            Rect fRect            = EditorGUILayout.BeginHorizontal();
            int  childrenSelected = folder.ChildrenSelected();
            EditorGUI.showMixedValue = childrenSelected < 0;            //Some but not all
            folder.foldout           = ContentlessFoldout.DoFoldout(folder.foldout);

            GUI.changed = false;
            bool selectFolder = EditorGUILayout.ToggleLeft(content, folder.selected);
            if (GUI.changed)
            {
                if (EditorGUI.showMixedValue)                  //selectFolder == true if toggle was clicked
                {
                    if (selectFolder)
                    {
                        folder.selected = false;
                        folder.DeselectChildren();
                    }
                }
                else
                {
                    if (folder.selected = selectFolder)
                    {
                        folder.SelectChildren();
                    }
                    else
                    {
                        folder.DeselectChildren();
                    }
                }
            }
            folder.selected = childrenSelected != 0;

            EditorGUILayout.EndHorizontal();
            if (Event.current.type == EventType.ContextClick && fRect.Contains(Event.current.mousePosition))
            {
                FolderContextMenu(folder);
            }

            if (folder.foldout)
            {
                EditorGUI.indentLevel++;
                foreach (AssetItem i in folder.children)
                {
                    DoItemGUI(i);
                }
                EditorGUI.indentLevel--;
            }
        }
        else
        {
            Rect iRect = EditorGUILayout.BeginHorizontal();
            EditorGUI.showMixedValue = false;
            GUILayout.Space(20f);
            item.selected = EditorGUILayout.ToggleLeft(content, item.selected);
            EditorGUILayout.EndHorizontal();
            if (Event.current.type == EventType.ContextClick && iRect.Contains(Event.current.mousePosition))
            {
                AssetContextMenu(item);
            }
        }
    }