using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityInternals = Unity.PlasticSCM.Editor.UnityInternals; namespace Unity.Cloud.Collaborate { [InitializeOnLoad] static class UnityInternalsInjector { static UnityInternalsInjector() { UnityInternals.UnityEditor.EditorGUI.ScrollableTextAreaInternal = (Rect position, string text, ref Vector2 scrollPosition, GUIStyle style) => { return EditorGUI.ScrollableTextAreaInternal(position, text, ref scrollPosition, style); }; UnityInternals.UnityEditor.SettingsWindow.ShowInternal = (SettingsScope scopes, string settingsPath) => { SettingsWindow settingsWindow = SettingsWindow.Show(scopes, settingsPath); if (settingsWindow == null) return null; return new UnityInternals.UnityEditor.SettingsWindow(settingsWindow); }; UnityInternals.UnityEditor.SettingsWindow.GetCurrentProviderInternal = (UnityInternals.UnityEditor.SettingsWindow settingsWindow) => { return ((SettingsWindow)settingsWindow.InternalObject).GetCurrentProvider(); }; UnityInternals.UnityEditor.DockArea.AddTabInternal = (UnityInternals.UnityEditor.DockArea dockArea, EditorWindow pane, bool sendPaneEvents) => { ((DockArea)dockArea.InternalObject).AddTab(pane, sendPaneEvents); }; UnityInternals.UnityEditor.UnityEditorExtensions.m_ParentInternal = (EditorWindow editorWindow) => { HostView hostView = editorWindow.m_Parent; if (hostView == null) return null; return new UnityInternals.UnityEditor.HostView(hostView); }; UnityInternals.UnityEditor.HostView.GetActualViewInternal = (UnityInternals.UnityEditor.HostView hostView) => { FieldInfo actualViewField = typeof(HostView).GetField( "m_ActualView", BindingFlags.Instance | BindingFlags.NonPublic); return actualViewField?.GetValue(hostView.InternalObject) as EditorWindow; }; UnityInternals.UnityEditor.Menu.AddMenuItem = (string name, string shortcut, bool @checked, int priority, Action execute, Func validate) => { Menu.AddMenuItem(name, shortcut, @checked, priority, execute, validate); }; UnityInternals.UnityEditor.Menu.RemoveMenuItem = (string name) => { Menu.RemoveMenuItem(name); }; UnityInternals.UnityEditor.EditorUtility.Internal_UpdateAllMenus = () => { EditorUtility.Internal_UpdateAllMenus(); }; UnityInternals.UnityEditor.HostView.GetWindow = (UnityInternals.UnityEditor.HostView hostView) => { ContainerWindow containerWindow = ((HostView)hostView.InternalObject).window; if (containerWindow == null) return null; return new UnityInternals.UnityEditor.ContainerWindow(containerWindow); }; UnityInternals.UnityEditor.EditorWindow.Internal_MakeModal = (UnityInternals.UnityEditor.ContainerWindow containerWindow) => { EditorWindow.Internal_MakeModal((ContainerWindow)containerWindow.InternalObject); }; UnityInternals.UnityEditor.UnityEditorExtensions.ShowWithModeInternal = (EditorWindow editorWindow, int mode) => { editorWindow.ShowWithMode((ShowMode)mode); }; UnityInternals.UnityEditor.SavedGUIState.Create = () => { return new UnityInternals.UnityEditor.SavedGUIState(SavedGUIState.Create()); }; UnityInternals.UnityEditor.SavedGUIState.ApplyAndForgetInternal = (UnityInternals.UnityEditor.SavedGUIState savedGUIState) => { ((SavedGUIState)savedGUIState.InternalObject).ApplyAndForget(); }; UnityInternals.UnityEditor.SplitterState.Constructor = (float[] relativeSizes, int[] minSizes, int[] maxSizes) => { return new SplitterState(relativeSizes, minSizes, maxSizes); }; UnityInternals.UnityEditor.SplitterState.GetRelativeSizes = (UnityInternals.UnityEditor.SplitterState splitterState) => { return ((SplitterState)splitterState.InternalObject).relativeSizes; }; UnityInternals.UnityEditor.SplitterGUILayout.BeginHorizontalSplit = (UnityInternals.UnityEditor.SplitterState splitterState, GUILayoutOption[] guiLayoutOptions) => { SplitterGUILayout.BeginHorizontalSplit( (SplitterState)splitterState.InternalObject, guiLayoutOptions); }; UnityInternals.UnityEditor.SplitterGUILayout.EndHorizontalSplit = () => { SplitterGUILayout.EndHorizontalSplit(); }; UnityInternals.UnityEditor.SplitterGUILayout.BeginVerticalSplit = (UnityInternals.UnityEditor.SplitterState splitterState, GUILayoutOption[] guiLayoutOptions) => { SplitterGUILayout.BeginVerticalSplit( (SplitterState)splitterState.InternalObject, guiLayoutOptions); }; UnityInternals.UnityEditor.SplitterGUILayout.EndVerticalSplit = () => { SplitterGUILayout.EndVerticalSplit(); }; UnityInternals.UnityEditor.SceneManagement.PrefabStageExtensions.SaveInternal = (PrefabStage prefabStage) => { return prefabStage.Save(); }; UnityInternals.UnityEditor.GenericMenuExtensions.GetMenuItems = (GenericMenu genericMenu) => { List menuItems = genericMenu.menuItems; if (menuItems == null) return null; return menuItems.Select(menuItem => new UnityInternals.UnityEditor.GenericMenu.MenuItem(menuItem)).ToList(); }; UnityInternals.UnityEditor.GenericMenu.MenuItem.GetContent = (UnityInternals.UnityEditor.GenericMenu.MenuItem menuItem) => { return ((GenericMenu.MenuItem)menuItem.InternalObject).content; }; UnityInternals.UnityEditor.GenericMenu.MenuItem.GetFunc = (UnityInternals.UnityEditor.GenericMenu.MenuItem menuItem) => { return ((GenericMenu.MenuItem)menuItem.InternalObject).func; }; } } }