@@ -22,28 +22,32 @@ sealed class EditingContextManager : MonoBehaviour
2222
2323 const string k_LaunchOnExitPlaymode = "EditingContextManager.LaunchOnExitPlaymode" ;
2424
25+ IEditingContext m_CurrentContext ;
26+
2527 internal static EditingContextManager s_Instance ;
2628 static InputManager s_InputManager ;
29+ static List < IEditingContext > s_AvailableContexts ;
30+ static EditingContextManagerSettings s_Settings ;
31+ static UnityObject s_DefaultContext ;
2732
28- EditingContextManagerSettings m_Settings = null ;
29-
30- List < IEditingContext > m_AvailableContexts ;
31- string [ ] m_ContextNames = null ;
33+ string [ ] m_ContextNames ;
3234 int m_SelectedContextIndex ;
3335
34- IEditingContext m_CurrentContext ;
36+ Rect m_EditingContextPopupRect = new Rect ( 0 , 0 , 150 , 20 ) ; // Y and X position will be set based on window size
37+
3538 readonly List < IEditingContext > m_PreviousContexts = new List < IEditingContext > ( ) ;
3639
37- internal IEditingContext defaultContext
40+ internal static IEditingContext defaultContext
3841 {
3942 get
4043 {
41- var context = m_AvailableContexts . Find ( c => c . Equals ( m_DefaultContext ) ) ?? m_AvailableContexts . First ( ) ;
44+ var availableContexts = GetAvailableEditingContexts ( ) ;
45+ var context = availableContexts . Find ( c => c . Equals ( s_DefaultContext ) ) ?? availableContexts . First ( ) ;
4246
43- var defaultContextName = m_Settings . defaultContextName ;
47+ var defaultContextName = settings . defaultContextName ;
4448 if ( ! string . IsNullOrEmpty ( defaultContextName ) )
4549 {
46- var foundContext = m_AvailableContexts . Find ( c => c . name == defaultContextName ) ;
50+ var foundContext = availableContexts . Find ( c => c . name == defaultContextName ) ;
4751 if ( foundContext != null )
4852 context = foundContext ;
4953 }
@@ -52,7 +56,7 @@ internal IEditingContext defaultContext
5256 }
5357 set
5458 {
55- m_Settings . defaultContextName = value . name ;
59+ settings . defaultContextName = value . name ;
5660 }
5761 }
5862
@@ -61,6 +65,17 @@ internal IEditingContext currentContext
6165 get { return m_CurrentContext ; }
6266 }
6367
68+ static EditingContextManagerSettings settings
69+ {
70+ get
71+ {
72+ if ( ! s_Settings )
73+ s_Settings = LoadUserSettings ( ) ;
74+
75+ return s_Settings ;
76+ }
77+ }
78+
6479 static EditingContextManager ( )
6580 {
6681 VRView . viewEnabled += OnVRViewEnabled ;
@@ -129,31 +144,34 @@ static void OnPlayModeStateChanged(PlayModeStateChange stateChange)
129144 }
130145 }
131146
132- void OnEnable ( )
147+ void Awake ( )
133148 {
134- m_Settings = LoadUserSettings ( ) ;
135-
136- ISetEditingContextMethods . getAvailableEditingContexts = GetAvailableEditingContexts ;
137- ISetEditingContextMethods . getPreviousEditingContexts = GetPreviousEditingContexts ;
138- ISetEditingContextMethods . setEditingContext = SetEditingContext ;
139- ISetEditingContextMethods . restorePreviousEditingContext = RestorePreviousContext ;
149+ s_DefaultContext = m_DefaultContext ;
140150
141151 var availableContexts = GetAvailableEditingContexts ( ) ;
142152 m_ContextNames = availableContexts . Select ( c => c . name ) . ToArray ( ) ;
143153
144- if ( m_AvailableContexts . Count == 0 )
154+ if ( s_AvailableContexts . Count == 0 )
145155 throw new Exception ( "You can't start EditorXR without at least one context. Try re-importing the package or use version control to restore the default context asset" ) ;
146156
147- SetEditingContext ( defaultContext ) ;
148-
149- if ( m_AvailableContexts . Count > 1 )
157+ if ( s_AvailableContexts . Count > 1 )
150158 VRView . afterOnGUI += OnVRViewGUI ;
159+ }
160+
161+ void OnEnable ( )
162+ {
163+ ISetEditingContextMethods . getAvailableEditingContexts = GetAvailableEditingContexts ;
164+ ISetEditingContextMethods . getPreviousEditingContexts = GetPreviousEditingContexts ;
165+ ISetEditingContextMethods . setEditingContext = SetEditingContext ;
166+ ISetEditingContextMethods . restorePreviousEditingContext = RestorePreviousContext ;
151167
152168 // Force the window to repaint every tick, since we need live updating
153169 // This also allows scripts with [ExecuteInEditMode] to run
154170 EditorApplication . update += EditorApplication . QueuePlayerLoopUpdate ;
155171
156172 EditorApplication . playModeStateChanged += OnPlayModeStateChanged ;
173+
174+ SetEditingContext ( defaultContext ) ;
157175 }
158176
159177 void OnDisable ( )
@@ -170,40 +188,29 @@ void OnDisable()
170188 m_CurrentContext . Dispose ( ) ;
171189 }
172190
173- m_AvailableContexts = null ;
191+ s_AvailableContexts = null ;
192+
193+ SetEditingContext ( null ) ;
174194
175195 ISetEditingContextMethods . getAvailableEditingContexts = null ;
176196 ISetEditingContextMethods . getPreviousEditingContexts = null ;
177197 ISetEditingContextMethods . setEditingContext = null ;
178198 ISetEditingContextMethods . restorePreviousEditingContext = null ;
179199
180- SaveUserSettings ( m_Settings ) ;
200+ SaveUserSettings ( settings ) ;
181201 }
182202#endif
183203
184- void OnVRViewGUI ( EditorWindow window )
204+ void OnVRViewGUI ( VRView view )
185205 {
186- var view = ( VRView ) window ;
187- GUILayout . BeginArea ( view . guiRect ) ;
188- {
189- GUILayout . FlexibleSpace ( ) ;
190- GUILayout . BeginHorizontal ( ) ;
191- {
192- DoGUI ( m_ContextNames , ref m_SelectedContextIndex , ( ) => SetEditingContext ( m_AvailableContexts [ m_SelectedContextIndex ] ) ) ;
193- GUILayout . FlexibleSpace ( ) ;
194- }
195- GUILayout . EndHorizontal ( ) ;
196- }
197- GUILayout . EndArea ( ) ;
198- }
206+ var position = view . position ;
207+ m_EditingContextPopupRect . y = position . height - m_EditingContextPopupRect . height ;
208+ m_EditingContextPopupRect . x = position . width - m_EditingContextPopupRect . width ;
199209
200- internal static void DoGUI ( string [ ] contextNames , ref int selectedContextIndex , Action callback = null )
201- {
202- selectedContextIndex = EditorGUILayout . Popup ( string . Empty , selectedContextIndex , contextNames ) ;
210+ m_SelectedContextIndex = EditorGUI . Popup ( m_EditingContextPopupRect , string . Empty , m_SelectedContextIndex , m_ContextNames ) ;
203211 if ( GUI . changed )
204212 {
205- if ( callback != null )
206- callback ( ) ;
213+ SetEditingContext ( s_AvailableContexts [ m_SelectedContextIndex ] ) ;
207214 GUIUtility . ExitGUI ( ) ;
208215 }
209216 }
@@ -216,13 +223,15 @@ internal void SetEditingContext(IEditingContext context)
216223 if ( m_CurrentContext != null )
217224 {
218225 m_PreviousContexts . Insert ( 0 , m_CurrentContext ) ;
219- m_CurrentContext . Dispose ( ) ;
226+
227+ if ( m_CurrentContext . instanceExists )
228+ m_CurrentContext . Dispose ( ) ;
220229 }
221230
222231 context . Setup ( ) ;
223232 m_CurrentContext = context ;
224233
225- m_SelectedContextIndex = m_AvailableContexts . IndexOf ( context ) ;
234+ m_SelectedContextIndex = s_AvailableContexts . IndexOf ( context ) ;
226235 }
227236
228237 internal void RestorePreviousContext ( )
@@ -254,12 +263,12 @@ internal static string[] GetEditingContextNames()
254263 return availableContexts . Select ( c => c . name ) . ToArray ( ) ;
255264 }
256265
257- List < IEditingContext > GetAvailableEditingContexts ( )
266+ static List < IEditingContext > GetAvailableEditingContexts ( )
258267 {
259- if ( m_AvailableContexts == null )
260- m_AvailableContexts = GetEditingContextAssets ( ) ;
268+ if ( s_AvailableContexts == null )
269+ s_AvailableContexts = GetEditingContextAssets ( ) ;
261270
262- return m_AvailableContexts ;
271+ return s_AvailableContexts ;
263272 }
264273
265274 List < IEditingContext > GetPreviousEditingContexts ( )
0 commit comments