Singularity/Library/PackageCache/com.unity.visualscripting@1.../Runtime/VisualScripting.Flow/UnitCategory.cs
2024-05-06 11:45:45 -07:00

101 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using Unity.VisualScripting.FullSerializer;
namespace Unity.VisualScripting
{
[AttributeUsage(AttributeTargets.Class)]
[fsObject(Converter = typeof(UnitCategoryConverter))]
public class UnitCategory : Attribute
{
public UnitCategory(string fullName)
{
Ensure.That(nameof(fullName)).IsNotNull(fullName);
fullName = fullName.Replace('\\', '/');
this.fullName = fullName;
var parts = fullName.Split('/');
name = parts[parts.Length - 1];
if (parts.Length > 1)
{
root = new UnitCategory(parts[0]);
parent = new UnitCategory(fullName.Substring(0, fullName.LastIndexOf('/')));
}
else
{
root = this;
isRoot = true;
}
}
public UnitCategory root { get; }
public UnitCategory parent { get; }
public string fullName { get; }
public string name { get; }
public bool isRoot { get; }
public IEnumerable<UnitCategory> ancestors
{
get
{
var ancestor = parent;
while (ancestor != null)
{
yield return ancestor;
ancestor = ancestor.parent;
}
}
}
public IEnumerable<UnitCategory> AndAncestors()
{
yield return this;
foreach (var ancestor in ancestors)
{
yield return ancestor;
}
}
public override bool Equals(object obj)
{
return obj is UnitCategory && ((UnitCategory)obj).fullName == fullName;
}
public override int GetHashCode()
{
return fullName.GetHashCode();
}
public override string ToString()
{
return fullName;
}
public static bool operator ==(UnitCategory a, UnitCategory b)
{
if (ReferenceEquals(a, b))
{
return true;
}
if ((object)a == null || (object)b == null)
{
return false;
}
return a.Equals(b);
}
public static bool operator !=(UnitCategory a, UnitCategory b)
{
return !(a == b);
}
}
}