43 lines
1.4 KiB
C#
43 lines
1.4 KiB
C#
// Source: https://gist.github.com/kleonc/a2bab51686ac6f4d7cb28aec88efa5d9
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Godot;
|
|
|
|
namespace Namespace;
|
|
|
|
using UnderlyingType = UInt64;
|
|
|
|
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
|
|
public class ExportFlagsEnumAttribute : ExportAttribute {
|
|
public ExportFlagsEnumAttribute(Type enumType)
|
|
: base(PropertyHint.Flags, GetFlagsEnumHintString(enumType)) { }
|
|
|
|
private static string GetFlagsEnumHintString(Type enumType) {
|
|
Dictionary<UnderlyingType, List<string>> flagNamesByFlag = new();
|
|
UnderlyingType flag = 1;
|
|
foreach (string name in Enum.GetNames(enumType)) {
|
|
UnderlyingType value =
|
|
(UnderlyingType)Convert.ChangeType(Enum.Parse(enumType, name), typeof(UnderlyingType));
|
|
while (value > flag) {
|
|
if (!flagNamesByFlag.ContainsKey(flag)) {
|
|
flagNamesByFlag.Add(flag, new List<string>());
|
|
}
|
|
|
|
flag <<= 1;
|
|
}
|
|
|
|
if (value == flag) {
|
|
if (!flagNamesByFlag.TryGetValue(flag, out List<string> names)) {
|
|
names = new List<string>();
|
|
flagNamesByFlag.Add(flag, names);
|
|
}
|
|
|
|
names.Add(name);
|
|
}
|
|
}
|
|
|
|
return string.Join(", ", flagNamesByFlag.Values.Select(flagNames => string.Join(" / ", flagNames)));
|
|
}
|
|
} |