using UnityEngine; using UnityEditor; using System.Reflection; using System.Linq; using UnityEngine.ProBuilder; namespace UnityEditor.ProBuilder { /// /// /// Options menu window container. Do not instantiate this yourself, the toolbar will handle opening option windows. /// sealed class MenuOption : EditorWindow { System.Action onSettingsGUI = null; System.Action onSettingsDisable = null; internal static MenuOption Show(System.Action onSettingsGUI, System.Action onSettingsEnable, System.Action onSettingsDisable) { MenuOption win = EditorWindow.GetWindow(true, "Options", true); win.hideFlags = HideFlags.HideAndDontSave; if (win.onSettingsDisable != null) win.onSettingsDisable(); if (onSettingsEnable != null) onSettingsEnable(); win.onSettingsDisable = onSettingsDisable; win.onSettingsGUI = onSettingsGUI; // don't let window hang around after a script reload nukes the pb_MenuAction instances object parent = ReflectionUtility.GetValue(win, typeof(EditorWindow), "m_Parent"); object window = ReflectionUtility.GetValue(parent, typeof(EditorWindow), "window"); ReflectionUtility.SetValue(parent, "mouseRayInvisible", true); ReflectionUtility.SetValue(window, "m_DontSaveToLayout", true); win.Show(); return win; } /// /// Close any currently open option windows. /// public static void CloseAll() { foreach (MenuOption win in Resources.FindObjectsOfTypeAll()) win.Close(); } void OnEnable() { autoRepaintOnSceneChange = true; } void OnDisable() { if (onSettingsDisable != null) onSettingsDisable(); } void OnSelectionChange() { Repaint(); } void OnHierarchyChange() { Repaint(); } void OnGUI() { if (onSettingsGUI != null) { onSettingsGUI(); } else if (Event.current.type == EventType.Repaint) { EditorApplication.delayCall += CloseAll; GUIUtility.ExitGUI(); } } } }