diff --git a/NHSE.Core/Structures/Misc/GSaveItemName.cs b/NHSE.Core/Structures/Misc/GSaveItemName.cs index 710b8d6..b1cdbc5 100644 --- a/NHSE.Core/Structures/Misc/GSaveItemName.cs +++ b/NHSE.Core/Structures/Misc/GSaveItemName.cs @@ -1,8 +1,10 @@ -using System.Runtime.InteropServices; +using System.ComponentModel; +using System.Runtime.InteropServices; namespace NHSE.Core { [StructLayout(LayoutKind.Explicit, Size = SIZE, Pack = 1)] + [TypeConverter(typeof(ValueTypeTypeConverter))] public struct GSaveItemName { public const int SIZE = 0x08; @@ -17,5 +19,7 @@ public struct GSaveItemName public bool Equals(GSaveItemName obj) => obj.UniqueID == UniqueID && obj.SystemParam == SystemParam && obj.AdditionalParam == AdditionalParam; public static bool operator ==(GSaveItemName left, GSaveItemName right) => left.Equals(right); public static bool operator !=(GSaveItemName left, GSaveItemName right) => !(left == right); + + public override string ToString() => UniqueID.ToString(); } } diff --git a/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs b/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs new file mode 100644 index 0000000..2c5b136 --- /dev/null +++ b/NHSE.Core/Structures/Misc/ValueTypeTypeConverter.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections; +using System.ComponentModel; + +namespace NHSE.Core +{ + /// + /// Used for allowing a struct to be mutated in a PropertyGrid. + /// + public class ValueTypeTypeConverter : ExpandableObjectConverter + { + public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) => true; + + public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues) + { + object boxed = context.PropertyDescriptor.GetValue(context.Instance); + foreach (DictionaryEntry entry in propertyValues) + { + var pi = context.PropertyDescriptor.PropertyType.GetProperty(entry.Key.ToString()); + if (pi?.CanWrite == true) + pi.SetValue(boxed, Convert.ChangeType(entry.Value, pi.PropertyType), null); + } + return boxed; + } + } +} \ No newline at end of file