public void DeselectChildren()
 {
     foreach (AssetItem asset in children)
     {
         if (asset is FolderItem)
         {
             FolderItem folder = (FolderItem)asset;
             folder.selected = false;
             folder.DeselectChildren();
         }
         else
         {
             asset.selected = false;
         }
     }
 }
    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);
            }
        }
    }