private void OnGUI()
    {
        if (m_window == null)
        {
            m_window = GetWindow();
            return;
        }
        else
        {
            m_winWidth  = m_window.position.width;
            m_winHeight = m_window.position.height;
            RenderOptions();
        }

        if (!EditorFileManager.DataFileExist(m_colorSchemeFileName))
        {
            LoadDefaultColorSchemes();
            SaveColorSchemes();
        }
        else if (EditorFileManager.DataFileExist(m_colorSchemeFileName) && !m_colorSchemesLoaded)
        {
            LoadColorSchemes();
        }

        if (!EditorFileManager.DataFileExist(m_activeColorSchemeFileName))
        {
            m_selectedColorSchemeType = m_defaultColorSchemeType;
            SaveActiveColorScheme();
        }
        else if (EditorFileManager.DataFileExist(m_activeColorSchemeFileName) && !m_colorSchemeConfigurationLoaded)
        {
            LoadActiveColorScheme();
        }
    }
    private void LoadColorSchemes()
    {
        if (!EditorFileManager.DataFileExist(m_colorSchemeFileName))
        {
            return;
        }
        string data = EditorFileManager.ReadDataFile(m_colorSchemeFileName);
        Dictionary <string, object> deserializedData = MiniJSON.Json.Deserialize(data) as Dictionary <string, object>;

        foreach (EEditorColorSchemes colorSchemeType in Enum.GetValues(typeof(EEditorColorSchemes)))
        {
            Dictionary <string, object> colorSchemeData = deserializedData["ColorScheme-" + colorSchemeType.ToString()] as Dictionary <string, object>;
            if (colorSchemeType == EEditorColorSchemes.Ocean)
            {
                m_colorSchemeOcean = new EditorColorScheme(colorSchemeData);
            }
            else if (colorSchemeType == EEditorColorSchemes.Dark)
            {
                m_colorSchemeDark = new EditorColorScheme(colorSchemeData);
            }
            else if (colorSchemeType == EEditorColorSchemes.Light)
            {
                m_colorSchemeLight = new EditorColorScheme(colorSchemeData);
            }
        }

        m_colorSchemesLoaded = true;

        Debug.Log("Color Schemes Loaded - Ocean: " + m_colorSchemeOcean + " \n\nDark: " + m_colorSchemeDark + " \n\nLight " + m_colorSchemeLight);
    }
    private static void SaveActiveColorScheme()
    {
        Dictionary <string, object> activeColorScheme = new Dictionary <string, object>();
        EditorColorScheme           colorScheme       = GetColorScheme(m_selectedColorSchemeType);

        activeColorScheme.Add("ActiveColorScheme", colorScheme.Serialize());
        string serializedData = MiniJSON.Json.Serialize(activeColorScheme);

        EditorFileManager.RemoveDataFile(m_activeColorSchemeFileName);
        EditorFileManager.WriteJSONDataFile(serializedData, m_activeColorSchemeFileName);
        Debug.Log("Active Color Scheme Configuration " + m_selectedColorSchemeType + " saved!");
    }
        public static void MapTexturesToMaterials()
        {
            // TODO: enable searching all materials and textures in the project
            var materials = EditorFileManager.LoadAssetsAtPath <Material>(materialsPath);
            var textures  = EditorFileManager.LoadAssetsAtPath <Texture>(texturesPath);

            foreach (var material in materials)
            {
                links.ForEach(link => TryMapTexture(material, textures, link.textureKeyword, link.texturePropertyName));
                // TODO: if cannot find a normal map with string matching, compare the type?
            }
        }
    private static void SaveColorSchemes()
    {
        Dictionary <string, object> colorSchemes = new Dictionary <string, object>();

        foreach (EEditorColorSchemes colorSchemeType in Enum.GetValues(typeof(EEditorColorSchemes)))
        {
            EditorColorScheme colorScheme = GetColorScheme(colorSchemeType);
            colorSchemes.Add("ColorScheme-" + colorSchemeType.ToString(), colorScheme.Serialize());
        }
        string serializedData = MiniJSON.Json.Serialize(colorSchemes);

        EditorFileManager.RemoveDataFile(m_colorSchemeFileName);
        EditorFileManager.WriteJSONDataFile(serializedData, m_colorSchemeFileName);
    }
    private static void LoadActiveColorScheme()
    {
        if (!EditorFileManager.DataFileExist(m_activeColorSchemeFileName))
        {
            return;
        }
        string data = EditorFileManager.ReadDataFile(m_activeColorSchemeFileName);
        Dictionary <string, object> deserializedData = MiniJSON.Json.Deserialize(data) as Dictionary <string, object>;
        Dictionary <string, object> colorSchemeData  = deserializedData["ActiveColorScheme"] as Dictionary <string, object>;

        m_activeColorScheme       = new EditorColorScheme(colorSchemeData);
        m_selectedColorSchemeType = m_activeColorScheme.Type;
        Debug.Log("Loaded Color Scheme Configuration: " + m_activeColorScheme);
        m_colorSchemeConfigurationLoaded = true;
    }