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.
1726 lines
53 KiB
1726 lines
53 KiB
using System; |
|
using System.Collections.Generic; |
|
using UnityEngine; |
|
using FairyGUI.Utils; |
|
#if FAIRYGUI_TOLUA |
|
using LuaInterface; |
|
#endif |
|
|
|
namespace FairyGUI |
|
{ |
|
/// <summary> |
|
/// Component |
|
/// </summary> |
|
public class GComponent : GObject |
|
{ |
|
/// <summary> |
|
/// Root container. |
|
/// </summary> |
|
public Container rootContainer { get; private set; } |
|
/// <summary> |
|
/// Content container. If the component is not clipped, then container==rootContainer. |
|
/// </summary> |
|
public Container container { get; protected set; } |
|
/// <summary> |
|
/// ScrollPane of the component. If the component is not scrollable, the value is null. |
|
/// </summary> |
|
public ScrollPane scrollPane { get; private set; } |
|
|
|
internal List<GObject> _children; |
|
internal List<Controller> _controllers; |
|
internal List<Transition> _transitions; |
|
internal bool _buildingDisplayList; |
|
|
|
protected Margin _margin; |
|
protected bool _trackBounds; |
|
protected bool _boundsChanged; |
|
protected ChildrenRenderOrder _childrenRenderOrder; |
|
protected int _apexIndex; |
|
internal Vector2 _alignOffset; |
|
|
|
Vector2 _clipSoftness; |
|
int _sortingChildCount; |
|
Action _buildDelegate; |
|
Controller _applyingController; |
|
|
|
EventListener _onDrop; |
|
|
|
public GComponent() |
|
{ |
|
_children = new List<GObject>(); |
|
_controllers = new List<Controller>(); |
|
_transitions = new List<Transition>(); |
|
_margin = new Margin(); |
|
_buildDelegate = BuildNativeDisplayList; |
|
} |
|
|
|
override protected void CreateDisplayObject() |
|
{ |
|
rootContainer = new Container("GComponent"); |
|
rootContainer.gOwner = this; |
|
rootContainer.onUpdate += OnUpdate; |
|
container = rootContainer; |
|
|
|
displayObject = rootContainer; |
|
} |
|
|
|
override public void Dispose() |
|
{ |
|
int cnt = _transitions.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
Transition trans = _transitions[i]; |
|
trans.Dispose(); |
|
} |
|
|
|
cnt = _controllers.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
Controller c = _controllers[i]; |
|
c.Dispose(); |
|
} |
|
|
|
if (scrollPane != null) |
|
scrollPane.Dispose(); |
|
|
|
base.Dispose(); //Dispose native tree first, avoid DisplayObject.RemoveFromParent call |
|
|
|
cnt = _children.Count; |
|
for (int i = cnt - 1; i >= 0; --i) |
|
{ |
|
GObject obj = _children[i]; |
|
obj.InternalSetParent(null); //Avoid GObject.RemoveParent call |
|
obj.Dispose(); |
|
} |
|
|
|
#if FAIRYGUI_TOLUA |
|
if (_peerTable != null) |
|
{ |
|
_peerTable.Dispose(); |
|
_peerTable = null; |
|
} |
|
#endif |
|
|
|
#if FAIRYGUI_PUERTS |
|
if (__onDispose != null) |
|
__onDispose(); |
|
__onConstruct = null; |
|
__onDispose = null; |
|
#endif |
|
} |
|
|
|
/// <summary> |
|
/// Dispatched when an object was dragged and dropped to this component. |
|
/// </summary> |
|
public EventListener onDrop |
|
{ |
|
get { return _onDrop ?? (_onDrop = new EventListener(this, "onDrop")); } |
|
} |
|
|
|
/// <summary> |
|
/// Draw call optimization switch. |
|
/// </summary> |
|
public bool fairyBatching |
|
{ |
|
get { return rootContainer.fairyBatching; } |
|
set { rootContainer.fairyBatching = value; } |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="childChanged"></param> |
|
public void InvalidateBatchingState(bool childChanged) |
|
{ |
|
if (childChanged) |
|
container.InvalidateBatchingState(childChanged); |
|
else |
|
rootContainer.InvalidateBatchingState(); |
|
} |
|
|
|
/// <summary> |
|
/// If true, mouse/touch events cannot pass through the empty area of the component. Default is true. |
|
/// </summary> |
|
public bool opaque |
|
{ |
|
get { return rootContainer.opaque; } |
|
set { rootContainer.opaque = value; } |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <value></value> |
|
public Margin margin |
|
{ |
|
get { return _margin; } |
|
set |
|
{ |
|
_margin = value; |
|
if (rootContainer.clipRect != null && scrollPane == null) //如果scrollPane不为空,则HandleSizeChanged里面的处理会促使ScrollPane处理 |
|
container.SetXY(_margin.left + _alignOffset.x, _margin.top + _alignOffset.y); |
|
HandleSizeChanged(); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
public ChildrenRenderOrder childrenRenderOrder |
|
{ |
|
get { return _childrenRenderOrder; } |
|
set |
|
{ |
|
if (_childrenRenderOrder != value) |
|
{ |
|
_childrenRenderOrder = value; |
|
BuildNativeDisplayList(); |
|
} |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
public int apexIndex |
|
{ |
|
get { return _apexIndex; } |
|
set |
|
{ |
|
if (_apexIndex != value) |
|
{ |
|
_apexIndex = value; |
|
|
|
if (_childrenRenderOrder == ChildrenRenderOrder.Arch) |
|
BuildNativeDisplayList(); |
|
} |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// If true, children can be navigated by TAB from first to last, and repeat |
|
/// </summary> |
|
public bool tabStopChildren |
|
{ |
|
get { return rootContainer.tabStopChildren; } |
|
set { rootContainer.tabStopChildren = value; } |
|
} |
|
|
|
/// <summary> |
|
/// Add a child to the component. It will be at the frontmost position. |
|
/// </summary> |
|
/// <param name="child">A child object</param> |
|
/// <returns>GObject</returns> |
|
public GObject AddChild(GObject child) |
|
{ |
|
AddChildAt(child, _children.Count); |
|
return child; |
|
} |
|
|
|
/// <summary> |
|
/// Adds a child to the component at a certain index. |
|
/// </summary> |
|
/// <param name="child">A child object</param> |
|
/// <param name="index">Index</param> |
|
/// <returns>GObject</returns> |
|
virtual public GObject AddChildAt(GObject child, int index) |
|
{ |
|
if (index >= 0 && index <= _children.Count) |
|
{ |
|
if (child.parent == this) |
|
{ |
|
SetChildIndex(child, index); |
|
} |
|
else |
|
{ |
|
child.RemoveFromParent(); |
|
child.InternalSetParent(this); |
|
|
|
int cnt = _children.Count; |
|
if (child.sortingOrder != 0) |
|
{ |
|
_sortingChildCount++; |
|
index = GetInsertPosForSortingChild(child); |
|
} |
|
else if (_sortingChildCount > 0) |
|
{ |
|
if (index > (cnt - _sortingChildCount)) |
|
index = cnt - _sortingChildCount; |
|
} |
|
|
|
if (index == cnt) |
|
_children.Add(child); |
|
else |
|
_children.Insert(index, child); |
|
|
|
ChildStateChanged(child); |
|
SetBoundsChangedFlag(); |
|
} |
|
return child; |
|
} |
|
else |
|
{ |
|
throw new Exception("Invalid child index: " + index + ">" + _children.Count); |
|
} |
|
} |
|
|
|
int GetInsertPosForSortingChild(GObject target) |
|
{ |
|
int cnt = _children.Count; |
|
int i; |
|
for (i = 0; i < cnt; i++) |
|
{ |
|
GObject child = _children[i]; |
|
if (child == target) |
|
continue; |
|
|
|
if (target.sortingOrder < child.sortingOrder) |
|
break; |
|
} |
|
return i; |
|
} |
|
|
|
/// <summary> |
|
/// Removes a child from the component. If the object is not a child, nothing happens. |
|
/// </summary> |
|
/// <param name="child">A child object</param> |
|
/// <returns>GObject</returns> |
|
public GObject RemoveChild(GObject child) |
|
{ |
|
return RemoveChild(child, false); |
|
} |
|
|
|
/// <summary> |
|
/// Removes a child from the component. If the object is not a child, nothing happens. |
|
/// </summary> |
|
/// <param name="child">A child object</param> |
|
/// <param name="dispose">If true, the child will be disposed right away.</param> |
|
/// <returns>GObject</returns> |
|
public GObject RemoveChild(GObject child, bool dispose) |
|
{ |
|
int childIndex = _children.IndexOf(child); |
|
if (childIndex != -1) |
|
{ |
|
RemoveChildAt(childIndex, dispose); |
|
} |
|
return child; |
|
} |
|
|
|
/// <summary> |
|
/// Removes a child at a certain index. Children above the child will move down. |
|
/// </summary> |
|
/// <param name="index">Index</param> |
|
/// <returns>GObject</returns> |
|
public GObject RemoveChildAt(int index) |
|
{ |
|
return RemoveChildAt(index, false); |
|
} |
|
|
|
/// <summary> |
|
/// Removes a child at a certain index. Children above the child will move down. |
|
/// </summary> |
|
/// <param name="index">Index</param> |
|
/// <param name="dispose">If true, the child will be disposed right away.</param> |
|
/// <returns>GObject</returns> |
|
virtual public GObject RemoveChildAt(int index, bool dispose) |
|
{ |
|
if (index >= 0 && index < numChildren) |
|
{ |
|
GObject child = _children[index]; |
|
|
|
child.InternalSetParent(null); |
|
|
|
if (child.sortingOrder != 0) |
|
_sortingChildCount--; |
|
|
|
_children.RemoveAt(index); |
|
child.group = null; |
|
if (child.inContainer) |
|
{ |
|
container.RemoveChild(child.displayObject); |
|
if (_childrenRenderOrder == ChildrenRenderOrder.Arch) |
|
{ |
|
UpdateContext.OnBegin -= _buildDelegate; |
|
UpdateContext.OnBegin += _buildDelegate; |
|
} |
|
} |
|
|
|
if (dispose) |
|
child.Dispose(); |
|
|
|
SetBoundsChangedFlag(); |
|
return child; |
|
} |
|
else |
|
throw new Exception("Invalid child index: " + index + ">" + numChildren); |
|
} |
|
|
|
/// <summary> |
|
/// Remove all children. |
|
/// </summary> |
|
public void RemoveChildren() |
|
{ |
|
RemoveChildren(0, -1, false); |
|
} |
|
|
|
/// <summary> |
|
/// Removes a range of children from the container (endIndex included). |
|
/// </summary> |
|
/// <param name="beginIndex">Begin index.</param> |
|
/// <param name="endIndex">End index.(Included).</param> |
|
/// <param name="dispose">If true, the child will be disposed right away.</param> |
|
public void RemoveChildren(int beginIndex, int endIndex, bool dispose) |
|
{ |
|
if (endIndex < 0 || endIndex >= numChildren) |
|
endIndex = numChildren - 1; |
|
|
|
for (int i = beginIndex; i <= endIndex; ++i) |
|
RemoveChildAt(beginIndex, dispose); |
|
} |
|
|
|
/// <summary> |
|
/// Returns a child object at a certain index. If index out of bounds, exception raised. |
|
/// </summary> |
|
/// <param name="index">Index</param> |
|
/// <returns>A child object.</returns> |
|
public GObject GetChildAt(int index) |
|
{ |
|
if (index >= 0 && index < numChildren) |
|
return _children[index]; |
|
else |
|
throw new Exception("Invalid child index: " + index + ">" + numChildren); |
|
} |
|
|
|
/// <summary> |
|
/// Returns a child object with a certain name. |
|
/// </summary> |
|
/// <param name="name">Name</param> |
|
/// <returns>A child object. Null if not found.</returns> |
|
public GObject GetChild(string name) |
|
{ |
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
if (_children[i].name == name) |
|
return _children[i]; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
public GObject GetChildByPath(string path) |
|
{ |
|
string[] arr = path.Split('.'); |
|
int cnt = arr.Length; |
|
GComponent gcom = this; |
|
GObject obj = null; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
obj = gcom.GetChild(arr[i]); |
|
if (obj == null) |
|
break; |
|
|
|
if (i != cnt - 1) |
|
{ |
|
if (!(obj is GComponent)) |
|
{ |
|
obj = null; |
|
break; |
|
} |
|
else |
|
gcom = (GComponent)obj; |
|
} |
|
} |
|
|
|
return obj; |
|
} |
|
|
|
/// <summary> |
|
/// Returns a visible child object with a certain name. |
|
/// </summary> |
|
/// <param name="name">Name</param> |
|
/// <returns>A child object. Null if not found.</returns> |
|
public GObject GetVisibleChild(string name) |
|
{ |
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject child = _children[i]; |
|
if (child.internalVisible && child.internalVisible2 && child.name == name) |
|
return child; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/// <summary> |
|
/// Returns a child object belong to a group with a certain name. |
|
/// </summary> |
|
/// <param name="group">A group object</param> |
|
/// <param name="name">Name</param> |
|
/// <returns>A child object. Null if not found.</returns> |
|
public GObject GetChildInGroup(GGroup group, string name) |
|
{ |
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject child = _children[i]; |
|
if (child.group == group && child.name == name) |
|
return child; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
internal GObject GetChildById(string id) |
|
{ |
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
if (_children[i].id == id) |
|
return _children[i]; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/// <summary> |
|
/// Returns a copy of all children with an array. |
|
/// </summary> |
|
/// <returns>An array contains all children</returns> |
|
public GObject[] GetChildren() |
|
{ |
|
return _children.ToArray(); |
|
} |
|
|
|
/// <summary> |
|
/// Returns the index of a child within the container, or "-1" if it is not found. |
|
/// </summary> |
|
/// <param name="child">A child object</param> |
|
/// <returns>Index of the child. -1 If not found.</returns> |
|
public int GetChildIndex(GObject child) |
|
{ |
|
return _children.IndexOf(child); |
|
} |
|
|
|
/// <summary> |
|
/// Moves a child to a certain index. Children at and after the replaced position move up. |
|
/// </summary> |
|
/// <param name="child">A Child</param> |
|
/// <param name="index">Index</param> |
|
public void SetChildIndex(GObject child, int index) |
|
{ |
|
int oldIndex = _children.IndexOf(child); |
|
if (oldIndex == -1) |
|
throw new ArgumentException("Not a child of this container"); |
|
|
|
if (child.sortingOrder != 0) //no effect |
|
return; |
|
|
|
if (_sortingChildCount > 0) |
|
{ |
|
int cnt = _children.Count; |
|
if (index > (cnt - _sortingChildCount - 1)) |
|
index = cnt - _sortingChildCount - 1; |
|
} |
|
|
|
_SetChildIndex(child, oldIndex, index); |
|
} |
|
|
|
/// <summary> |
|
/// Moves a child to a certain position which is in front of the child previously at given index. |
|
/// 与SetChildIndex不同的是,如果child原来在index的前面,那么child插入的位置是index-1,即保证排在原来占据index的对象的前面。 |
|
/// </summary> |
|
/// <param name="child"></param> |
|
/// <param name="index"></param> |
|
public int SetChildIndexBefore(GObject child, int index) |
|
{ |
|
int oldIndex = _children.IndexOf(child); |
|
if (oldIndex == -1) |
|
throw new ArgumentException("Not a child of this container"); |
|
|
|
if (child.sortingOrder != 0) //no effect |
|
return oldIndex; |
|
|
|
int cnt = _children.Count; |
|
if (_sortingChildCount > 0) |
|
{ |
|
if (index > (cnt - _sortingChildCount - 1)) |
|
index = cnt - _sortingChildCount - 1; |
|
} |
|
|
|
if (oldIndex < index) |
|
return _SetChildIndex(child, oldIndex, index - 1); |
|
else |
|
return _SetChildIndex(child, oldIndex, index); |
|
} |
|
|
|
int _SetChildIndex(GObject child, int oldIndex, int index) |
|
{ |
|
int cnt = _children.Count; |
|
if (index > cnt) |
|
index = cnt; |
|
|
|
if (oldIndex == index) |
|
return oldIndex; |
|
|
|
_children.RemoveAt(oldIndex); |
|
if (index >= cnt) |
|
_children.Add(child); |
|
else |
|
_children.Insert(index, child); |
|
|
|
if (child.inContainer) |
|
{ |
|
int displayIndex = 0; |
|
if (_childrenRenderOrder == ChildrenRenderOrder.Ascent) |
|
{ |
|
for (int i = 0; i < index; i++) |
|
{ |
|
GObject g = _children[i]; |
|
if (g.inContainer) |
|
displayIndex++; |
|
} |
|
container.SetChildIndex(child.displayObject, displayIndex); |
|
} |
|
else if (_childrenRenderOrder == ChildrenRenderOrder.Descent) |
|
{ |
|
for (int i = cnt - 1; i > index; i--) |
|
{ |
|
GObject g = _children[i]; |
|
if (g.inContainer) |
|
displayIndex++; |
|
} |
|
container.SetChildIndex(child.displayObject, displayIndex); |
|
} |
|
else |
|
{ |
|
UpdateContext.OnBegin -= _buildDelegate; |
|
UpdateContext.OnBegin += _buildDelegate; |
|
} |
|
|
|
SetBoundsChangedFlag(); |
|
} |
|
|
|
return index; |
|
} |
|
|
|
/// <summary> |
|
/// Swaps the indexes of two children. |
|
/// </summary> |
|
/// <param name="child1">A child object</param> |
|
/// <param name="child2">A child object</param> |
|
public void SwapChildren(GObject child1, GObject child2) |
|
{ |
|
int index1 = _children.IndexOf(child1); |
|
int index2 = _children.IndexOf(child2); |
|
if (index1 == -1 || index2 == -1) |
|
throw new Exception("Not a child of this container"); |
|
SwapChildrenAt(index1, index2); |
|
} |
|
|
|
/// <summary> |
|
/// Swaps the indexes of two children. |
|
/// </summary> |
|
/// <param name="index1">index of first child</param> |
|
/// <param name="index2">index of second child</param> |
|
public void SwapChildrenAt(int index1, int index2) |
|
{ |
|
GObject child1 = _children[index1]; |
|
GObject child2 = _children[index2]; |
|
|
|
SetChildIndex(child1, index2); |
|
SetChildIndex(child2, index1); |
|
} |
|
|
|
/// <summary> |
|
/// The number of children of this component. |
|
/// </summary> |
|
public int numChildren |
|
{ |
|
get { return _children.Count; } |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="obj"></param> |
|
/// <returns></returns> |
|
public bool IsAncestorOf(GObject obj) |
|
{ |
|
if (obj == null) |
|
return false; |
|
|
|
GComponent p = obj.parent; |
|
while (p != null) |
|
{ |
|
if (p == this) |
|
return true; |
|
|
|
p = p.parent; |
|
} |
|
return false; |
|
} |
|
|
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
/// <param name="objs"></param> |
|
public void ChangeChildrenOrder(IList<GObject> objs) |
|
{ |
|
int cnt = objs.Count; |
|
for (int i = 0; i < cnt; i++) |
|
{ |
|
GObject obj = objs[i]; |
|
if (obj.parent != this) |
|
throw new Exception("Not a child of this container"); |
|
|
|
_children[i] = obj; |
|
} |
|
BuildNativeDisplayList(); |
|
SetBoundsChangedFlag(); |
|
} |
|
|
|
/// <summary> |
|
/// Adds a controller to the container. |
|
/// </summary> |
|
/// <param name="controller">Controller object</param> |
|
public void AddController(Controller controller) |
|
{ |
|
_controllers.Add(controller); |
|
controller.parent = this; |
|
ApplyController(controller); |
|
} |
|
|
|
/// <summary> |
|
/// Returns a controller object at a certain index. |
|
/// </summary> |
|
/// <param name="index">Index</param> |
|
/// <returns>Controller object.</returns> |
|
public Controller GetControllerAt(int index) |
|
{ |
|
return _controllers[index]; |
|
} |
|
|
|
/// <summary> |
|
/// Returns a controller object with a certain name. |
|
/// </summary> |
|
/// <param name="name">Name</param> |
|
/// <returns>Controller object. Null if not found.</returns> |
|
public Controller GetController(string name) |
|
{ |
|
int cnt = _controllers.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
Controller c = _controllers[i]; |
|
if (c.name == name) |
|
return c; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/// <summary> |
|
/// Removes a controller from the container. |
|
/// </summary> |
|
/// <param name="c">Controller object.</param> |
|
public void RemoveController(Controller c) |
|
{ |
|
int index = _controllers.IndexOf(c); |
|
if (index == -1) |
|
throw new Exception("controller not exists: " + c.name); |
|
|
|
c.parent = null; |
|
_controllers.RemoveAt(index); |
|
|
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject child = _children[i]; |
|
child.HandleControllerChanged(c); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Returns controller list. |
|
/// </summary> |
|
/// <returns>Controller list</returns> |
|
public List<Controller> Controllers |
|
{ |
|
get { return _controllers; } |
|
} |
|
|
|
/// <summary> |
|
/// Returns a transition object at a certain index. |
|
/// </summary> |
|
/// <param name="index">Index</param> |
|
/// <returns>transition object.</returns> |
|
public Transition GetTransitionAt(int index) |
|
{ |
|
return _transitions[index]; |
|
} |
|
|
|
/// <summary> |
|
/// Returns a transition object at a certain name. |
|
/// </summary> |
|
/// <param name="name">Name</param> |
|
/// <returns>Transition Object</returns> |
|
public Transition GetTransition(string name) |
|
{ |
|
int cnt = _transitions.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
Transition trans = _transitions[i]; |
|
if (trans.name == name) |
|
return trans; |
|
} |
|
|
|
return null; |
|
} |
|
|
|
/// <summary> |
|
/// Returns transition list. |
|
/// </summary> |
|
/// <returns>Transition list</returns> |
|
public List<Transition> Transitions |
|
{ |
|
get { return _transitions; } |
|
} |
|
|
|
internal void ChildStateChanged(GObject child) |
|
{ |
|
if (_buildingDisplayList) |
|
return; |
|
|
|
int cnt = _children.Count; |
|
|
|
if (child is GGroup) |
|
{ |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject g = _children[i]; |
|
if (g.group == child) |
|
ChildStateChanged(g); |
|
} |
|
return; |
|
} |
|
|
|
if (child.displayObject == null) |
|
return; |
|
|
|
if (child.internalVisible) |
|
{ |
|
if (child.displayObject.parent == null) |
|
{ |
|
if (_childrenRenderOrder == ChildrenRenderOrder.Ascent) |
|
{ |
|
int index = 0; |
|
for (int i = 0; i < cnt; i++) |
|
{ |
|
GObject g = _children[i]; |
|
if (g == child) |
|
break; |
|
|
|
if (g.displayObject != null && g.displayObject.parent != null) |
|
index++; |
|
} |
|
container.AddChildAt(child.displayObject, index); |
|
} |
|
else if (_childrenRenderOrder == ChildrenRenderOrder.Descent) |
|
{ |
|
int index = 0; |
|
for (int i = cnt - 1; i >= 0; i--) |
|
{ |
|
GObject g = _children[i]; |
|
if (g == child) |
|
break; |
|
|
|
if (g.displayObject != null && g.displayObject.parent != null) |
|
index++; |
|
} |
|
container.AddChildAt(child.displayObject, index); |
|
} |
|
else |
|
{ |
|
container.AddChild(child.displayObject); |
|
|
|
UpdateContext.OnBegin -= _buildDelegate; |
|
UpdateContext.OnBegin += _buildDelegate; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
if (child.displayObject.parent != null) |
|
{ |
|
container.RemoveChild(child.displayObject); |
|
if (_childrenRenderOrder == ChildrenRenderOrder.Arch) |
|
{ |
|
UpdateContext.OnBegin -= _buildDelegate; |
|
UpdateContext.OnBegin += _buildDelegate; |
|
} |
|
} |
|
} |
|
} |
|
|
|
void BuildNativeDisplayList() |
|
{ |
|
if (displayObject == null || displayObject.isDisposed) |
|
return; |
|
|
|
int cnt = _children.Count; |
|
if (cnt == 0) |
|
return; |
|
|
|
switch (_childrenRenderOrder) |
|
{ |
|
case ChildrenRenderOrder.Ascent: |
|
{ |
|
for (int i = 0; i < cnt; i++) |
|
{ |
|
GObject child = _children[i]; |
|
if (child.displayObject != null && child.internalVisible) |
|
container.AddChild(child.displayObject); |
|
} |
|
} |
|
break; |
|
case ChildrenRenderOrder.Descent: |
|
{ |
|
for (int i = cnt - 1; i >= 0; i--) |
|
{ |
|
GObject child = _children[i]; |
|
if (child.displayObject != null && child.internalVisible) |
|
container.AddChild(child.displayObject); |
|
} |
|
} |
|
break; |
|
|
|
case ChildrenRenderOrder.Arch: |
|
{ |
|
int apex = Mathf.Clamp(_apexIndex, 0, cnt); |
|
for (int i = 0; i < apex; i++) |
|
{ |
|
GObject child = _children[i]; |
|
if (child.displayObject != null && child.internalVisible) |
|
container.AddChild(child.displayObject); |
|
} |
|
for (int i = cnt - 1; i >= apex; i--) |
|
{ |
|
GObject child = _children[i]; |
|
if (child.displayObject != null && child.internalVisible) |
|
container.AddChild(child.displayObject); |
|
} |
|
} |
|
break; |
|
} |
|
} |
|
|
|
internal void ApplyController(Controller c) |
|
{ |
|
_applyingController = c; |
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject child = _children[i]; |
|
child.HandleControllerChanged(c); |
|
} |
|
_applyingController = null; |
|
|
|
c.RunActions(); |
|
} |
|
|
|
void ApplyAllControllers() |
|
{ |
|
int cnt = _controllers.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
Controller controller = _controllers[i]; |
|
ApplyController(controller); |
|
} |
|
} |
|
|
|
internal void AdjustRadioGroupDepth(GObject obj, Controller c) |
|
{ |
|
int cnt = _children.Count; |
|
int i; |
|
GObject child; |
|
int myIndex = -1, maxIndex = -1; |
|
for (i = 0; i < cnt; i++) |
|
{ |
|
child = _children[i]; |
|
if (child == obj) |
|
{ |
|
myIndex = i; |
|
} |
|
else if ((child is GButton) |
|
&& ((GButton)child).relatedController == c) |
|
{ |
|
if (i > maxIndex) |
|
maxIndex = i; |
|
} |
|
} |
|
if (myIndex < maxIndex) |
|
{ |
|
if (_applyingController != null) |
|
_children[maxIndex].HandleControllerChanged(_applyingController); |
|
this.SwapChildrenAt(myIndex, maxIndex); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// If clipping softness is set, clipped containers will have soft border effect. |
|
/// </summary> |
|
public Vector2 clipSoftness |
|
{ |
|
get { return _clipSoftness; } |
|
set |
|
{ |
|
_clipSoftness = value; |
|
if (scrollPane != null) |
|
scrollPane.UpdateClipSoft(); |
|
else if (_clipSoftness.x > 0 || _clipSoftness.y > 0) |
|
rootContainer.clipSoftness = new Vector4(value.x, value.y, value.x, value.y); |
|
else |
|
rootContainer.clipSoftness = null; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// The mask of the component. |
|
/// </summary> |
|
public DisplayObject mask |
|
{ |
|
get { return container.mask; } |
|
set |
|
{ |
|
container.mask = value; |
|
if (value != null && value.parent != container) |
|
container.AddChild(value); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
public bool reversedMask |
|
{ |
|
get { return container.reversedMask; } |
|
set { container.reversedMask = value; } |
|
} |
|
|
|
/// <summary> |
|
/// |
|
/// </summary> |
|
public string baseUserData |
|
{ |
|
get |
|
{ |
|
ByteBuffer buffer = packageItem.rawData; |
|
buffer.Seek(0, 4); |
|
return buffer.ReadS(); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// Test if a child is in view. |
|
/// </summary> |
|
/// <param name="child">A child object</param> |
|
/// <returns>True if in view</returns> |
|
public bool IsChildInView(GObject child) |
|
{ |
|
if (scrollPane != null) |
|
{ |
|
return scrollPane.IsChildInView(child); |
|
} |
|
else if (rootContainer.clipRect != null) |
|
{ |
|
return child.x + child.width >= 0 && child.x <= this.width |
|
&& child.y + child.height >= 0 && child.y <= this.height; |
|
} |
|
else |
|
return true; |
|
} |
|
|
|
virtual public int GetFirstChildInView() |
|
{ |
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject child = _children[i]; |
|
if (IsChildInView(child)) |
|
return i; |
|
} |
|
return -1; |
|
} |
|
|
|
protected void SetupScroll(ByteBuffer buffer) |
|
{ |
|
if (rootContainer == container) |
|
{ |
|
container = new Container(); |
|
rootContainer.AddChild(container); |
|
} |
|
|
|
scrollPane = new ScrollPane(this); |
|
scrollPane.Setup(buffer); |
|
} |
|
|
|
protected void SetupOverflow(OverflowType overflow) |
|
{ |
|
if (overflow == OverflowType.Hidden) |
|
{ |
|
if (rootContainer == container) |
|
{ |
|
container = new Container(); |
|
rootContainer.AddChild(container); |
|
} |
|
|
|
UpdateClipRect(); |
|
container.SetXY(_margin.left, _margin.top); |
|
} |
|
else if (_margin.left != 0 || _margin.top != 0) |
|
{ |
|
if (rootContainer == container) |
|
{ |
|
container = new Container(); |
|
rootContainer.AddChild(container); |
|
} |
|
|
|
container.SetXY(_margin.left, _margin.top); |
|
} |
|
} |
|
|
|
void UpdateClipRect() |
|
{ |
|
if (scrollPane == null) |
|
{ |
|
float w = this.width - (_margin.left + _margin.right); |
|
float h = this.height - (_margin.top + _margin.bottom); |
|
rootContainer.clipRect = new Rect(_margin.left, _margin.top, w, h); |
|
} |
|
else |
|
rootContainer.clipRect = new Rect(0, 0, this.width, this.height); |
|
} |
|
|
|
override protected void HandleSizeChanged() |
|
{ |
|
base.HandleSizeChanged(); |
|
|
|
if (scrollPane != null) |
|
scrollPane.OnOwnerSizeChanged(); |
|
if (rootContainer.clipRect != null) |
|
UpdateClipRect(); |
|
} |
|
|
|
override protected void HandleGrayedChanged() |
|
{ |
|
Controller cc = GetController("grayed"); |
|
if (cc != null) |
|
cc.selectedIndex = this.grayed ? 1 : 0; |
|
else |
|
base.HandleGrayedChanged(); |
|
} |
|
|
|
override public void HandleControllerChanged(Controller c) |
|
{ |
|
base.HandleControllerChanged(c); |
|
|
|
if (scrollPane != null) |
|
scrollPane.HandleControllerChanged(c); |
|
} |
|
|
|
/// <summary> |
|
/// Notify the component the bounds should recaculate. |
|
/// </summary> |
|
public void SetBoundsChangedFlag() |
|
{ |
|
if (scrollPane == null && !_trackBounds) |
|
return; |
|
|
|
_boundsChanged = true; |
|
} |
|
|
|
/// <summary> |
|
/// Make sure the bounds of the component is correct. |
|
/// Bounds of the component is not updated on every changed. For example, you add a new child to the list, children in the list will be rearranged in next frame. |
|
/// If you want to access the correct child position immediatelly, call this function first. |
|
/// </summary> |
|
public void EnsureBoundsCorrect() |
|
{ |
|
if (_boundsChanged) |
|
UpdateBounds(); |
|
} |
|
|
|
virtual protected void UpdateBounds() |
|
{ |
|
float ax, ay, aw, ah; |
|
if (_children.Count > 0) |
|
{ |
|
ax = int.MaxValue; |
|
ay = int.MaxValue; |
|
float ar = int.MinValue, ab = int.MinValue; |
|
float tmp; |
|
|
|
int cnt = _children.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
{ |
|
GObject child = _children[i]; |
|
tmp = child.x; |
|
if (tmp < ax) |
|
ax = tmp; |
|
tmp = child.y; |
|
if (tmp < ay) |
|
ay = tmp; |
|
tmp = child.x + child.actualWidth; |
|
if (tmp > ar) |
|
ar = tmp; |
|
tmp = child.y + child.actualHeight; |
|
if (tmp > ab) |
|
ab = tmp; |
|
} |
|
aw = ar - ax; |
|
ah = ab - ay; |
|
} |
|
else |
|
{ |
|
ax = 0; |
|
ay = 0; |
|
aw = 0; |
|
ah = 0; |
|
} |
|
|
|
SetBounds(ax, ay, aw, ah); |
|
} |
|
|
|
protected void SetBounds(float ax, float ay, float aw, float ah) |
|
{ |
|
_boundsChanged = false; |
|
if (scrollPane != null) |
|
scrollPane.SetContentSize(Mathf.RoundToInt(ax + aw), Mathf.RoundToInt(ay + ah)); |
|
} |
|
|
|
/// <summary> |
|
/// Viwe port width of the container. |
|
/// </summary> |
|
public float viewWidth |
|
{ |
|
get |
|
{ |
|
if (scrollPane != null) |
|
return scrollPane.viewWidth; |
|
else |
|
return this.width - _margin.left - _margin.right; |
|
} |
|
|
|
set |
|
{ |
|
if (scrollPane != null) |
|
scrollPane.viewWidth = value; |
|
else |
|
this.width = value + _margin.left + _margin.right; |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// View port height of the container. |
|
/// </summary> |
|
public float viewHeight |
|
{ |
|
get |
|
{ |
|
if (scrollPane != null) |
|
return scrollPane.viewHeight; |
|
else |
|
return this.height - _margin.top - _margin.bottom; |
|
} |
|
|
|
set |
|
{ |
|
if (scrollPane != null) |
|
scrollPane.viewHeight = value; |
|
else |
|
this.height = value + _margin.top + _margin.bottom; |
|
} |
|
} |
|
|
|
public void GetSnappingPosition(ref float xValue, ref float yValue) |
|
{ |
|
GetSnappingPositionWithDir(ref xValue, ref yValue, 0, 0); |
|
} |
|
|
|
protected bool ShouldSnapToNext(float dir, float delta, float size) |
|
{ |
|
return dir < 0 && delta > UIConfig.defaultScrollSnappingThreshold * size |
|
|| dir > 0 && delta > (1 - UIConfig.defaultScrollSnappingThreshold) * size |
|
|| dir == 0 && delta > size / 2; |
|
} |
|
|
|
/** |
|
* dir正数表示右移或者下移,负数表示左移或者上移 |
|
*/ |
|
virtual public void GetSnappingPositionWithDir(ref float xValue, ref float yValue, float xDir, float yDir) |
|
{ |
|
int cnt = _children.Count; |
|
if (cnt == 0) |
|
return; |
|
|
|
EnsureBoundsCorrect(); |
|
|
|
GObject obj = null; |
|
|
|
int i = 0; |
|
if (yValue != 0) |
|
{ |
|
for (; i < cnt; i++) |
|
{ |
|
obj = _children[i]; |
|
if (yValue < obj.y) |
|
{ |
|
if (i == 0) |
|
{ |
|
yValue = 0; |
|
break; |
|
} |
|
else |
|
{ |
|
GObject prev = _children[i - 1]; |
|
if (ShouldSnapToNext(yDir, yValue - prev.y, prev.height)) |
|
yValue = obj.y; |
|
else |
|
yValue = prev.y; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
if (i == cnt) |
|
yValue = obj.y; |
|
} |
|
|
|
if (xValue != 0) |
|
{ |
|
if (i > 0) |
|
i--; |
|
for (; i < cnt; i++) |
|
{ |
|
obj = _children[i]; |
|
if (xValue < obj.x) |
|
{ |
|
if (i == 0) |
|
{ |
|
xValue = 0; |
|
break; |
|
} |
|
else |
|
{ |
|
GObject prev = _children[i - 1]; |
|
if (ShouldSnapToNext(xDir, xValue - prev.x, prev.width)) |
|
xValue = obj.x; |
|
else |
|
xValue = prev.x; |
|
break; |
|
} |
|
} |
|
} |
|
if (i == cnt) |
|
xValue = obj.x; |
|
} |
|
} |
|
|
|
internal void ChildSortingOrderChanged(GObject child, int oldValue, int newValue) |
|
{ |
|
if (newValue == 0) |
|
{ |
|
_sortingChildCount--; |
|
SetChildIndex(child, _children.Count); |
|
} |
|
else |
|
{ |
|
if (oldValue == 0) |
|
_sortingChildCount++; |
|
|
|
int oldIndex = _children.IndexOf(child); |
|
int index = GetInsertPosForSortingChild(child); |
|
if (oldIndex < index) |
|
_SetChildIndex(child, oldIndex, index - 1); |
|
else |
|
_SetChildIndex(child, oldIndex, index); |
|
} |
|
} |
|
|
|
/// <summary> |
|
/// 每帧调用的一个回调。如果你要override,请记住以下两点: |
|
/// 1、记得调用base.onUpdate; |
|
/// 2、不要在方法里进行任何会更改显示列表的操作,例如AddChild、RemoveChild、visible等。 |
|
/// </summary> |
|
virtual protected void OnUpdate() |
|
{ |
|
if (_boundsChanged) |
|
UpdateBounds(); |
|
} |
|
|
|
override public void ConstructFromResource() |
|
{ |
|
ConstructFromResource(null, 0); |
|
} |
|
|
|
internal void ConstructFromResource(List<GObject> objectPool, int poolIndex) |
|
{ |
|
this.gameObjectName = packageItem.name; |
|
|
|
PackageItem contentItem = packageItem.getBranch(); |
|
|
|
if (!contentItem.translated) |
|
{ |
|
contentItem.translated = true; |
|
TranslationHelper.TranslateComponent(contentItem); |
|
} |
|
|
|
ByteBuffer buffer = contentItem.rawData; |
|
buffer.Seek(0, 0); |
|
|
|
underConstruct = true; |
|
|
|
sourceWidth = buffer.ReadInt(); |
|
sourceHeight = buffer.ReadInt(); |
|
initWidth = sourceWidth; |
|
initHeight = sourceHeight; |
|
|
|
SetSize(sourceWidth, sourceHeight); |
|
|
|
if (buffer.ReadBool()) |
|
{ |
|
minWidth = buffer.ReadInt(); |
|
maxWidth = buffer.ReadInt(); |
|
minHeight = buffer.ReadInt(); |
|
maxHeight = buffer.ReadInt(); |
|
} |
|
|
|
if (buffer.ReadBool()) |
|
{ |
|
float f1 = buffer.ReadFloat(); |
|
float f2 = buffer.ReadFloat(); |
|
SetPivot(f1, f2, buffer.ReadBool()); |
|
} |
|
|
|
if (buffer.ReadBool()) |
|
{ |
|
_margin.top = buffer.ReadInt(); |
|
_margin.bottom = buffer.ReadInt(); |
|
_margin.left = buffer.ReadInt(); |
|
_margin.right = buffer.ReadInt(); |
|
} |
|
|
|
OverflowType overflow = (OverflowType)buffer.ReadByte(); |
|
if (overflow == OverflowType.Scroll) |
|
{ |
|
int savedPos = buffer.position; |
|
buffer.Seek(0, 7); |
|
SetupScroll(buffer); |
|
buffer.position = savedPos; |
|
} |
|
else |
|
SetupOverflow(overflow); |
|
|
|
if (buffer.ReadBool()) |
|
{ |
|
int i1 = buffer.ReadInt(); |
|
int i2 = buffer.ReadInt(); |
|
this.clipSoftness = new Vector2(i1, i2); |
|
} |
|
|
|
_buildingDisplayList = true; |
|
|
|
buffer.Seek(0, 1); |
|
|
|
int controllerCount = buffer.ReadShort(); |
|
for (int i = 0; i < controllerCount; i++) |
|
{ |
|
int nextPos = buffer.ReadUshort(); |
|
nextPos += buffer.position; |
|
|
|
Controller controller = new Controller(); |
|
_controllers.Add(controller); |
|
controller.parent = this; |
|
controller.Setup(buffer); |
|
|
|
buffer.position = nextPos; |
|
} |
|
|
|
buffer.Seek(0, 2); |
|
|
|
GObject child; |
|
int childCount = buffer.ReadShort(); |
|
for (int i = 0; i < childCount; i++) |
|
{ |
|
int dataLen = buffer.ReadShort(); |
|
int curPos = buffer.position; |
|
|
|
if (objectPool != null) |
|
child = objectPool[poolIndex + i]; |
|
else |
|
{ |
|
buffer.Seek(curPos, 0); |
|
|
|
ObjectType type = (ObjectType)buffer.ReadByte(); |
|
string src = buffer.ReadS(); |
|
string pkgId = buffer.ReadS(); |
|
|
|
PackageItem pi = null; |
|
if (src != null) |
|
{ |
|
UIPackage pkg; |
|
if (pkgId != null) |
|
pkg = UIPackage.GetById(pkgId); |
|
else |
|
pkg = contentItem.owner; |
|
|
|
pi = pkg != null ? pkg.GetItem(src) : null; |
|
} |
|
|
|
if (pi != null) |
|
{ |
|
child = UIObjectFactory.NewObject(pi); |
|
child.ConstructFromResource(); |
|
} |
|
else |
|
child = UIObjectFactory.NewObject(type); |
|
} |
|
|
|
child.underConstruct = true; |
|
child.Setup_BeforeAdd(buffer, curPos); |
|
child.InternalSetParent(this); |
|
_children.Add(child); |
|
|
|
buffer.position = curPos + dataLen; |
|
} |
|
|
|
buffer.Seek(0, 3); |
|
this.relations.Setup(buffer, true); |
|
|
|
buffer.Seek(0, 2); |
|
buffer.Skip(2); |
|
|
|
for (int i = 0; i < childCount; i++) |
|
{ |
|
int nextPos = buffer.ReadUshort(); |
|
nextPos += buffer.position; |
|
|
|
buffer.Seek(buffer.position, 3); |
|
_children[i].relations.Setup(buffer, false); |
|
|
|
buffer.position = nextPos; |
|
} |
|
|
|
buffer.Seek(0, 2); |
|
buffer.Skip(2); |
|
|
|
for (int i = 0; i < childCount; i++) |
|
{ |
|
int nextPos = buffer.ReadUshort(); |
|
nextPos += buffer.position; |
|
|
|
child = _children[i]; |
|
child.Setup_AfterAdd(buffer, buffer.position); |
|
child.underConstruct = false; |
|
if (child.displayObject != null) |
|
child.displayObject.cachedTransform.SetParent(this.displayObject.cachedTransform, false); |
|
|
|
buffer.position = nextPos; |
|
} |
|
|
|
buffer.Seek(0, 4); |
|
|
|
buffer.Skip(2); //customData |
|
this.opaque = buffer.ReadBool(); |
|
int maskId = buffer.ReadShort(); |
|
if (maskId != -1) |
|
{ |
|
container.mask = GetChildAt(maskId).displayObject; |
|
if (buffer.ReadBool()) |
|
container.reversedMask = true; |
|
} |
|
|
|
{ |
|
string hitTestId = buffer.ReadS(); |
|
int i1 = buffer.ReadInt(); |
|
int i2 = buffer.ReadInt(); |
|
if (hitTestId != null) |
|
{ |
|
PackageItem pi = contentItem.owner.GetItem(hitTestId); |
|
if (pi != null && pi.pixelHitTestData != null) |
|
rootContainer.hitArea = new PixelHitTest(pi.pixelHitTestData, i1, i2, sourceWidth, sourceHeight); |
|
} |
|
else if (i1 != 0 && i2 != -1) |
|
{ |
|
rootContainer.hitArea = new ShapeHitTest(this.GetChildAt(i2).displayObject); |
|
} |
|
} |
|
|
|
if (buffer.version >= 5) |
|
{ |
|
string str = buffer.ReadS(); |
|
if (!string.IsNullOrEmpty(str)) |
|
this.onAddedToStage.Add(() => __playSound(str, 1)); |
|
|
|
string str2 = buffer.ReadS(); |
|
if (!string.IsNullOrEmpty(str2)) |
|
this.onRemovedFromStage.Add(() => __playSound(str2, 1)); |
|
} |
|
|
|
buffer.Seek(0, 5); |
|
|
|
int transitionCount = buffer.ReadShort(); |
|
for (int i = 0; i < transitionCount; i++) |
|
{ |
|
int nextPos = buffer.ReadUshort(); |
|
nextPos += buffer.position; |
|
|
|
Transition trans = new Transition(this); |
|
trans.Setup(buffer); |
|
_transitions.Add(trans); |
|
|
|
buffer.position = nextPos; |
|
} |
|
|
|
if (_transitions.Count > 0) |
|
{ |
|
this.onAddedToStage.Add(__addedToStage); |
|
this.onRemovedFromStage.Add(__removedFromStage); |
|
} |
|
|
|
ApplyAllControllers(); |
|
|
|
_buildingDisplayList = false; |
|
underConstruct = false; |
|
|
|
BuildNativeDisplayList(); |
|
SetBoundsChangedFlag(); |
|
|
|
if (contentItem.objectType != ObjectType.Component) |
|
ConstructExtension(buffer); |
|
|
|
ConstructFromXML(null); |
|
|
|
#if FAIRYGUI_TOLUA |
|
CallLua("ctor"); |
|
#endif |
|
#if FAIRYGUI_PUERTS |
|
if (__onConstruct != null) |
|
__onConstruct(); |
|
#endif |
|
} |
|
|
|
virtual protected void ConstructExtension(ByteBuffer buffer) |
|
{ |
|
} |
|
|
|
/// <summary> |
|
/// Method for extensions to override |
|
/// </summary> |
|
/// <param name="xml"></param> |
|
virtual public void ConstructFromXML(XML xml) |
|
{ |
|
} |
|
|
|
public override void Setup_AfterAdd(ByteBuffer buffer, int beginPos) |
|
{ |
|
base.Setup_AfterAdd(buffer, beginPos); |
|
|
|
buffer.Seek(beginPos, 4); |
|
|
|
int pageController = buffer.ReadShort(); |
|
if (pageController != -1 && scrollPane != null && scrollPane.pageMode) |
|
scrollPane.pageController = parent.GetControllerAt(pageController); |
|
|
|
int cnt = buffer.ReadShort(); |
|
for (int i = 0; i < cnt; i++) |
|
{ |
|
Controller cc = GetController(buffer.ReadS()); |
|
string pageId = buffer.ReadS(); |
|
if (cc != null) |
|
cc.selectedPageId = pageId; |
|
} |
|
|
|
if (buffer.version >= 2) |
|
{ |
|
cnt = buffer.ReadShort(); |
|
for (int i = 0; i < cnt; i++) |
|
{ |
|
string target = buffer.ReadS(); |
|
int propertyId = buffer.ReadShort(); |
|
string value = buffer.ReadS(); |
|
GObject obj = this.GetChildByPath(target); |
|
if (obj != null) |
|
{ |
|
if (propertyId == 0) |
|
obj.text = value; |
|
else if (propertyId == 1) |
|
obj.icon = value; |
|
} |
|
} |
|
} |
|
} |
|
|
|
void __playSound(string soundRes, float volumeScale) |
|
{ |
|
NAudioClip sound = UIPackage.GetItemAssetByURL(soundRes) as NAudioClip; |
|
if (sound != null && sound.nativeClip != null) |
|
Stage.inst.PlayOneShotSound(sound.nativeClip, volumeScale); |
|
} |
|
|
|
void __addedToStage() |
|
{ |
|
int cnt = _transitions.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
_transitions[i].OnOwnerAddedToStage(); |
|
} |
|
|
|
void __removedFromStage() |
|
{ |
|
int cnt = _transitions.Count; |
|
for (int i = 0; i < cnt; ++i) |
|
_transitions[i].OnOwnerRemovedFromStage(); |
|
} |
|
|
|
#if FAIRYGUI_TOLUA |
|
internal LuaTable _peerTable; |
|
|
|
public void SetLuaPeer(LuaTable peerTable) |
|
{ |
|
_peerTable = peerTable; |
|
} |
|
|
|
[NoToLua] |
|
public bool CallLua(string funcName) |
|
{ |
|
if (_peerTable != null) |
|
{ |
|
LuaFunction ctor = _peerTable.GetLuaFunction(funcName); |
|
if (ctor != null) |
|
{ |
|
try |
|
{ |
|
ctor.Call(this); |
|
} |
|
catch (Exception err) |
|
{ |
|
Debug.LogError(err); |
|
} |
|
|
|
ctor.Dispose(); |
|
return true; |
|
} |
|
} |
|
|
|
return false; |
|
} |
|
#endif |
|
|
|
#if FAIRYGUI_PUERTS |
|
public Action __onConstruct; |
|
public Action __onDispose; |
|
#endif |
|
} |
|
}
|
|
|