public ArtistNetworkNodeViewModel(
            ArtistViewModel viewModel, 
            AtlasHierarchy hierarchy, 
            IHierarchyNode hierarchyNode,
            IPlaylistView playlist)
            : base(viewModel.Name)
        {
            ArtistViewModel = viewModel;

            Debug.Assert(hierarchyNode is ArtistHierarchyNode);
            _hierarchyNode = (ArtistHierarchyNode) hierarchyNode; 
            _hierarchy = hierarchy;
            _playlist = playlist;

            _numTracks = GetArtistTrackCount();

            IsHighlighted = SpotifyCacheService.IsArtistFollowed(ArtistViewModel.Artist);
        }
    public static void BuildOnePaddingData(string name, List <Vector4> paddings, List <bool> trims, bool isPoly, AtlasHierarchy hierarchy)
    {
        bool   needCreate  = false;
        string paddingPath = PathDef.UI_ASSETS_PATH + "/atlas_tp_padding.asset";

        PaddingData data = AssetDatabase.LoadAssetAtPath <PaddingData>(paddingPath);

        if (data == null)
        {
            data       = ScriptableObject.CreateInstance <PaddingData>();
            needCreate = true;
        }

        data.RemoveAtlasItem(name);

        List <string> spriteNames = hierarchy.GetSpriteDataName();

        data.AddAtlasEx(name, isPoly, spriteNames, paddings, trims);
        CheckAtlas(data.atlas);
        if (needCreate)
        {
            AssetDatabase.CreateAsset(data, paddingPath);
        }
        else
        {
            EditorUtility.SetDirty(data);
            AssetDatabase.SaveAssets();
        }
        AssetDatabase.Refresh();
    }
    static void CreateSpritePrefab(string name, string path, string pathTP)
    {
        string pathPrefab   = string.Format("{0}/{1}.prefab", path, name);
        string pathColor    = string.Format("{0}/{1}_c.png", path, name);
        string pathMaterial = string.Format("{0}/{1}_mat.mat", path, name);

        if (!File.Exists(pathColor))
        {
            Debug.LogError(string.Format("File No Found: {0}", pathColor));
            return;
        }

        if (!File.Exists(pathMaterial))
        {
            Debug.LogError(string.Format("File No Found: {0}", pathMaterial));
            return;
        }

        string pathTxt = string.Format("{0}/{1}.txt", pathTP, name);
        string text    = FileHelper.ReadTextFromFile(pathTxt);
        List <TexturePacker.PackedFrame> frames = TexturePacker.ProcessToFrames(text);

        SpriteMetaData meta;
        Dictionary <string, SpriteMetaData> metas = new Dictionary <string, SpriteMetaData>();

        TextureImporter importer = AssetImporter.GetAtPath(pathColor) as TextureImporter;

        for (int i = 0; i < importer.spritesheet.Length; ++i)
        {
            meta = importer.spritesheet[i];
            if (metas.ContainsKey(meta.name))
            {
                Debug.LogError("key is already exist the dictionary:  " + meta.name);
            }
            metas.Add(meta.name, meta);
        }
        //AtlasData data = new AtlasData();
        //data.material = AssetDatabase.LoadAssetAtPath<Material>(pathMaterial);
        //data.sprites = new List<AtlasData.SpriteData>();
        Material mat = AssetDatabase.LoadAssetAtPath <Material>(pathMaterial);

        List <Sprite>  sprites = new List <Sprite>();
        List <Vector4> rts     = new List <Vector4>();
        List <bool>    trims   = new List <bool>();

        Sprite sprite = null;

        UnityEngine.Object[] objects = AssetDatabase.LoadAllAssetRepresentationsAtPath(pathColor);
        for (int i = 0; i < objects.Length; ++i)
        {
            sprite = objects[i] as Sprite;
            if (sprite == null)
            {
                continue;
            }

            bool trim = false;
            if (metas.TryGetValue(sprite.name, out meta))
            {
                trim = meta.alignment == 9;
            }

            Vector4 rt = Vector4.zero;
            foreach (TexturePacker.PackedFrame frame in frames)
            {
                string spritename = frame.name.Replace(".png", "");
                if (string.Equals(spritename, sprite.name))
                {
                    float left   = frame.spriteSourceSize.x;
                    float top    = frame.spriteSourceSize.y;
                    float right  = frame.sourceSize.x - frame.spriteSourceSize.x - frame.spriteSourceSize.width;
                    float bottom = frame.sourceSize.y - frame.spriteSourceSize.y - frame.spriteSourceSize.height;

                    rt.x = left;
                    rt.y = bottom;
                    rt.z = right;
                    rt.w = top;
                    break;
                }
            }
            sprites.Add(sprite);
            rts.Add(rt);
            trims.Add(trim);
            //data.sprites.Add(new AtlasData.SpriteData(sprite, rt, trim));
        }

        GameObject prefab = null;
        GameObject go     = null;

        if (File.Exists(pathPrefab))
        {
            prefab = AssetDatabase.LoadAssetAtPath <GameObject>(pathPrefab);
            go     = GameObject.Instantiate(prefab);
        }
        else
        {
            go = new GameObject();
        }

        go.name = name;

        AtlasHierarchy hierarchy = go.GetComponent <AtlasHierarchy>() ?? go.AddComponent <AtlasHierarchy>();

        hierarchy.SetAtlasData(sprites, mat);
        //hierarchy.atlas = data;

        if (prefab != null)
        {
            PrefabUtility.ReplacePrefab(go, prefab);
        }
        else
        {
            PrefabUtility.CreatePrefab(pathPrefab, go);
        }
        GameObject.DestroyImmediate(go);

        if (path.Contains(PathDef.UI_PATH + "/atlas_tp"))
        {
            BuildOnePaddingData(name, rts, trims, false, hierarchy);
        }
    }
 public NewReleaseHierarchyNode(NewReleaseItem newReleaseItem, AtlasHierarchy hierarchy)
     : base(hierarchy, null, 0)
 {
     NewReleaseItem = newReleaseItem;
 }
 public ArtistHierarchyNode(ArtistViewModel artistViewModel, AtlasHierarchy hierarchy, IHierarchyNode parent, int level)
     : base(hierarchy, parent, level)
 {
     ArtistViewModel = artistViewModel;
 }