221 lines
5.8 KiB
C#
Raw Normal View History

2025-06-07 17:43:34 +08:00
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);
}
}
}
}
}