public void Merge(ResourceParams other)
 {
     for (int i = 0; i < other.Count; ++i)
     {
         var key = other.GetKey(i);
         var val = other.GetValue(i);
         AddOrUpdate(key, val);
     }
 }
    public override void OnInspectorGUI()
    {
        bool saveDB = false;

        toDel.Clear();
        ModelImporterParamsDB db = target as ModelImporterParamsDB;
        int count = db.Data.Count;

        if (count == 0)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Label(EMPTY);
            GUILayout.EndHorizontal();
        }
        else
        {
            for (int i = 0; i < count; ++i)
            {
                string         guid  = db.Data.GetResourceKey(i);
                string         path  = AssetDatabase.GUIDToAssetPath(guid);
                ResourceParams param = db.Data.GetResourceParams(i);
                bool           valid = !string.IsNullOrEmpty(path) && param != null;
                if (!valid)
                {
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(VALID);
                    if (GUILayout.Button(DELETE))
                    {
                        toDel.Add(guid);
                        saveDB = true;
                    }
                    GUILayout.EndHorizontal();
                }
                else
                {
                    if (foldout.Count < i + 1)
                    {
                        foldout.Add(false);
                    }
                    var pathArr = path.Split('/');
                    if (EditorGUILayout.Foldout(foldout[i], i + ":" + pathArr[pathArr.Length - 1].ToString()))
                    {
                        foldout[i] = true;
                        for (int ix = 0; ix < param.Count; ++ix)
                        {
                            var key = param.GetKey(ix);
                            var val = param.GetValue(ix);
                            GUILayout.BeginHorizontal();
                            GUILayout.Label(string.Format("{0}:{1}", key, val));
                            GUILayout.EndHorizontal();
                        }

                        GUILayout.BeginHorizontal();
                        if (GUILayout.Button(SELECT))
                        {
                            var asset = AssetDatabase.LoadMainAssetAtPath(path);
                            if (asset == null)
                            {
                                if (EditorUtility.DisplayDialog(NOT_FOUND_TITLE, string.Format(NOT_FOUND_CONTEXT, path), OK, NO))
                                {
                                    toDel.Add(guid);
                                    saveDB = true;
                                }
                            }
                            else
                            {
                                Selection.activeObject = asset;
                            }
                        }
                        if (GUILayout.Button(UPDATERES))
                        {
                            var importer = AssetImporter.GetAtPath(path) as ModelImporter;
                            if (null != importer)
                            {
                                ModelImporterParamsDB.UpdateModel(path, importer, false);
                                AssetDatabase.ImportAsset(path);
                            }
                        }
                        if (GUILayout.Button(UPDATEDB))
                        {
                            var importer = AssetImporter.GetAtPath(path) as ModelImporter;
                            if (null != importer)
                            {
                                ModelImporterParamsDB.UpdateDB(path, importer);
                                saveDB = true;
                            }
                        }
                        if (GUILayout.Button(DELETE))
                        {
                            toDel.Add(guid);
                            saveDB = true;
                        }
                        GUILayout.EndHorizontal();
                    }
                    else
                    {
                        foldout[i] = false;
                    }
                }
            }
            GUILayout.BeginHorizontal();
            if (GUILayout.Button(ModelImporterParamsDB.SYNC_ALL))
            {
                ResourceEditUtility.ResetResourceParamsCalculator();
                ModelImporterParamsDB.UpdateAllModels();
            }
            GUILayout.EndHorizontal();
        }
        GUILayout.BeginHorizontal();
        objToAdd = EditorGUILayout.ObjectField(objToAdd, typeof(UnityEngine.GameObject), false);
        if (GUILayout.Button(ADD) && null != objToAdd)
        {
            var path     = AssetDatabase.GetAssetPath(objToAdd);
            var importer = AssetImporter.GetAtPath(path) as ModelImporter;
            if (null != importer)
            {
                ModelImporterParamsDB.UpdateDB(path, importer);
                saveDB = true;
            }
        }
        GUILayout.EndHorizontal();

        foreach (var del in toDel)
        {
            db.Data.Remove(del);
        }

        if (saveDB)
        {
            EditorUtility.SetDirty(target);
            AssetDatabase.SaveAssets();
        }

        GUILayout.BeginHorizontal();
        if (GUILayout.Button(ModelImporterParamsDB.IMPORT))
        {
            string file = EditorUtility.OpenFilePanel(ModelImporterParamsDB.IMPORT_DIALOG, string.Empty, "json");
            if (!string.IsNullOrEmpty(file))
            {
                ModelImporterParamsDB.Import(file);
            }
        }
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        if (GUILayout.Button(ModelImporterParamsDB.EXPORT))
        {
            string file = EditorUtility.SaveFilePanel(ModelImporterParamsDB.EXPORT_DIALOG, string.Empty, "modeldata", "json");
            if (!string.IsNullOrEmpty(file))
            {
                ModelImporterParamsDB.Export(file);
            }
        }
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        if (GUILayout.Button(ModelImporterParamsDB.FETCH))
        {
            ModelImporterParamsDB.Fetch();
        }
        GUILayout.EndHorizontal();
        GUILayout.BeginHorizontal();
        if (GUILayout.Button(ModelImporterParamsDB.COMMIT))
        {
            ModelImporterParamsDB.Commit();
        }
        GUILayout.EndHorizontal();
    }