// ReSharper disable once InconsistentNaming
    public static void InspectorPrefix(object __instance)
    {
        var editor = __instance as AssetImporterEditor;

        if (editor == null)
        {
            return;
        }

        var importer = editor.target as AssetImporter;

        if (importer == null)
        {
            return;
        }

        if (importer.assetPath.Contains("ImportProfiles"))
        {
            return;
        }

        List <string> assetImportersPaths =
            ImportProfiles.GetProfiles(importer.GetType()).Select(x => x.Importer.assetPath).ToList();

        GUILayout.Label(importer.userData);

        assetImportersPaths.Add("Custom");
        List <string> list = assetImportersPaths.Select(Path.GetFileNameWithoutExtension).ToList();

        string[] names = list.ToArray();

        SerializedProperty userDataProperty = editor.serializedObject.FindProperty("m_UserData");

        GUILayout.BeginHorizontal();
        int index = assetImportersPaths.IndexOf(userDataProperty.stringValue);

        if (index == -1)
        {
            index = 0;
        }

        string userDataValue;

        EditorGUI.BeginChangeCheck();
        userDataValue =
            assetImportersPaths[
                EditorGUILayout.Popup("Selected Profile", index,
                                      names)];
        if (EditorGUI.EndChangeCheck())
        {
            userDataProperty.stringValue = userDataValue;
        }

        GUILayout.EndHorizontal();

        if (userDataProperty.stringValue != "Custom")
        {
            GUI.enabled = false;
        }
    }
    void OnEnable()
    {
        treeView = new ProfileTreeView(treeViewState);
        UpdateProfiles();
        treeView.OnSelectionChanged += OnSelectionChanged;
        treeView.OnRemoveProfile    += OnRemoveProfile;
        areaStyle        = new GUIStyle();
        areaStyle.margin = new RectOffset(Margin, Margin, Margin, Margin);

        foreach (var profileType in Enum.GetValues(typeof(ProfileTypes)))
        {
            createMenu.AddItem(new GUIContent(profileType.ToString()), false, () =>
            {
                var profile = ImportProfiles.CreateProfile((ProfileTypes)profileType, profileType.ToString());
                UpdateProfiles();
                treeView.SelectItem(profile);
                OnSelectionChanged(profile);
            });
        }

        if (treeViewState.selectedIDs.Any())
        {
            OnSelectionChanged(treeView.GetItemById(treeViewState.selectedIDs.First()));
        }
    }
 private void OnRemoveProfile(ProfileData profile)
 {
     if (!EditorUtility.DisplayDialog($"Delete profile {profile.Name}",
                                      "Are you sure you wish to delete the profile?", "Yes", "No"))
     {
         return;
     }
     ImportProfiles.RemoveProfile(profile);
     UpdateProfiles();
 }
    private void ApplyProfile()
    {
        if (assetPath.Contains("ImportProfiles"))
        {
            return;
        }

        if (string.IsNullOrWhiteSpace(assetImporter.userData))
        {
            ProfileData defaultProfile = ImportProfiles.GetProfiles(assetImporter.GetType()).FirstOrDefault(x => Regex.IsMatch(assetImporter.assetPath, WildCardToRegular(x.WildcardQuery)));
            if (defaultProfile != null)
            {
                assetImporter.userData = defaultProfile.AssetPath;
            }
            else
            {
                return;
            }
        }

        if (assetImporter.userData == "Custom")
        {
            return;
        }

        AssetImporter importer = AssetImporter.GetAtPath(assetImporter.userData);

        if (importer == null)
        {
            return;
        }

        var so = new SerializedObject(importer);

        var targetSO = new SerializedObject(assetImporter);

        SerializedProperty property = so.GetIterator();

        property.Next(true);
        do
        {
            if (ignoredProperties.Contains(property.name))
            {
                continue;
            }

            targetSO.CopyFromSerializedProperty(property);
        } while (property.Next(false));

        targetSO.ApplyModifiedPropertiesWithoutUndo();
    }
 private void UpdateProfiles()
 {
     treeView.SetProfiles(ImportProfiles.GetProfiles());
 }