private void OnGUI()
        {
            GUILayout.Label("Injection Detector options", EditorStyles.boldLabel);

            bool enableInjectionDetector = false;

            enableInjectionDetector = EditorPrefs.GetBool(ActEditorGlobalStuff.PREFS_INJECTION_GLOBAL);
            enableInjectionDetector = GUILayout.Toggle(enableInjectionDetector, "Enable Injection Detector");

            if (GUILayout.Button("Edit Whitelist"))
            {
                ActAssembliesWhitelist.ShowWindow();
            }

            if (GUI.changed || EditorPrefs.GetBool(ActEditorGlobalStuff.PREFS_INJECTION) != enableInjectionDetector)
            {
                EditorPrefs.SetBool(ActEditorGlobalStuff.PREFS_INJECTION, enableInjectionDetector);
                EditorPrefs.SetBool(ActEditorGlobalStuff.PREFS_INJECTION_GLOBAL, enableInjectionDetector);
            }

            if (!enableInjectionDetector)
            {
                ActEditorGlobalStuff.CleanInjectionDetectorData();
            }
            else if (!File.Exists(ActEditorGlobalStuff.INJECTION_DATA_PATH))
            {
                ActPostprocessor.InjectionAssembliesScan();
            }
        }
        private void OnGUI()
        {
            GUILayout.Label("Injection Detector settings (global)", ActEditorStyles.LargeBoldWrappedLabel);

            bool enableInjectionDetector = false;

            enableInjectionDetector = EditorPrefs.GetBool(ActEditorGlobalStuff.PREFS_INJECTION_ENABLED);

            EditorGUI.BeginChangeCheck();
            enableInjectionDetector = GUILayout.Toggle(enableInjectionDetector, "Enable Injection Detector");
            if (EditorGUI.EndChangeCheck())
            {
                EditorPrefs.SetBool(ActEditorGlobalStuff.PREFS_INJECTION_ENABLED, enableInjectionDetector);
                if (enableInjectionDetector && !ActPostprocessor.IsInjectionDetectorTargetCompatible())
                {
                    Debug.LogWarning(ActEditorGlobalStuff.LOG_PREFIX + "Injection Detector is not available on selected platform (" + EditorUserBuildSettings.activeBuildTarget + ")");
                }

                if (!enableInjectionDetector)
                {
                    ActEditorGlobalStuff.CleanInjectionDetectorData();
                }
                else if (!File.Exists(ActEditorGlobalStuff.injectionDataPath))
                {
                    ActPostprocessor.InjectionAssembliesScan();
                }
            }

            if (GUILayout.Button("Edit Whitelist"))
            {
                ActAssembliesWhitelist.ShowWindow();
            }

            EditorGUILayout.Space();
            GUILayout.Label("WallHack Detector settings (per-project)", ActEditorStyles.LargeBoldWrappedLabel);
            GUILayout.Label("Wireframe module uses specific shader under the hood. Thus such shader should be included into the build to exist at runtime. To make sure it's get included, you may add it to the Always Included Shaders list using buttons below. You don't need to include it if you're not going to use Wireframe module.", EditorStyles.wordWrappedLabel);

            ReadGraphicsAsset();

            if (graphicsSettingsAsset != null && includedShaders != null)
            {
                // outputs whole included shaders list, use for debug
                //EditorGUILayout.PropertyField(includedShaders, true);

                int shaderIndex = GetWallhackDetectorShaderIndex();

                EditorGUI.BeginChangeCheck();

                if (shaderIndex != -1)
                {
                    GUILayout.Label("Shader already exists in the Always Included Shaders list, you're good to go!", EditorStyles.wordWrappedLabel);
                    if (GUILayout.Button("Remove shader"))
                    {
                        includedShaders.DeleteArrayElementAtIndex(shaderIndex);
                        includedShaders.DeleteArrayElementAtIndex(shaderIndex);
                    }
                }
                else
                {
                    GUILayout.Label("Shader doesn't exists in the Always Included Shaders list.", EditorStyles.wordWrappedLabel);
                    if (GUILayout.Button("Include shader"))
                    {
                        Shader shader = Shader.Find(WIREFRAME_SHADER_NAME);
                        if (shader != null)
                        {
                            includedShaders.InsertArrayElementAtIndex(includedShaders.arraySize);
                            SerializedProperty newItem = includedShaders.GetArrayElementAtIndex(includedShaders.arraySize - 1);
                            newItem.objectReferenceValue = shader;
                        }
                        else
                        {
                            Debug.LogError("Can't find " + WIREFRAME_SHADER_NAME + " shader! Please report this to the  " + ActEditorGlobalStuff.REPORT_EMAIL + " including your Unity version number.");
                        }
                    }
                    if (GUILayout.Button("Open Graphics Settings to manage it manually (see readme.pdf for details)"))
                    {
                        EditorApplication.ExecuteMenuItem("Edit/Project Settings/Graphics");
                    }
                }

                if (EditorGUI.EndChangeCheck())
                {
                    graphicsSettingsAsset.ApplyModifiedProperties();
                }
            }
            else
            {
                GUILayout.Label("Can't automatically control " + WIREFRAME_SHADER_NAME + " shader existence at the Always Included Shaders list. Please, manage this manually in Graphics Settings.");
                if (GUILayout.Button("Open Graphics Settings"))
                {
                    EditorApplication.ExecuteMenuItem("Edit/Project Settings/Graphics");
                }
            }
        }