void OnEnumFlagSelected(FlagsOption option, SerializedProperty property) { var enumValue = property.GetValue <int>(); switch (option.Type) { case FlagsOption.OptionTypes.Everything: enumValue = -1; break; case FlagsOption.OptionTypes.Nothing: enumValue = 0; break; case FlagsOption.OptionTypes.Custom: var value = (int)option.Value; if ((enumValue & value) == value) { enumValue &= ~value; } else { enumValue |= value; } break; } property.SetValue(enumValue); }
void DrawNumericalFlag() { var enumValue = currentProperty.GetValue <int>(); var options = new FlagsOption[enumValues.Length]; for (int i = 0; i < options.Length; i++) { var name = enumNames[i].Replace('_', '/').ToGUIContent(); var value = Convert.ToInt32(enumValues.GetValue(i)); options[i] = new FlagsOption(name, value, (enumValue & value) == value); } Flags(currentPosition, options, OnEnumFlagSelected, currentLabel, currentProperty); }
void DrawByteFlag() { if (Enum.GetUnderlyingType(enumType) != typeof(byte)) { EditorGUI.HelpBox(currentPosition, string.Format("Underlying type of {0} must be of type {1}.", enumType.Name, typeof(byte)), MessageType.Error); return; } var byteFlag = currentProperty.GetValue <ByteFlag>(); var options = new FlagsOption[enumValues.Length]; for (int i = 0; i < options.Length; i++) { var name = enumNames[i].Replace('_', '/').ToGUIContent(); var value = Convert.ToByte(enumValues.GetValue(i)); options[i] = new FlagsOption(name, value, byteFlag[value]); } Flags(currentPosition, options, OnByteFlagSelected, currentLabel, currentProperty); }
void DrawByteFlag() { if (Enum.GetUnderlyingType(enumType) != typeof(byte)) { EditorGUI.HelpBox(currentPosition, string.Format("Underlying type of {0} must be of type {1}.", enumType.Name, typeof(byte)), MessageType.Error); return; } var byteFlag = currentProperty.GetValue<ByteFlag>(); var options = new FlagsOption[enumValues.Length]; for (int i = 0; i < options.Length; i++) { var name = enumNames[i].Replace('_', '/').ToGUIContent(); var value = Convert.ToByte(enumValues.GetValue(i)); options[i] = new FlagsOption(name, value, byteFlag[value]); } Flags(currentPosition, options, OnByteFlagSelected, currentLabel, currentProperty); }
void OnByteFlagSelected(FlagsOption option, SerializedProperty property) { var byteFlag = property.GetValue <ByteFlag>(); switch (option.Type) { case FlagsOption.OptionTypes.Everything: byteFlag = new ByteFlag(enumValues.Convert((object v) => Convert.ToByte(v))); break; case FlagsOption.OptionTypes.Nothing: byteFlag = ByteFlag.Nothing; break; case FlagsOption.OptionTypes.Custom: byte value = (byte)option.Value; byteFlag = byteFlag[value] ? byteFlag - value : byteFlag + value; break; } property.SetValue(byteFlag); }
void OnEnumFlagSelected(FlagsOption option, SerializedProperty property) { var flags = property.GetValue<IEnumFlag>(); switch (option.Type) { case FlagsOption.OptionTypes.Everything: foreach (IEnumFlag value in enumValues) flags = flags.Add(value); break; case FlagsOption.OptionTypes.Nothing: foreach (IEnumFlag value in enumValues) flags = flags.Remove(value); break; case FlagsOption.OptionTypes.Custom: if (option.IsSelected) flags = flags.Remove((IEnumFlag)option.Value); else flags = flags.Add((IEnumFlag)option.Value); break; } property.SetValue(flags); }
void ShowEnumFlag() { var enumFlagValue = currentProperty.GetValue<IEnumFlag>(); var options = new FlagsOption[enumValues.Length]; for (int i = 0; i < options.Length; i++) { var flags = (IEnumFlag)enumValues.GetValue(i); options[i] = new FlagsOption(enumNames[i].ToGUIContent(), flags, enumFlagValue.HasAll(flags)); } Flags(currentPosition, currentProperty, options, OnEnumFlagSelected, currentLabel); }
public static void Flags(Rect position, FlagsOption[] options, Action <FlagsOption, SerializedProperty> onSelected, GUIContent label = null, SerializedProperty property = null) { label = label ?? property.ToGUIContent(); int selectedCount = options.Count(option => option.IsSelected); bool nothing = selectedCount == 0; bool everything = selectedCount == options.Length; GUIContent popupName; position = EditorGUI.PrefixLabel(position, label); if (nothing) { popupName = "Nothing".ToGUIContent(); } else if (everything) { popupName = "Everything".ToGUIContent(); } else { var name = ""; foreach (var option in options) { if (option.IsSelected) { if (string.IsNullOrEmpty(name)) { name = option.Label.text; } else { name += " | " + option.Label.text; } } } if (selectedCount > 1 && name.GetWidth(EditorStyles.miniFont) > position.width) { popupName = string.Format("Mixed ({0}) ...", selectedCount).ToGUIContent(); } else { popupName = name.ToGUIContent(); } } int indent = EditorGUI.indentLevel; EditorGUI.indentLevel = 0; GenericMenu.MenuFunction2 callback = data => onSelected((FlagsOption)data, property); if (GUI.Button(position, GUIContent.none, new GUIStyle())) { var menu = new GenericMenu(); menu.AddItem(FlagsOption.GetNothing(nothing), callback); menu.AddItem(FlagsOption.GetEverything(everything), callback); for (int i = 0; i < options.Length; i++) { var option = options[i]; menu.AddItem(option.Label, option.IsSelected, callback, option); } menu.DropDown(position); } EditorGUI.LabelField(position, popupName, EditorStyles.popup); EditorGUI.indentLevel = indent; }
public static void AddItem(this GenericMenu menu, FlagsOption option, GenericMenu.MenuFunction2 callback) { menu.AddItem(option.Label, option.IsSelected, callback, option); }
void DrawNumericalFlag() { var enumValue = currentProperty.GetValue<int>(); var options = new FlagsOption[enumValues.Length]; for (int i = 0; i < options.Length; i++) { var name = enumNames[i].Replace('_', '/').ToGUIContent(); var value = Convert.ToInt32(enumValues.GetValue(i)); options[i] = new FlagsOption(name, value, (enumValue & value) == value); } Flags(currentPosition, options, OnEnumFlagSelected, currentLabel, currentProperty); }
void OnEnumFlagSelected(FlagsOption option, SerializedProperty property) { var enumValue = property.GetValue<int>(); switch (option.Type) { case FlagsOption.OptionTypes.Everything: enumValue = -1; break; case FlagsOption.OptionTypes.Nothing: enumValue = 0; break; case FlagsOption.OptionTypes.Custom: var value = (int)option.Value; if ((enumValue & value) == value) enumValue &= ~value; else enumValue |= value; break; } property.SetValue(enumValue); }
void OnByteFlagSelected(FlagsOption option, SerializedProperty property) { var byteFlag = property.GetValue<ByteFlag>(); switch (option.Type) { case FlagsOption.OptionTypes.Everything: byteFlag = new ByteFlag(enumValues.Convert((object v) => Convert.ToByte(v))); break; case FlagsOption.OptionTypes.Nothing: byteFlag = ByteFlag.Nothing; break; case FlagsOption.OptionTypes.Custom: byte value = (byte)option.Value; byteFlag = byteFlag[value] ? byteFlag - value : byteFlag + value; break; } property.SetValue(byteFlag); }