212 lines
6.1 KiB
C#
212 lines
6.1 KiB
C#
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using UnityEngine;
|
|||
|
#if FAIRYGUI_TOLUA
|
|||
|
using LuaInterface;
|
|||
|
#endif
|
|||
|
|
|||
|
namespace FairyGUI
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
public class UIObjectFactory
|
|||
|
{
|
|||
|
public delegate GComponent GComponentCreator();
|
|||
|
public delegate GLoader GLoaderCreator();
|
|||
|
|
|||
|
static Dictionary<string, GComponentCreator> packageItemExtensions = new Dictionary<string, GComponentCreator>();
|
|||
|
static GLoaderCreator loaderCreator;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="url"></param>
|
|||
|
/// <param name="type"></param>
|
|||
|
public static void SetPackageItemExtension(string url, System.Type type)
|
|||
|
{
|
|||
|
SetPackageItemExtension(url, () => { return (GComponent)Activator.CreateInstance(type); });
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="url"></param>
|
|||
|
/// <param name="creator"></param>
|
|||
|
public static void SetPackageItemExtension(string url, GComponentCreator creator)
|
|||
|
{
|
|||
|
if (url == null)
|
|||
|
throw new Exception("Invaild url: " + url);
|
|||
|
|
|||
|
PackageItem pi = UIPackage.GetItemByURL(url);
|
|||
|
if (pi != null)
|
|||
|
pi.extensionCreator = creator;
|
|||
|
|
|||
|
packageItemExtensions[url] = creator;
|
|||
|
}
|
|||
|
|
|||
|
#if FAIRYGUI_TOLUA
|
|||
|
public static void SetExtension(string url, System.Type baseType, LuaFunction extendFunction)
|
|||
|
{
|
|||
|
SetPackageItemExtension(url, () =>
|
|||
|
{
|
|||
|
GComponent gcom = (GComponent)Activator.CreateInstance(baseType);
|
|||
|
|
|||
|
extendFunction.BeginPCall();
|
|||
|
extendFunction.Push(gcom);
|
|||
|
extendFunction.PCall();
|
|||
|
gcom.SetLuaPeer(extendFunction.CheckLuaTable());
|
|||
|
extendFunction.EndPCall();
|
|||
|
|
|||
|
return gcom;
|
|||
|
});
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="type"></param>
|
|||
|
public static void SetLoaderExtension(System.Type type)
|
|||
|
{
|
|||
|
loaderCreator = () => { return (GLoader)Activator.CreateInstance(type); };
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="creator"></param>
|
|||
|
public static void SetLoaderExtension(GLoaderCreator creator)
|
|||
|
{
|
|||
|
loaderCreator = creator;
|
|||
|
}
|
|||
|
|
|||
|
internal static void ResolvePackageItemExtension(PackageItem pi)
|
|||
|
{
|
|||
|
if (!packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.id + pi.id, out pi.extensionCreator)
|
|||
|
&& !packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.name + "/" + pi.name, out pi.extensionCreator))
|
|||
|
pi.extensionCreator = null;
|
|||
|
}
|
|||
|
|
|||
|
public static void Clear()
|
|||
|
{
|
|||
|
packageItemExtensions.Clear();
|
|||
|
loaderCreator = null;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="pi"></param>
|
|||
|
/// <param name="userClass"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static GObject NewObject(PackageItem pi, System.Type userClass = null)
|
|||
|
{
|
|||
|
GObject obj;
|
|||
|
if (pi.type == PackageItemType.Component)
|
|||
|
{
|
|||
|
if (userClass != null)
|
|||
|
{
|
|||
|
Stats.LatestObjectCreation++;
|
|||
|
obj = (GComponent)Activator.CreateInstance(userClass);
|
|||
|
}
|
|||
|
else if (pi.extensionCreator != null)
|
|||
|
{
|
|||
|
Stats.LatestObjectCreation++;
|
|||
|
obj = pi.extensionCreator();
|
|||
|
}
|
|||
|
else
|
|||
|
obj = NewObject(pi.objectType);
|
|||
|
}
|
|||
|
else
|
|||
|
obj = NewObject(pi.objectType);
|
|||
|
|
|||
|
if (obj != null)
|
|||
|
obj.packageItem = pi;
|
|||
|
|
|||
|
return obj;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
///
|
|||
|
/// </summary>
|
|||
|
/// <param name="type"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public static GObject NewObject(ObjectType type)
|
|||
|
{
|
|||
|
Stats.LatestObjectCreation++;
|
|||
|
|
|||
|
switch (type)
|
|||
|
{
|
|||
|
case ObjectType.Image:
|
|||
|
return new GImage();
|
|||
|
|
|||
|
case ObjectType.MovieClip:
|
|||
|
return new GMovieClip();
|
|||
|
|
|||
|
case ObjectType.Component:
|
|||
|
return new GComponent();
|
|||
|
|
|||
|
case ObjectType.Text:
|
|||
|
return new GTextField();
|
|||
|
|
|||
|
case ObjectType.RichText:
|
|||
|
return new GRichTextField();
|
|||
|
|
|||
|
case ObjectType.InputText:
|
|||
|
return new GTextInput();
|
|||
|
|
|||
|
case ObjectType.Group:
|
|||
|
return new GGroup();
|
|||
|
|
|||
|
case ObjectType.List:
|
|||
|
return new GList();
|
|||
|
|
|||
|
case ObjectType.Graph:
|
|||
|
return new GGraph();
|
|||
|
|
|||
|
case ObjectType.Loader:
|
|||
|
if (loaderCreator != null)
|
|||
|
return loaderCreator();
|
|||
|
else
|
|||
|
return new GLoader();
|
|||
|
|
|||
|
case ObjectType.Button:
|
|||
|
return new GButton();
|
|||
|
|
|||
|
case ObjectType.Label:
|
|||
|
return new GLabel();
|
|||
|
|
|||
|
case ObjectType.ProgressBar:
|
|||
|
return new GProgressBar();
|
|||
|
|
|||
|
case ObjectType.Slider:
|
|||
|
return new GSlider();
|
|||
|
|
|||
|
case ObjectType.ScrollBar:
|
|||
|
return new GScrollBar();
|
|||
|
|
|||
|
case ObjectType.ComboBox:
|
|||
|
return new GComboBox();
|
|||
|
|
|||
|
case ObjectType.Tree:
|
|||
|
return new GTree();
|
|||
|
|
|||
|
case ObjectType.Loader3D:
|
|||
|
return new GLoader3D();
|
|||
|
|
|||
|
default:
|
|||
|
return null;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
#if UNITY_2019_3_OR_NEWER
|
|||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
|||
|
static void InitializeOnLoad()
|
|||
|
{
|
|||
|
Clear();
|
|||
|
}
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|