Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            }
        }