public static object GenericListDrawer(object[] objects, InvokeWrapper wrapper) { var list = wrapper.Get <System.Collections.IList>(objects[0]); var target = objects[0] as Object; if (InspectorGUI.Foldout(EditorData.Instance.GetData(target, wrapper.Member.Name), InspectorGUI.MakeLabel(wrapper.Member))) { object insertElementBefore = null; object insertElementAfter = null; object eraseElement = null; var skin = InspectorEditor.Skin; var buttonLayout = new GUILayoutOption[] { GUILayout.Width(1.0f * EditorGUIUtility.singleLineHeight), GUILayout.Height(1.0f * EditorGUIUtility.singleLineHeight) }; foreach (var listObject in list) { using (InspectorGUI.IndentScope.Single) { GUILayout.BeginHorizontal(); { InspectorGUI.Separator(1.0f, EditorGUIUtility.singleLineHeight); if (InspectorGUI.Button(MiscIcon.EntryInsertBefore, true, "Insert new element before this.", buttonLayout)) { insertElementBefore = listObject; } if (InspectorGUI.Button(MiscIcon.EntryInsertAfter, true, "Insert new element after this.", buttonLayout)) { insertElementAfter = listObject; } if (InspectorGUI.Button(MiscIcon.EntryRemove, true, "Remove this element.", buttonLayout)) { eraseElement = listObject; } } GUILayout.EndHorizontal(); InspectorEditor.DrawMembersGUI(new Object[] { target }, ignored => listObject); } } InspectorGUI.Separator(1.0f, 0.5f * EditorGUIUtility.singleLineHeight); if (list.Count == 0) { GUILayout.Label(GUI.MakeLabel("Empty", true), skin.Label); } bool addElementToList = false; GUILayout.BeginHorizontal(); { GUILayout.FlexibleSpace(); addElementToList = InspectorGUI.Button(MiscIcon.EntryInsertAfter, true, "Add new element.", buttonLayout); } GUILayout.EndHorizontal(); object newObject = null; if (addElementToList || insertElementBefore != null || insertElementAfter != null) { newObject = Activator.CreateInstance(list.GetType().GetGenericArguments()[0], new object[] { }); } if (eraseElement != null) { list.Remove(eraseElement); } else if (newObject != null) { if (addElementToList || (list.Count > 0 && insertElementAfter != null && insertElementAfter == list[list.Count - 1])) { list.Add(newObject); } else if (insertElementAfter != null) { list.Insert(list.IndexOf(insertElementAfter) + 1, newObject); } else if (insertElementBefore != null) { list.Insert(list.IndexOf(insertElementBefore), newObject); } } if (eraseElement != null || newObject != null) { EditorUtility.SetDirty(target); } } // A bit of a hack until I figure out how to handle multi-selection // of lists, if that should be possible at all. We're handling the // list from inside this drawer and by returning null the return // value isn't propagated to any targets. return(null); }
public void OnInspectorGUI() { var skin = InspectorEditor.Skin; using (GUI.AlignBlock.Center) GUILayout.Label(GUI.MakeLabel("AGXUnity Editor Settings", 24, true), skin.Label); BuildPlayer_CopyBinaries = InspectorGUI.Toggle(GUI.MakeLabel("<b>Build:</b> Copy AGX Dynamics binaries", false, "[Recommended enabled]\nCopy dependent AGX Dynamics binaries to target player directory."), BuildPlayer_CopyBinaries); AGXDynamics_LogPath = InspectorGUI.ToggleSaveFile(GUI.MakeLabel("AGX Dynamics log"), AGXDynamics_LogEnabled, enable => AGXDynamics_LogEnabled = enable, AGXDynamics_LogPath, "AGXDynamicsLog", "txt", "AGX Dynamics log filename", extension => true); if (ExternalAGXInitializer.IsApplied) { DirectoryInfo newAgxDir = null; if (InspectorGUI.SelectFolder(GUI.MakeLabel("AGX Dynamics directory"), ExternalAGXInitializer.Instance.AGX_DIR, "AGX Dynamics directory", newFolder => newAgxDir = new DirectoryInfo(newFolder))) { if (ExternalAGXInitializer.FindType(newAgxDir) == ExternalAGXInitializer.AGXDirectoryType.Unknown) { Debug.LogError($"ERROR: {newAgxDir.FullName} doesn't seems to be an AGX Dynamics root folder."); } else if (EditorUtility.DisplayDialog("Change AGX Dynamics directory", $"Change from {ExternalAGXInitializer.Instance.AGX_DIR} to {newAgxDir.FullName}?\n\n" + "Unity will restart during the change.", "Yes", "Cancel")) { ExternalAGXInitializer.ChangeRootDirectory(newAgxDir); } } } else if (!IO.Utils.AGXDynamicsInstalledInProject && ExternalAGXInitializer.UserSaidNo) { var rect = EditorGUILayout.GetControlRect(); var orgWidth = rect.width; rect.width = EditorGUIUtility.labelWidth; EditorGUI.PrefixLabel(rect, GUI.MakeLabel("Select AGX Dynamics root folder"), skin.Label); rect.x += rect.width; rect.width = orgWidth - EditorGUIUtility.labelWidth; if (UnityEngine.GUI.Button(rect, GUI.MakeLabel("AGX Dynamics root directory..."))) { var agxDir = EditorUtility.OpenFolderPanel("AGX Dynamics root directory", "Assets", ""); if (!string.IsNullOrEmpty(agxDir)) { var agxDirInfo = new DirectoryInfo(agxDir); var type = ExternalAGXInitializer.FindType(agxDirInfo); if (type == ExternalAGXInitializer.AGXDirectoryType.Unknown) { Debug.LogWarning($"{agxDir} isn't recognized as an AGX Dynamics root directory."); } else if (EditorUtility.DisplayDialog("Add AGX Dynamics directory", $"Set AGX Dynamics root directory to {agxDir}?\n\n" + "Unity will restart during the process.", "Yes", "Cancel")) { ExternalAGXInitializer.UserSaidNo = false; ExternalAGXInitializer.ChangeRootDirectory(agxDirInfo); } } } } InspectorGUI.Separator(1, 4); // BuiltInToolsTool settings GUI. { HandleKeyHandlerGUI(GUI.MakeLabel("Select game object"), BuiltInToolsTool_SelectGameObjectKeyHandler); HandleKeyHandlerGUI(GUI.MakeLabel("Select rigid body game object"), BuiltInToolsTool_SelectRigidBodyKeyHandler); HandleKeyHandlerGUI(GUI.MakeLabel("Pick handler (scene view)"), BuiltInToolsTool_PickHandlerKeyHandler); } }