public static bool RenderEventHeader(VRCSDK2.VRC_EventHandler myTarget, VRCSDK2.VRC_EventHandler.VrcEvent evt)
        {
            EditorGUILayout.BeginHorizontal();
            evt.EventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", evt.EventType, (v) => v != VRC_EventHandler.VrcEventType.SpawnObject && v != VRC_EventHandler.VrcEventType.SendMessage);
            bool delete = GUILayout.Button("Remove");

            EditorGUILayout.EndHorizontal();

            return(delete);
        }
        public static VRCSDK2.VRC_EventHandler.VrcEvent RenderAddEvent(VRCSDK2.VRC_EventHandler myTarget)
        {
            VRCSDK2.VRC_EventHandler.VrcEvent newEvent = null;

            EditorGUILayout.BeginHorizontal();
            lastAddedEventType = VRC_EditorTools.FilteredEnumPopup("New Event Type", lastAddedEventType, (v) => v != VRC_EventHandler.VrcEventType.SpawnObject && v != VRC_EventHandler.VrcEventType.SendMessage);
            if (GUILayout.Button("Add"))
            {
                newEvent = new VRCSDK2.VRC_EventHandler.VrcEvent
                {
                    EventType       = lastAddedEventType,
                    ParameterObject = myTarget.gameObject
                };
                myTarget.Events.Add(newEvent);
                EditorUtility.SetDirty(myTarget);
            }
            EditorGUILayout.EndHorizontal();

            return(newEvent);
        }
        public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
        {
            if (property == null)
            {
                return;
            }

            SerializedProperty nameProperty   = property.FindPropertyRelative("name");
            SerializedProperty mirrorProperty = property.FindPropertyRelative("mirror");
            SerializedProperty typeProperty   = property.FindPropertyRelative("type");
            SerializedProperty valueProperty  = null;

            switch (typeProperty.enumValueIndex)
            {
            case (int)VRC_DataStorage.VrcDataType.Bool:
                valueProperty = property.FindPropertyRelative("valueBool");
                break;

            case (int)VRC_DataStorage.VrcDataType.Float:
                valueProperty = property.FindPropertyRelative("valueFloat");
                break;

            case (int)VRC_DataStorage.VrcDataType.Int:
                valueProperty = property.FindPropertyRelative("valueInt");
                break;

            case (int)VRC_DataStorage.VrcDataType.String:
                valueProperty = property.FindPropertyRelative("valueString");
                break;

            case (int)VRC_DataStorage.VrcDataType.SerializeObject:
                valueProperty = property.FindPropertyRelative("serializeComponent");
                break;

            case (int)VRC_DataStorage.VrcDataType.None:
            case (int)VRC_DataStorage.VrcDataType.SerializeBytes:
                break;
            }

            EditorGUI.BeginProperty(rect, label, property);

            int  baseWidth     = (int)(rect.width / 4);
            Rect nameRect      = new Rect(rect.x, rect.y, baseWidth, rect.height);
            Rect mirrorRect    = new Rect(rect.x + baseWidth, rect.y, baseWidth, rect.height);
            Rect typeRect      = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth, rect.height);
            Rect valueRect     = new Rect(rect.x + baseWidth * 3, rect.y, baseWidth, rect.height);
            Rect typeValueRect = new Rect(rect.x + baseWidth * 2, rect.y, baseWidth * 2, rect.height);

            EditorGUI.PropertyField(nameRect, nameProperty, GUIContent.none);
            EditorGUI.PropertyField(mirrorRect, mirrorProperty, GUIContent.none);

            switch (mirrorProperty.enumValueIndex)
            {
            case (int)VRC_DataStorage.VrcDataMirror.None:
                if (valueProperty == null)
                {
                    VRC_EditorTools.FilteredEnumPopup <VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true);
                }
                else
                {
                    VRC_EditorTools.FilteredEnumPopup <VRC_DataStorage.VrcDataType>(typeRect, typeProperty, t => true);
                    EditorGUI.PropertyField(valueRect, valueProperty, GUIContent.none);
                }
                break;

            case (int)VRC_DataStorage.VrcDataMirror.SerializeComponent:
                typeProperty.enumValueIndex = (int)VRC_DataStorage.VrcDataType.SerializeObject;
                EditorGUI.PropertyField(typeValueRect, valueProperty, GUIContent.none);
                break;

            default:
                VRC_EditorTools.FilteredEnumPopup <VRC_DataStorage.VrcDataType>(typeValueRect, typeProperty, t => true);
                break;
            }

            EditorGUI.EndProperty();
        }