public UI_SimulationBatch()
 {
     _settings     = new Simulation.Settings();
     _editSettings = new UI_SimulationSettings(_settings);
     _files        = new List <string>();
     _folders      = new List <string>();
     _windows      = new Stack <GUI.WindowFunction>();
     _windows.Push(BatchListWindow);
     // hide window initially
     hidden = true;
 }
    /// <summary>
    /// Simulation settings window function called by UI_Toolbar.
    /// </summary>
    void MainWindow(int windowID)
    {
        float lw = 200f;

        // simulation information
        GUILayout.BeginHorizontal(GUILayout.Width(UI_Toolbar.I.innerWidth));
        GUILayout.Label(Simulation.settings.title + "(" + Simulation.simulationNumber + "/" +
                        Simulation.batch.Count + ") ", GUILayout.Width(lw));
        GUILayout.Label("Test " + Simulation.testNumber + "/" + Simulation.settings.numberOfTests);
        GUILayout.EndHorizontal();

        GUILayout.BeginHorizontal(GUILayout.Width(UI_Toolbar.I.innerWidth));
        GUILayout.Label("Time (s): " + Simulation.time.ToString("G3") + "/" +
                        Simulation.settings.maximumTestTime, GUILayout.Width(lw));
        GUILayout.EndHorizontal();


        // exhbition mode tickbox
        GUILayout.BeginHorizontal(GUILayout.Width(UI_Toolbar.I.innerWidth));
        GUILayout.Label("Exhibition Mode: ", GUILayout.Width(lw));
        Simulation.exhibitionMode = GUILayout.Toggle(Simulation.exhibitionMode, "");
        GUILayout.EndHorizontal();

        // timescale slider
        GUILayout.BeginHorizontal(GUILayout.Width(UI_Toolbar.I.innerWidth));
        GUILayout.Label("Simulation Timescale: ", GUILayout.Width(lw));
        Simulation.timeScale = GUILayout.HorizontalSlider(
            Simulation.timeScale,
            0.5f, 4f);
        GUILayout.EndHorizontal();

        // contextual control buttons
        if (Simulation.isRunning)
        {
            GUILayout.BeginHorizontal();
            if (Simulation.paused)
            {
                if (GUILayout.Button("Play"))
                {
                    Simulation.paused = false;
                }
            }
            else
            {
                if (GUILayout.Button("Pause"))
                {
                    Simulation.paused = true;
                }
            }
            if (GUILayout.Button("Stop"))
            {
                Simulation.exhibitionMode = false;
                Simulation.End();
            }
            GUILayout.EndHorizontal();
            if (GUILayout.Button("Next Test"))
            {
                Simulation.NextTest();
            }
        }
        if (Simulation.isFinished)
        {
            if (GUILayout.Button("Start Again"))
            {
                Simulation.Begin();
            }
            if (GUILayout.Button("New Simulation..."))
            {
                Simulation.End();
            }
        }

        // show/hide button for edit settings window
        if (_liveEditSettings)
        {
            if (GUILayout.Button("Hide Settings"))
            {
                _liveEditSettings = false;
                UI_Toolbar.I.additionalWindows.Remove((IWindowFunction)_editSettings);
            }
        }
        else
        {
            if (GUILayout.Button("Show Settings"))
            {
                _editSettings     = new UI_SimulationSettings(Simulation.settings);
                _liveEditSettings = true;
                UI_Toolbar.I.additionalWindows.Add((IWindowFunction)_editSettings);
            }
        }

        // update controls when _editSettings is completed
        if (_liveEditSettings)
        {
            if (_editSettings.windowFunction == null)
            {
                _liveEditSettings = false;
            }
        }
    }
    /// <summary>
    /// List Simulation.Settings in Simulation.batch and provide controls and editing the Simulation.batch
    /// </summary>
    void BatchListWindow(int windowID)
    {
        GUILayout.BeginHorizontal(GUILayout.Width(UI_Toolbar.I.innerWidth));

        // add a new simulation to batch
        if (GUILayout.Button("Add new simulation"))
        {
            _settings     = new Simulation.Settings();
            _editSettings = new UI_SimulationSettings(_settings);
            UI_Toolbar.I.additionalWindows.Add((IWindowFunction)_editSettings);
        }
        // load a simulation from xml file
        if (GUILayout.Button("Add to batch from file..."))
        {
            Refresh();
            _windows.Push(XmlBrowser);
        }
        GUILayout.EndHorizontal();

        // Batch list
        GUILayout.Label("Currently in batch:");
        if (Simulation.batch.Count < 1)
        {
            GUILayout.Label("None");
        }

        for (int i = 0; i < Simulation.batch.Count; i++)
        {
            Simulation.Settings batchItem = Simulation.batch[i];
            // batch list table row by row
            GUILayout.BeginHorizontal(GUILayout.Width(UI_Toolbar.I.innerWidth));
            // display batch position
            if (i + 1 == Simulation.simulationNumber)
            {
                GUILayout.Label("->");
            }
            // label
            string label = i + 1 + ". " + batchItem.title + ", " + batchItem.time;
            if (batchItem.active)
            {
                label += ", RUNNING";
            }
            GUILayout.Label(label);
            // edit these settings
            if (GUILayout.Button("Edit"))
            {
                _settings     = batchItem;
                _editSettings = new UI_SimulationSettings(_settings);
                UI_Toolbar.I.additionalWindows.Add((IWindowFunction)_editSettings);
            }
            if (GUILayout.Button("X"))
            {
                Simulation.batch.RemoveAt(i);
            }
            // indicate which have been executed already
            // if (batchItem.executed)

            GUILayout.EndHorizontal();
        }

        GUILayout.Space(10);
        // start simulating
        if (Simulation.batch.Count > 0)
        {
            if (GUILayout.Button("Start Batch"))
            {
                BotNavSim.state = BotNavSim.State.Simulating;
                Simulation.Begin();
            }
            GUILayout.Space(20);
            // remove all simulations from batch
            GUILayout.Space(20);
            if (GUILayout.Button("Clear Batch"))
            {
                Simulation.batch.Clear();
            }
        }
    }
 public UI_SimulationControl()
 {
     _editSettings = new UI_SimulationSettings(Simulation.settings);
     hidden        = true;
 }