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;
 | |
|         }
 | |
|     }
 | |
| }
 |