public void AddNewPreset(HandPosePreset preset)
        {
            presets.Add(preset);

            if (preset.HandPoseImage != null)
            {
                AssetDatabase.AddObjectToAsset(preset.HandPoseImage, this);
            }
            EditorUtility.SetDirty(this);
        }
 public void RemovePreset(HandPosePreset preset)
 {
     AssetDatabase.RemoveObjectFromAsset(preset.HandPoseImage);
     presets.Remove(preset);
     EditorUtility.SetDirty(this);
 }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            var asset = target as HandPosePresetsAsset;

            HandPosePreset removingPreset = null;

            m_presetFilter = EditorGUILayout.TextField("Filter", m_presetFilter);
            GUILayout.Space(12f);

            GUILayout.Label("Presets", "BoldLabel");

            var presets = string.IsNullOrEmpty(m_presetFilter)
                ? asset.SavedPresets
                : asset.SavedPresets.Where(p => p.Name.ToLower().Contains(m_presetFilter.ToLower()));

            foreach (var preset in presets)
            {
                using (new EditorGUILayout.VerticalScope(GUI.skin.box))
                {
                    GUI.changed = false;
                    if (preset.HandPoseImage != null)
                    {
                        GUILayout.Label(new GUIContent(preset.HandPoseImage));
                    }

                    preset.Name = EditorGUILayout.DelayedTextField("Name", preset.Name);
                    GUILayout.Space(8f);
                    var pose = preset.HandPoseData;

                    pose.thumb.spread   = EditorGUILayout.Slider("Thumb Spread", pose.thumb.spread, -1f, 1f);
                    pose.thumb.muscle1  = EditorGUILayout.Slider("Thumb Muscle 1", pose.thumb.muscle1, -1f, 1f);
                    pose.thumb.muscle2  = EditorGUILayout.Slider("Thumb Muscle 2", pose.thumb.muscle2, -1f, 1f);
                    pose.thumb.muscle3  = EditorGUILayout.Slider("Thumb Muscle 3", pose.thumb.muscle3, -1f, 1f);
                    pose.index.spread   = EditorGUILayout.Slider("Index Spread", pose.index.spread, -1f, 1f);
                    pose.index.muscle1  = EditorGUILayout.Slider("Index Muscle 1", pose.index.muscle1, -1f, 1f);
                    pose.index.muscle2  = EditorGUILayout.Slider("Index Muscle 2", pose.index.muscle2, -1f, 1f);
                    pose.index.muscle3  = EditorGUILayout.Slider("Index Muscle 3", pose.index.muscle3, -1f, 1f);
                    pose.middle.spread  = EditorGUILayout.Slider("Middle Spread", pose.middle.spread, -1f, 1f);
                    pose.middle.muscle1 = EditorGUILayout.Slider("Middle Muscle 1", pose.middle.muscle1, -1f, 1f);
                    pose.middle.muscle2 = EditorGUILayout.Slider("Middle Muscle 2", pose.middle.muscle2, -1f, 1f);
                    pose.middle.muscle3 = EditorGUILayout.Slider("Middle Muscle 3", pose.middle.muscle3, -1f, 1f);
                    pose.ring.spread    = EditorGUILayout.Slider("Ring Spread", pose.ring.spread, -1f, 1f);
                    pose.ring.muscle1   = EditorGUILayout.Slider("Ring Muscle 1", pose.ring.muscle1, -1f, 1f);
                    pose.ring.muscle2   = EditorGUILayout.Slider("Ring Muscle 2", pose.ring.muscle2, -1f, 1f);
                    pose.ring.muscle3   = EditorGUILayout.Slider("Ring Muscle 3", pose.ring.muscle3, -1f, 1f);
                    pose.little.spread  = EditorGUILayout.Slider("Little Spread", pose.little.spread, -1f, 1f);
                    pose.little.muscle1 = EditorGUILayout.Slider("Little Muscle 1", pose.little.muscle1, -1f, 1f);
                    pose.little.muscle2 = EditorGUILayout.Slider("Little Muscle 2", pose.little.muscle2, -1f, 1f);
                    pose.little.muscle3 = EditorGUILayout.Slider("Little Muscle 3", pose.little.muscle3, -1f, 1f);

                    if (GUI.changed)
                    {
                        preset.HandPoseData = pose;
                        EditorUtility.SetDirty(target);
                    }

                    using (new EditorGUILayout.HorizontalScope())
                    {
                        GUILayout.FlexibleSpace();
                        if (GUILayout.Button("Remove", GUILayout.Width(80f)))
                        {
                            removingPreset = preset;
                        }
                    }

                    GUILayout.Space(12f);
                }
            }

            if (removingPreset != null)
            {
                asset.RemovePreset(removingPreset);
            }
        }