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); } } }