110 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			110 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | namespace SRDebugger.Internal | |||
|  | { | |||
|  |     using System; | |||
|  |     using System.Collections.Generic; | |||
|  |     using System.Linq; | |||
|  |     using SRF; | |||
|  |     using UI.Controls; | |||
|  |     using UI.Controls.Data; | |||
|  |     using UnityEngine; | |||
|  |     using Object = UnityEngine.Object; | |||
|  | 
 | |||
|  |     public static class OptionControlFactory | |||
|  |     { | |||
|  |         private static IList<DataBoundControl> _dataControlPrefabs; | |||
|  |         private static ActionControl _actionControlPrefab; | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Create a control from an <c>OptionDefinition</c>, optionally providing <paramref name="categoryPrefix" /> to remove | |||
|  |         /// the category name from the start of the control. | |||
|  |         /// </summary> | |||
|  |         /// <param name="from"></param> | |||
|  |         /// <param name="categoryPrefix"></param> | |||
|  |         /// <returns></returns> | |||
|  |         public static OptionsControlBase CreateControl(OptionDefinition from, string categoryPrefix = null) | |||
|  |         { | |||
|  |             if (_dataControlPrefabs == null) | |||
|  |             { | |||
|  |                 _dataControlPrefabs = Resources.LoadAll<DataBoundControl>(SRDebugPaths.DataControlsResourcesPath); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (_actionControlPrefab == null) | |||
|  |             { | |||
|  |                 _actionControlPrefab = | |||
|  |                     Resources.LoadAll<ActionControl>(SRDebugPaths.DataControlsResourcesPath).FirstOrDefault(); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (_actionControlPrefab == null) | |||
|  |             { | |||
|  |                 Debug.LogError("[SRDebugger.Options] Cannot find ActionControl prefab."); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (from.Property != null) | |||
|  |             { | |||
|  |                 return CreateDataControl(from, categoryPrefix); | |||
|  |             } | |||
|  | 
 | |||
|  |             if (from.Method != null) | |||
|  |             { | |||
|  |                 return CreateActionControl(from, categoryPrefix); | |||
|  |             } | |||
|  | 
 | |||
|  |             throw new Exception("OptionDefinition did not contain property or method."); | |||
|  |         } | |||
|  | 
 | |||
|  |         private static ActionControl CreateActionControl(OptionDefinition from, string categoryPrefix = null) | |||
|  |         { | |||
|  |             var control = SRInstantiate.Instantiate(_actionControlPrefab); | |||
|  | 
 | |||
|  |             if (control == null) | |||
|  |             { | |||
|  |                 Debug.LogWarning("[SRDebugger.OptionsTab] Error creating action control from prefab"); | |||
|  |                 return null; | |||
|  |             } | |||
|  | 
 | |||
|  |             control.SetMethod(from.Name, from.Method); | |||
|  |             control.Option = from; | |||
|  | 
 | |||
|  |             return control; | |||
|  |         } | |||
|  | 
 | |||
|  |         private static DataBoundControl CreateDataControl(OptionDefinition from, string categoryPrefix = null) | |||
|  |         { | |||
|  |             var prefab = _dataControlPrefabs.FirstOrDefault(p => p.CanBind(@from.Property.PropertyType, !from.Property.CanWrite)); | |||
|  | 
 | |||
|  |             if (prefab == null) | |||
|  |             { | |||
|  |                 Debug.LogWarning( | |||
|  |                     "[SRDebugger.OptionsTab] Can't find data control for type {0}".Fmt(from.Property.PropertyType)); | |||
|  |                 return null; | |||
|  |             } | |||
|  | 
 | |||
|  |             var instance = SRInstantiate.Instantiate(prefab); | |||
|  | 
 | |||
|  |             try | |||
|  |             { | |||
|  |                 var n = from.Name; | |||
|  | 
 | |||
|  |                 // Remove category name from the start of the property name | |||
|  |                 if (!string.IsNullOrEmpty(categoryPrefix) && n.StartsWith(categoryPrefix)) | |||
|  |                 { | |||
|  |                     n = n.Substring(categoryPrefix.Length); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 instance.Bind(n, from.Property); | |||
|  |                 instance.Option = from; | |||
|  |             } | |||
|  |             catch (Exception e) | |||
|  |             { | |||
|  |                 Debug.LogError("[SRDebugger.Options] Error binding to property {0}".Fmt(from.Name)); | |||
|  |                 Debug.LogException(e); | |||
|  | 
 | |||
|  |                 Object.Destroy(instance); | |||
|  |                 instance = null; | |||
|  |             } | |||
|  | 
 | |||
|  |             return instance; | |||
|  |         } | |||
|  |     } | |||
|  | } |