@@ -43,11 +43,13 @@ sealed class MainMenu : MonoBehaviour, IMainMenu, IConnectInterfaces, IInstantia
4343 float m_LastRotationInput ;
4444 MenuHideFlags m_MenuHideFlags = MenuHideFlags . Hidden ;
4545 readonly Dictionary < Type , MainMenuButton > m_ToolButtons = new Dictionary < Type , MainMenuButton > ( ) ;
46+ readonly Dictionary < ISettingsMenuProvider , GameObject > m_SettingsMenus = new Dictionary < ISettingsMenuProvider , GameObject > ( ) ;
47+ readonly Dictionary < ISettingsMenuItemProvider , GameObject > m_SettingsMenuItems = new Dictionary < ISettingsMenuItemProvider , GameObject > ( ) ;
4648
4749 public List < Type > menuTools { private get ; set ; }
4850 public List < Type > menuWorkspaces { private get ; set ; }
49- public Dictionary < KeyValuePair < Type , Transform > , ISettingsMenuProvider > settingsMenuProviders { private get ; set ; }
50- public Dictionary < KeyValuePair < Type , Transform > , ISettingsMenuItemProvider > settingsMenuItemProviders { private get ; set ; }
51+ public Dictionary < KeyValuePair < Type , Transform > , ISettingsMenuProvider > settingsMenuProviders { get ; set ; }
52+ public Dictionary < KeyValuePair < Type , Transform > , ISettingsMenuItemProvider > settingsMenuItemProviders { get ; set ; }
5153 public List < ActionMenuData > menuActions { get ; set ; }
5254 public Transform targetRayOrigin { private get ; set ; }
5355 public Type proxyType { private get ; set ; }
@@ -112,14 +114,7 @@ void Start()
112114 m_MainMenuUI . menuOrigin = menuOrigin ;
113115 m_MainMenuUI . Setup ( ) ;
114116
115- var types = new HashSet < Type > ( ) ;
116- types . UnionWith ( menuTools ) ;
117- types . UnionWith ( menuWorkspaces ) ;
118- types . UnionWith ( settingsMenuProviders . Keys . Select ( provider => provider . Key ) ) ;
119- types . UnionWith ( settingsMenuItemProviders . Keys . Select ( provider => provider . Key ) ) ;
120-
121- CreateFaceButtons ( types . ToList ( ) ) ;
122- m_MainMenuUI . SetupMenuFaces ( ) ;
117+ CreateFaceButtons ( ) ;
123118 UpdateToolButtons ( ) ;
124119 }
125120
@@ -151,8 +146,14 @@ void OnDestroy()
151146 ObjectUtils . Destroy ( m_MainMenuUI . gameObject ) ;
152147 }
153148
154- void CreateFaceButtons ( List < Type > types )
149+ void CreateFaceButtons ( )
155150 {
151+ var types = new HashSet < Type > ( ) ;
152+ types . UnionWith ( menuTools ) ;
153+ types . UnionWith ( menuWorkspaces ) ;
154+ types . UnionWith ( settingsMenuProviders . Keys . Select ( provider => provider . Key ) ) ;
155+ types . UnionWith ( settingsMenuItemProviders . Keys . Select ( provider => provider . Key ) ) ;
156+
156157 foreach ( var type in types )
157158 {
158159 var customMenuAttribute = ( MainMenuItemAttribute ) type . GetCustomAttributes ( typeof ( MainMenuItemAttribute ) , false ) . FirstOrDefault ( ) ;
@@ -191,7 +192,8 @@ void CreateFaceButtons(List<Type> types)
191192 } ) ;
192193
193194 // Assign Tools Menu button preview properties
194- mainMenuButton . toolType = selectedType ;
195+ if ( mainMenuButton != null )
196+ mainMenuButton . toolType = selectedType ;
195197 }
196198
197199 if ( isWorkspace )
@@ -212,18 +214,7 @@ void CreateFaceButtons(List<Type> types)
212214 {
213215 var kvp = providerPair . Key ;
214216 if ( kvp . Key == type && ( kvp . Value == null || kvp . Value == rayOrigin ) )
215- {
216- var menuProvider = providerPair . Value ;
217- if ( buttonData == null )
218- buttonData = new MainMenuUI . ButtonData ( type . Name ) ;
219-
220- buttonData . sectionName = k_SettingsMenuSectionName ;
221-
222- CreateFaceButton ( buttonData , tooltip , ( ) =>
223- {
224- menuProvider . settingsMenuInstance = m_MainMenuUI . AddSubmenu ( k_SettingsMenuSectionName , menuProvider . settingsMenuPrefab ) ;
225- } ) ;
226- }
217+ AddSettingsMenu ( providerPair . Value , buttonData , tooltip ) ;
227218 }
228219 }
229220
@@ -233,15 +224,7 @@ void CreateFaceButtons(List<Type> types)
233224 {
234225 var kvp = providerPair . Key ;
235226 if ( kvp . Key == type && ( kvp . Value == null || kvp . Value == rayOrigin ) )
236- {
237- var itemProvider = providerPair . Value ;
238- if ( buttonData == null )
239- buttonData = new MainMenuUI . ButtonData ( type . Name ) ;
240-
241- buttonData . sectionName = "Settings" ;
242-
243- itemProvider . settingsMenuItemInstance = m_MainMenuUI . CreateCustomButton ( itemProvider . settingsMenuItemPrefab , buttonData ) ;
244- }
227+ AddSettingsMenuItem ( providerPair . Value ) ;
245228 }
246229 }
247230 }
@@ -250,6 +233,9 @@ void CreateFaceButtons(List<Type> types)
250233 MainMenuButton CreateFaceButton ( MainMenuUI . ButtonData buttonData , ITooltip tooltip , Action buttonClickCallback )
251234 {
252235 var mainMenuButton = m_MainMenuUI . CreateFaceButton ( buttonData ) ;
236+ if ( mainMenuButton == null )
237+ return null ;
238+
253239 var button = mainMenuButton . button ;
254240 button . onClick . RemoveAllListeners ( ) ;
255241 button . onClick . AddListener ( ( ) =>
@@ -295,6 +281,76 @@ void SendVisibilityPulse()
295281 {
296282 this . Pulse ( node , m_MenuHideFlags == 0 ? m_HidePulse : m_ShowPulse ) ;
297283 }
284+
285+ public void AddSettingsMenu ( ISettingsMenuProvider provider )
286+ {
287+ var type = provider . GetType ( ) ;
288+ var customMenuAttribute = ( MainMenuItemAttribute ) type . GetCustomAttributes ( typeof ( MainMenuItemAttribute ) , false ) . FirstOrDefault ( ) ;
289+
290+ ITooltip tooltip = null ;
291+ MainMenuUI . ButtonData buttonData ;
292+ if ( customMenuAttribute != null && customMenuAttribute . shown )
293+ {
294+ tooltip = customMenuAttribute . tooltip ;
295+
296+ buttonData = new MainMenuUI . ButtonData ( customMenuAttribute . name )
297+ {
298+ sectionName = customMenuAttribute . sectionName ,
299+ description = customMenuAttribute . description
300+ } ;
301+ }
302+ else
303+ {
304+ buttonData = new MainMenuUI . ButtonData ( type . Name ) ;
305+ }
306+
307+ AddSettingsMenu ( provider , buttonData , tooltip ) ;
308+ }
309+
310+ void AddSettingsMenu ( ISettingsMenuProvider provider , MainMenuUI . ButtonData buttonData , ITooltip tooltip )
311+ {
312+ buttonData . sectionName = k_SettingsMenuSectionName ;
313+
314+ CreateFaceButton ( buttonData , tooltip , ( ) =>
315+ {
316+ var instance = m_MainMenuUI . AddSubmenu ( k_SettingsMenuSectionName , provider . settingsMenuPrefab ) ;
317+ m_SettingsMenus [ provider ] = instance ;
318+ provider . settingsMenuInstance = instance ;
319+ } ) ;
320+ }
321+
322+ public void RemoveSettingsMenu ( ISettingsMenuProvider provider )
323+ {
324+ GameObject instance ;
325+ if ( m_SettingsMenus . TryGetValue ( provider , out instance ) )
326+ {
327+ if ( instance )
328+ ObjectUtils . Destroy ( instance ) ;
329+
330+ m_SettingsMenus . Remove ( provider ) ;
331+ }
332+ provider . settingsMenuInstance = null ;
333+ }
334+
335+ public void AddSettingsMenuItem ( ISettingsMenuItemProvider provider )
336+ {
337+ var instance = m_MainMenuUI . CreateCustomButton ( provider . settingsMenuItemPrefab , k_SettingsMenuSectionName ) ;
338+ m_SettingsMenuItems [ provider ] = instance ;
339+ provider . settingsMenuItemInstance = instance ;
340+ }
341+
342+ public void RemoveSettingsMenuItem ( ISettingsMenuItemProvider provider )
343+ {
344+ GameObject instance ;
345+ if ( m_SettingsMenuItems . TryGetValue ( provider , out instance ) )
346+ {
347+ if ( instance )
348+ ObjectUtils . Destroy ( instance ) ;
349+
350+ m_SettingsMenuItems . Remove ( provider ) ;
351+ }
352+ provider . settingsMenuItemInstance = null ;
353+ }
298354 }
299355}
300356#endif
0 commit comments