public static PlaygroundRecorderData CreateNewRecorderDataDialogue()
    {
        string dataPath = EditorUtility.SaveFilePanelInProject(playgroundLanguage.newPlaygroundRecording, "PlaygroundRecording", "asset", playgroundLanguage.newPlaygroundRecordingMsg);

        if (dataPath.Length > 0)
        {
            PlaygroundRecorderData newData = PlaygroundRecorderData.New();
            AssetDatabase.CreateAsset(newData, dataPath);
            AssetDatabase.Refresh();

            return(newData);
        }
        return(null);
    }
    public override void OnInspectorGUI()
    {
        if (boxStyle == null)
        {
            boxStyle = GUI.skin.FindStyle("box");
        }

        bool hasParticleSystem = recorder.playgroundSystem != null;

        if (!hasParticleSystem)
        {
            EditorGUILayout.HelpBox(playgroundLanguage.missingParticleSystemWarning, MessageType.Warning);
        }
        bool hasRecorderData = recorder.recorderData != null;

        EditorGUILayout.BeginVertical(boxStyle);
        playgroundSettings.playgroundRecorderFoldout = GUILayout.Toggle(playgroundSettings.playgroundRecorderFoldout, playgroundLanguage.playgroundRecorder, EditorStyles.foldout);
        if (playgroundSettings.playgroundRecorderFoldout)
        {
            EditorGUILayout.BeginVertical(boxStyle);

            // Playback & Recorder foldout
            if (GUILayout.Button(playgroundLanguage.player, EditorStyles.toolbarDropDown))
            {
                playgroundSettings.recorderPlaybackFoldout = !playgroundSettings.recorderPlaybackFoldout;
            }
            if (playgroundSettings.recorderPlaybackFoldout)
            {
                EditorGUILayout.Separator();
                if (!hasRecorderData)
                {
                    EditorGUILayout.BeginVertical(boxStyle);
                    EditorGUILayout.HelpBox(playgroundLanguage.missingRecorderDataWarning, MessageType.Warning);
                    EditorGUILayout.BeginHorizontal();
                    if (GUILayout.Button(playgroundLanguage.createNew, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                    {
                        PlaygroundRecorderData newData = CreateNewRecorderDataDialogue();
                        if (newData != null)
                        {
                            recorder.recorderData = newData;
                        }
                    }
                    recorder.recorderData = (PlaygroundRecorderData)EditorGUILayout.ObjectField(recorder.recorderData, typeof(PlaygroundRecorderData), false);
                    EditorGUILayout.EndHorizontal();
                    EditorGUILayout.EndVertical();
                    EditorGUILayout.Separator();
                }


                EditorGUILayout.BeginHorizontal();

                GUI.enabled = !recorder.IsRecording() && hasParticleSystem && recorder.HasRecordedFrames();
                if (GUILayout.Button(recorder.IsReplaying()? playgroundLanguage.pauseSymbol : playgroundLanguage.playSymbol, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    if (recorder.IsReplaying())
                    {
                        recorder.Pause();
                    }
                    else
                    {
                        recorder.Play(recorder.playHead, recorder.playbackSpeed, recorder.loopPlayback);
                    }
                }
                GUI.enabled = hasParticleSystem && recorder.HasRecordedFrames();

                if (GUILayout.Button(playgroundLanguage.stopSymbol, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    if (recorder.IsInPlayback())
                    {
                        recorder.SetParticleSystemAsCurrentPlayback();
                    }
                    else
                    {
                        recorder.StopAndSerialize();
                        recorder.playHead = 0;
                    }
                }

                GUI.enabled = hasParticleSystem;

                if (recorder.IsRecording())
                {
                    GUI.color = Color.red;
                }

                GUILayout.Space(4f);

                if (GUILayout.Button(playgroundLanguage.recordSymbol, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    if (!recorder.IsRecording())
                    {
                        recorder.StartRecording();
                    }
                    else
                    {
                        recorder.StopAndSerialize();
                        recorder.playHead = 0;
                    }
                }

                GUI.color = Color.white;

                GUI.enabled = recorder.HasRecordedFrames() && hasParticleSystem;
                if (GUILayout.Button(playgroundLanguage.clear, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                {
                    if (EditorUtility.DisplayDialog(playgroundLanguage.clearRecording, playgroundLanguage.clearRecordingMsg, playgroundLanguage.yes, playgroundLanguage.no))
                    {
                        recorder.ClearRecording();
                    }
                }

                GUILayout.FlexibleSpace();

                _inTrimming = GUILayout.Toggle(_inTrimming, playgroundLanguage.trim, EditorStyles.toolbarButton);

                GUI.enabled = true;

                EditorGUILayout.EndHorizontal();

                EditorGUILayout.Separator();

                GUI.enabled = recorder.HasRecordedFrames();

                float currentPlayHead = recorder.playHead;

                if (!_inTrimming)
                {
                    recorder.playHead = EditorGUILayout.Slider(playgroundLanguage.playHeadPosition, recorder.playHead, 0, 1f);
                }
                else
                {
                    GUILayout.BeginHorizontal();
                    EditorGUILayout.Separator();
                    if (GUILayout.Button(playgroundLanguage.trimOuter, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                    {
                        string framesRemoved = "[0-" + recorder.GetFrameAtTime(_leftTrimPos) + "] - [" + recorder.GetFrameAtTime(_rightTrimPos) + "-" + recorder.FrameCount() + "]";
                        if (EditorUtility.DisplayDialog(playgroundLanguage.trim, playgroundLanguage.trimMsg + framesRemoved + "?", playgroundLanguage.yes, playgroundLanguage.no))
                        {
                            if (recorder.Trim(_leftTrimPos, _rightTrimPos))
                            {
                                _leftTrimPos  = 0;
                                _rightTrimPos = 1f;
                            }
                        }
                    }
                    if (GUILayout.Button(playgroundLanguage.trimInner, EditorStyles.toolbarButton, GUILayout.ExpandWidth(false)))
                    {
                        string framesRemoved = "[" + recorder.GetFrameAtTime(_leftTrimPos) + "-" + recorder.GetFrameAtTime(_rightTrimPos) + "]";
                        if (EditorUtility.DisplayDialog(playgroundLanguage.trim, playgroundLanguage.trimMsg + framesRemoved + "?", playgroundLanguage.yes, playgroundLanguage.no))
                        {
                            recorder.TrimInner(_leftTrimPos, _rightTrimPos);
                            _leftTrimPos  = 0;
                            _rightTrimPos = 1f;
                        }
                    }
                    GUILayout.EndHorizontal();

                    float l = _leftTrimPos;
                    float r = _rightTrimPos;
                    EditorGUILayout.MinMaxSlider(ref _leftTrimPos, ref _rightTrimPos, 0, 1f);


                    if (!Mathf.Approximately(_leftTrimPos, l))
                    {
                        _leftWasLastMoved = true;
                    }
                    if (!Mathf.Approximately(_rightTrimPos, r))
                    {
                        _leftWasLastMoved = false;
                    }

                    if (!recorder.IsReplaying())
                    {
                        recorder.playHead = _leftWasLastMoved? _leftTrimPos : _rightTrimPos;
                    }
                    else
                    {
                        _leftWasLastMoved = true;
                    }

                    if (recorder.playHead >= _rightTrimPos && recorder.IsReplaying())
                    {
                        recorder.playHead = _leftTrimPos;
                    }
                    if (recorder.playHead < _leftTrimPos && recorder.IsReplaying() && recorder.playbackSpeed > 0)
                    {
                        recorder.playHead = _leftTrimPos;
                    }
                    if (recorder.playHead <= _leftTrimPos && (!_leftWasLastMoved || recorder.IsReplaying() && recorder.playbackSpeed < 0))
                    {
                        recorder.playHead = _rightTrimPos;
                    }
                }

                if (currentPlayHead != recorder.playHead)
                {
                    recorder.Scrub(recorder.playHead);
                }

                string playbackStatus  = "No Recording";
                string playbackData    = "";
                float  recordedSeconds = ((recorder.FrameCount() * 1f) * recorder.keyframeInterval) / recorder.playbackSpeed;

                if (_inTrimming)
                {
                    playbackStatus = "TRIMMING";
                    GUI.color      = Color.yellow;
                }
                else if (recorder.IsRecording())
                {
                    playbackStatus = "RECORDING";
                    GUI.color      = Color.red;
                }
                else if (recorder.IsInPlayback())
                {
                    playbackStatus = "In Playback";
                    GUI.color      = Color.green;
                }
                else if (!recorder.IsInPlayback() && recorder.HasRecordedFrames())
                {
                    playbackStatus = "Live Particles";
                    GUI.color      = Color.cyan;
                }
                if (recorder.HasRecordedFrames() && recorder.IsInPlayback())
                {
                    if (_inTrimming)
                    {
                        playbackData = " (Left: " + recorder.GetFrameAtTime(_leftTrimPos) + " | Right: " + recorder.GetFrameAtTime(_rightTrimPos) + ")";
                    }
                    else if (!recorder.IsRecording())
                    {
                        playbackData = " (" + (recordedSeconds * recorder.playHead).ToString("F1") + "/" + recordedSeconds.ToString("F1") + " s)";
                    }
                    else if (!_inTrimming)
                    {
                        playbackData = " (" + (recordedSeconds).ToString("F1") + " s)";
                    }
                }
                PlaybackBar(recorder.HasRecordedFrames()? (recorder.IsRecording()? 1f : recorder.playHead) : 0, playbackStatus + playbackData, Screen.width - 56f);

                GUI.color           = Color.white;
                GUI.backgroundColor = Color.white;
                GUILayout.Space(-10f);
                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.LabelField("Time: " + (recorder.HasRecordedFrames()?(recordedSeconds * recorder.playHead).ToString("F1") + " / " + recordedSeconds.ToString("F1") + " s" + " (" + recorder.playbackSpeed.ToString("F1") + "x)" : "-"), EditorStyles.objectFieldThumb, GUILayout.Width((Screen.width / 2f) - 30f));
                EditorGUILayout.LabelField("Frame: " + (recorder.HasRecordedFrames()?recorder.GetFrameAtTime(recorder.playHead).ToString() + " / " + recorder.FrameCount() : "-"), EditorStyles.objectFieldThumb, GUILayout.Width((Screen.width / 2f) - 30f));
                EditorGUILayout.EndHorizontal();

                GUI.enabled = true;

                EditorGUILayout.Separator();
            }

            // Advanced foldout
            if (GUILayout.Button(playgroundLanguage.advanced, EditorStyles.toolbarDropDown))
            {
                playgroundSettings.recorderAdvancedFoldout = !playgroundSettings.recorderAdvancedFoldout;
            }
            if (playgroundSettings.recorderAdvancedFoldout)
            {
                EditorGUILayout.Separator();
                recorder.playgroundSystem             = (PlaygroundParticlesC)EditorGUILayout.ObjectField(playgroundLanguage.particleSystem, recorder.playgroundSystem, typeof(PlaygroundParticlesC), true);
                recorder.recorderData                 = (PlaygroundRecorderData)EditorGUILayout.ObjectField(playgroundLanguage.recorderData, recorder.recorderData, typeof(PlaygroundRecorderData), false);
                recorder.keyframeInterval             = EditorGUILayout.FloatField(playgroundLanguage.keyframeInterval, recorder.keyframeInterval);
                recorder.playbackSpeed                = EditorGUILayout.FloatField(playgroundLanguage.playbackSpeed, recorder.playbackSpeed);
                recorder.loopPlayback                 = GUILayout.Toggle(recorder.loopPlayback, playgroundLanguage.loop);
                recorder.fadeIn                       = GUILayout.Toggle(recorder.fadeIn, playgroundLanguage.fadeIn);
                recorder.sizeIn                       = GUILayout.Toggle(recorder.sizeIn, playgroundLanguage.sizeIn);
                recorder.skipInterpolationOnEndFrames = GUILayout.Toggle(recorder.skipInterpolationOnEndFrames, playgroundLanguage.skipInterpolationOnEndFrames);
                recorder.localSpaceOnPlayback         = GUILayout.Toggle(recorder.localSpaceOnPlayback, playgroundLanguage.setLocalSpaceOnPlayback);
                recorder.multithreading               = GUILayout.Toggle(recorder.multithreading, playgroundLanguage.multithreading);
                EditorGUILayout.Separator();
            }

            EditorGUILayout.EndVertical();
        }

        EditorGUILayout.EndVertical();
    }
    public static PlaygroundRecorderData New()
    {
        PlaygroundRecorderData newData = ScriptableObject.CreateInstance <PlaygroundRecorderData>();

        return(newData);
    }