221 lines
5.8 KiB
C#
221 lines
5.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using FairyGUI.Utils;
|
|
|
|
namespace FairyGUI
|
|
{
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public class Relations
|
|
{
|
|
GObject _owner;
|
|
List<RelationItem> _items;
|
|
|
|
public GObject handling;
|
|
|
|
public Relations(GObject owner)
|
|
{
|
|
_owner = owner;
|
|
_items = new List<RelationItem>();
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="target"></param>
|
|
/// <param name="relationType"></param>
|
|
public void Add(GObject target, RelationType relationType)
|
|
{
|
|
Add(target, relationType, false);
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="target"></param>
|
|
/// <param name="relationType"></param>
|
|
/// <param name="usePercent"></param>
|
|
public void Add(GObject target, RelationType relationType, bool usePercent)
|
|
{
|
|
int cnt = _items.Count;
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
RelationItem item = _items[i];
|
|
if (item.target == target)
|
|
{
|
|
item.Add(relationType, usePercent);
|
|
return;
|
|
}
|
|
}
|
|
RelationItem newItem = new RelationItem(_owner);
|
|
newItem.target = target;
|
|
newItem.Add(relationType, usePercent);
|
|
_items.Add(newItem);
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="target"></param>
|
|
/// <param name="relationType"></param>
|
|
public void Remove(GObject target, RelationType relationType)
|
|
{
|
|
int cnt = _items.Count;
|
|
int i = 0;
|
|
while (i < cnt)
|
|
{
|
|
RelationItem item = _items[i];
|
|
if (item.target == target)
|
|
{
|
|
item.Remove(relationType);
|
|
if (item.isEmpty)
|
|
{
|
|
item.Dispose();
|
|
_items.RemoveAt(i);
|
|
cnt--;
|
|
continue;
|
|
}
|
|
else
|
|
i++;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="target"></param>
|
|
/// <returns></returns>
|
|
public bool Contains(GObject target)
|
|
{
|
|
int cnt = _items.Count;
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
RelationItem item = _items[i];
|
|
if (item.target == target)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="target"></param>
|
|
public void ClearFor(GObject target)
|
|
{
|
|
int cnt = _items.Count;
|
|
int i = 0;
|
|
while (i < cnt)
|
|
{
|
|
RelationItem item = _items[i];
|
|
if (item.target == target)
|
|
{
|
|
item.Dispose();
|
|
_items.RemoveAt(i);
|
|
cnt--;
|
|
}
|
|
else
|
|
i++;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public void ClearAll()
|
|
{
|
|
int cnt = _items.Count;
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
RelationItem item = _items[i];
|
|
item.Dispose();
|
|
}
|
|
_items.Clear();
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="source"></param>
|
|
public void CopyFrom(Relations source)
|
|
{
|
|
ClearAll();
|
|
|
|
List<RelationItem> arr = source._items;
|
|
foreach (RelationItem ri in arr)
|
|
{
|
|
RelationItem item = new RelationItem(_owner);
|
|
item.CopyFrom(ri);
|
|
_items.Add(item);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public void Dispose()
|
|
{
|
|
ClearAll();
|
|
handling = null;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="dWidth"></param>
|
|
/// <param name="dHeight"></param>
|
|
/// <param name="applyPivot"></param>
|
|
public void OnOwnerSizeChanged(float dWidth, float dHeight, bool applyPivot)
|
|
{
|
|
int cnt = _items.Count;
|
|
if (cnt == 0)
|
|
return;
|
|
|
|
for (int i = 0; i < cnt; i++)
|
|
_items[i].ApplyOnSelfSizeChanged(dWidth, dHeight, applyPivot);
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public bool isEmpty
|
|
{
|
|
get
|
|
{
|
|
return _items.Count == 0;
|
|
}
|
|
}
|
|
|
|
public void Setup(ByteBuffer buffer, bool parentToChild)
|
|
{
|
|
int cnt = buffer.ReadByte();
|
|
GObject target;
|
|
for (int i = 0; i < cnt; i++)
|
|
{
|
|
int targetIndex = buffer.ReadShort();
|
|
if (targetIndex == -1)
|
|
target = _owner.parent;
|
|
else if (parentToChild)
|
|
target = ((GComponent)_owner).GetChildAt(targetIndex);
|
|
else
|
|
target = _owner.parent.GetChildAt(targetIndex);
|
|
|
|
RelationItem newItem = new RelationItem(_owner);
|
|
newItem.target = target;
|
|
_items.Add(newItem);
|
|
|
|
int cnt2 = buffer.ReadByte();
|
|
for (int j = 0; j < cnt2; j++)
|
|
{
|
|
RelationType rt = (RelationType)buffer.ReadByte();
|
|
bool usePercent = buffer.ReadBool();
|
|
newItem.InternalAdd(rt, usePercent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|