void OnEnable()
 {
     if (!BuilderManager.isInitialized)
     {
         BuilderManager.Init();
     }
 }
        void OnGUI()
        {
            GUI.enabled = !BuilderManager.isBuilding;

            selectedMode = GUILayout.Toolbar(selectedMode, new string[] { "Queue", "Configurations", "Batches" });

            scrollPos = EditorGUILayout.BeginScrollView(scrollPos);

            switch (selectedMode)
            {
            case 0:
                DrawQueueEditor();
                break;

            case 1:
                DrawConfigsList();
                break;

            case 2:
                DrawBatches();
                break;
            }

            EditorGUILayout.EndScrollView();

            GUI.enabled = true;

            if (BuilderManager.isBuilding)
            {
                BuilderManager.DrawBuildProgressBar();
            }
        }
        private void DrawQueuedConfigs()
        {
            for (int i = 0; i < BuilderManager.buildQueue.Count; i++)
            {
                EditorGUILayout.BeginHorizontal();

                EditorGUILayout.LabelField((i + 1) + ".", EditorStyles.centeredGreyMiniLabel, GUILayout.Width(15f));

                EditorGUILayout.LabelField(BuilderManager.data.Configs[BuilderManager.buildQueue[i]].name);

                if (GUILayout.Button("Build", EditorStyles.miniButtonLeft))
                {
                    if (EditorUtility.DisplayDialog("Builder", "Run solo build for " + BuilderManager.data.Configs[BuilderManager.buildQueue[i]].name + "?", "Yes", "No"))
                    {
                        BuilderManager.BuildConfig(BuilderManager.buildQueue[i]);
                    }
                }
                else if (GUILayout.Button("Edit", EditorStyles.miniButtonMid))
                {
                    ConfigEditorWindow.EditConfig(BuilderManager.buildQueue[i]);
                }
                else if (GUILayout.Button("Remove", EditorStyles.miniButtonRight))
                {
                    BuilderManager.buildQueue.RemoveAt(i);
                }

                EditorGUILayout.EndHorizontal();
            }
        }
        private void DrawBatch(int index)
        {
            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.LabelField(new GUIContent(BuilderManager.data.Batches[index].name));

            if (GUILayout.Button("Build", EditorStyles.miniButtonLeft, GUILayout.MaxWidth(80f)))
            {
                if (EditorUtility.DisplayDialog("Builder", "Build " + BuilderManager.data.Batches[index].name + " batch?", "Yes", "No"))
                {
                    BuilderManager.BuildBatch(index);
                }
            }
            if (GUILayout.Button("Edit", EditorStyles.miniButtonMid, GUILayout.MaxWidth(80f)))
            {
                BatchEditorWindow.EditBatch(index);
            }

            if (GUILayout.Button("Delete", EditorStyles.miniButtonRight, GUILayout.MaxWidth(80f)))
            {
                if (EditorUtility.DisplayDialog("Builder", "Really delete " + BuilderManager.data.Batches[index].name + " batch?", "Yes", "No"))
                {
                    BuilderManager.data.RemoveBatch(index);
                }
            }

            EditorGUILayout.EndHorizontal();
        }
        private void DrawConfig(int index)
        {
            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.LabelField(new GUIContent(BuilderManager.data.Configs[index].name));

            if (GUILayout.Button("Build", EditorStyles.miniButtonLeft, GUILayout.MaxWidth(80f)))
            {
                if (EditorUtility.DisplayDialog("Builder", "Build " + BuilderManager.data.Configs[index].name + " configuration?", "Yes", "No"))
                {
                    BuilderManager.BuildConfig(index);
                }
            }
            if (GUILayout.Button("Edit", EditorStyles.miniButtonMid, GUILayout.MaxWidth(80f)))
            {
                ConfigEditorWindow.EditConfig(index);
            }
            if (GUILayout.Button("Set Active", EditorStyles.miniButtonMid, GUILayout.MaxWidth(80f)))
            {
                if (EditorUtility.DisplayDialog("Builder", "Set the environment to the " + BuilderManager.data.Configs[index].name + " configuration?", "Yes", "No"))
                {
                    EditorUserBuildSettings.SwitchActiveBuildTarget(BuilderManager.data.Configs[index].buildTarget);
                    PlayerSettings.SetScriptingDefineSymbolsForGroup(BuilderManager.data.Configs[index].BuildTargetGroup, BuilderManager.data.Configs[index].scriptingDefineSymbols);
                }
            }
            if (GUILayout.Button("Delete", EditorStyles.miniButtonRight, GUILayout.MaxWidth(80f)))
            {
                if (EditorUtility.DisplayDialog("Builder", "Really delete " + BuilderManager.data.Configs[index].name + " configuration?", "Yes", "No"))
                {
                    BuilderManager.data.RemoveConfig(index);
                }
            }

            EditorGUILayout.EndHorizontal();
        }
 void OnDisable()
 {
     BuilderManager.Reset();
 }
        private void DrawQueueEditor()
        {
            EditorGUILayout.BeginVertical(EditorStyles.textArea, GUILayout.ExpandHeight(true));

            EditorGUILayout.LabelField("Queued Configurations", EditorStyles.centeredGreyMiniLabel);

            DrawQueuedConfigs();

            EditorGUILayout.BeginHorizontal();

            if (GUILayout.Button("Add Config", EditorStyles.miniButtonLeft))
            {
                ShowAddConfigContextMenu();
            }

            GUI.enabled = BuilderManager.data.NumBatches > 0 && !BuilderManager.isBuilding;

            if (GUILayout.Button("Add Batch", EditorStyles.miniButtonRight))
            {
                ShowAddBatchContextMenu();
            }

            GUI.enabled = true;

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.EndVertical();

            if (BuilderManager.buildQueue.Count == 0)
            {
                EditorGUILayout.LabelField("Queue is empty.", EditorStyles.helpBox);
            }

            EditorGUILayout.BeginHorizontal();

            GUI.enabled = BuilderManager.buildQueue.Count > 0 && !BuilderManager.isBuilding;

            if (GUILayout.Button("Build Queue", EditorStyles.miniButtonLeft))
            {
                if (EditorUtility.DisplayDialog("Builder", "Build all queued configurations?", "Yes", "No"))
                {
                    BuilderManager.BuildQueue();
                }
            }
            else if (GUILayout.Button("Save as Batch", EditorStyles.miniButtonMid))
            {
                PopupWindow.Show(new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y, 0, 0), new SaveBatchPopup());
            }

            else if (GUILayout.Button("Remove All", EditorStyles.miniButtonRight))
            {
                if (EditorUtility.DisplayDialog("Builder", "Really remove all queued configurations?", "Yes", "No"))
                {
                    BuilderManager.buildQueue.Clear();
                }
            }

            GUI.enabled = true;

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.Space();
        }