You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
5.8 KiB
202 lines
5.8 KiB
using System; |
|
using System.Collections.Generic; |
|
#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; |
|
} |
|
} |
|
} |
|
}
|
|
|