You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/Internal/OptionControlFactory.cs

110 lines
3.6 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;
}
}
}