private void CreatePackage()
        {
            if (string.IsNullOrEmpty(G.Module.ModuleStateConfig.Json.CurrentUserConfigName))
            {
                G.Module.DisplayDialog("请先选择配置或创建一个空配置");
                return;
            }
            G.Module.IsDirty = true;
            PackageTreeItem package = new PackageTreeItem()
            {
                id           = --packageID,
                depth        = 0,
                icon         = compressionIcon,
                displayName  = "New Package",
                isPackage    = true,
                packageColor = UnityEngine.Random.ColorHSV(0, 1, 0.5f, 1f, 1, 1)
            };

            package.package = package; //这个packageItem所属的package是自己
            rootItem.AddChild(package);
            packageCount++;
            BeginRename(package);
            BuildRows(rootItem);
            FrameItem(package.id);
            Packages.Add(package);
        }
 protected override void RenameEnded(RenameEndedArgs args)
 {
     if (args.acceptedRename)
     {
         args.newName = args.newName.Trim();
         if (args.newName == "")
         {
             args.newName = args.originalName;
         }
         char[] invalidChars      = Path.GetInvalidFileNameChars();
         int    invalidCharsIndex = args.newName.IndexOfAny(invalidChars);
         if (invalidCharsIndex >= 0)
         {
             G.Module.DisplayDialog("新包名:" + args.newName + " 包含非法字符!");
             return;
         }
         string newName = args.newName;
         int    i       = 0;
         while (!CheckName(newName, args.itemID))
         {
             newName = args.newName + " " + ++i;
         }
         if (i > 0)
         {
             G.Module.DisplayDialog("包名:" + args.newName + " 已存在! 自动改为:\n" + newName);
         }
         PackageTreeItem item = FindItem(args.itemID, rootItem) as PackageTreeItem;
         item.displayName = newName;
         G.Module.IsDirty = true;
     }
     UpdateAllFileName();
 }
 private void RecursiveDeleteItem(PackageTreeItem packageItem)
 {
     while (packageItem.hasChildren)
     {
         RecursiveDeleteItem((PackageTreeItem)packageItem.children[0]);
     }
     if (packageItem.bundleItem != null)
     {
         packageItem.bundleItem.packageItems.Remove(packageItem);
     }
     if (packageItem.isPackage)
     {
         packageCount--;
         Packages.Remove(packageItem); //仅用于处理单独存放包的packages
     }
     else if (packageItem.bundleItem.isFolder)
     {
         folderCount--;
     }
     else
     {
         bundleCount--;
     }
     packageItem.parent.children.Remove(packageItem);
 }
        private void FindOrCreateBundleItemByBundleName(PackageTreeItem parent, string bundleName, string relativePath)
        {
            if (parent.hasChildren)
            {
                foreach (PackageTreeItem item in parent.children)
                {
                    if (item.bundleItem.displayName == bundleName)
                    {
                        return;
                    }
                }
            }
            var newBundle = new PackageTreeItem()
            {
                lost       = true,
                id         = ++bundleID,
                package    = parent.package,
                bundleItem = new BundleTreeItem()
                {
                    icon         = G.g.bundleTree.bundleIcon,
                    displayName  = bundleName,
                    relativePath = relativePath
                }
            };

            parent.AddChild(newBundle);
        }
        private PackageTreeItem FindOrCreateFolderItemByFolderName(PackageTreeItem parent, string folderName, string relativePath)
        {
            if (parent.hasChildren)
            {
                foreach (PackageTreeItem item in parent.children)
                {
                    if (item.bundleItem.isFolder && item.bundleItem.displayName == folderName)
                    {
                        return(item);
                    }
                }
            }
            PackageTreeItem folderItem = new PackageTreeItem()
            {
                lost       = true,
                id         = --folderID,
                package    = parent.package,
                bundleItem = new BundleTreeItem()
                {
                    displayName  = folderName,
                    icon         = G.g.bundleTree.folderIcon,
                    isFolder     = true,
                    relativePath = relativePath
                }
            };

            parent.AddChild(folderItem);
            return(folderItem);
        }
 private void BuildPackageTree_lostItems(Configs.UserConfig.JsonClass.Package package, PackageTreeItem p)
 {
     //遍历bundles数组添加所有丢失的bundle
     foreach (string bundlePath in package.Bundles)
     {
         string[]        folderNames  = bundlePath.Split('/'); //路径字符串中必须全部为/ 不能有\
         PackageTreeItem parent       = p;
         string          relativePath = "";
         int             i;
         for (i = 0; i < folderNames.Length - 1; i++)
         {
             relativePath += folderNames[i];
             parent        = FindOrCreateFolderItemByFolderName(parent, folderNames[i], relativePath);
             relativePath += "/";
         }
         string bundleName = Path.GetFileNameWithoutExtension(folderNames[i]);
         relativePath += bundleName;
         FindOrCreateBundleItemByBundleName(parent, bundleName, relativePath);
     }
     //遍历所有空文件夹数组添加丢失的空文件夹
     foreach (string folderPath in package.EmptyFolders)
     {
         string[]        folderNames  = folderPath.Split('/');
         PackageTreeItem parent       = p;
         string          relativePath = "";
         int             i;
         for (i = 0; i < folderNames.Length; i++)
         {
             relativePath += folderNames[i];
             parent        = FindOrCreateFolderItemByFolderName(parent, folderNames[i], relativePath);
             relativePath += "/";
         }
     }
 }
 private void RecursiveCheckItem(PackageTreeItem packageItem)
 {
     if (packageItem.hasChildren)
     {
         foreach (PackageTreeItem item in packageItem.children)
         {
             RecursiveCheckItem(item);
         }
     }
     else
     {
         if (packageItem.isPackage)
         {
             emptyItems.Add(packageItem);
         }
         else if (packageItem.lost)
         {
             wrongItems.Add(packageItem);
         }
         else if (packageItem.bundleItem.isFolder)
         {
             emptyItems.Add(packageItem);
         }
         else if (!packageItem.bundleItem.verify)
         {
             wrongItems.Add(packageItem);
         }
     }
 }
 private void BuildTreeFromMap(TreeViewItem root)
 {
     foreach (var package in G.Module.UserConfig.Json.Packages)
     {
         Color color = Color.black;
         ColorUtility.TryParseHtmlString("#" + package.Color, out color);
         var p = new PackageTreeItem()
         {
             id                 = --packageID,
             depth              = 0,
             displayName        = package.PackageName,
             packageColor       = color,
             isPackage          = true,
             icon               = compressionIcon,
             necessery          = package.Necessery,
             deploymentLocation = package.DeploymentLocation,
             copyToStreaming    = package.CopyToStreaming
         };
         p.package = p;
         BuildPackageTreeFromBundleTree(package, p);
         BuildPackageTree_lostItems(package, p);
         root.AddChild(p);
         Packages.Add(p);
     }
     UpdateAllFileName();
 }
        private void RecursiveConnectWithBundleItem(PackageTreeItem packageItem, Dictionary <string, BundleTreeItem> bundleDic, Dictionary <string, BundleTreeItem> folderDic)
        {
            Dictionary <string, BundleTreeItem> dic = packageItem.bundleItem.isFolder ? folderDic : bundleDic;

            if (dic.ContainsKey(packageItem.bundleItem.relativePath))
            {
                packageItem.lost       = false;
                packageItem.bundleItem = dic[packageItem.bundleItem.relativePath];
                packageItem.bundleItem.packageItems.Add(packageItem);
            }
            else
            {
                packageItem.lost       = true;
                packageItem.bundleItem = new BundleTreeItem()
                {
                    relativePath = packageItem.bundleItem.relativePath,
                    displayName  = packageItem.bundleItem.displayName,
                    isFolder     = packageItem.bundleItem.isFolder,
                    icon         = packageItem.bundleItem.icon,
                };
            }
            if (packageItem.hasChildren)
            {
                foreach (PackageTreeItem child in packageItem.children)
                {
                    RecursiveConnectWithBundleItem(child, bundleDic, folderDic);
                }
            }
        }
        private void AddBundlesToPackage(PackageTreeItem packageItem, BundleTreeItem item)
        {
            var p = RecursiveAddParents(item, packageItem);

            if (item.isFolder && item.hasChildren)
            {
                RecursiveAddChildren(item, p, packageItem);
            }
        }
        public void AddBundlesToPackage(PackageTreeItem packageItem, List <TreeViewItem> bundleItems)
        {
            G.Module.IsDirty = true;
            foreach (BundleTreeItem item in bundleItems)
            {
                AddBundlesToPackage(packageItem, item);
            }

            SetupDepthsFromParentsAndChildren(packageItem);
            BuildRows(rootItem);
        }
        private void Locate(PackageTreeItem item)
        {
            var ids = new int[] { item.bundleItem.id };

            G.g.bundleTree.SetSelection(ids);
            foreach (var id in ids)
            {
                G.g.bundleTree.FrameItem(id);
            }
            G.g.bundleTree.SetFocus();
        }
 void RecursiveAddChildren(BundleTreeItem bundleItemParent, PackageTreeItem packageParent, PackageTreeItem packageItem)
 {
     foreach (BundleTreeItem item in bundleItemParent.children)
     {
         var p = FindOrCreatePackageItem(item, packageParent, packageItem);
         if (item.isFolder && item.hasChildren)
         {
             RecursiveAddChildren(item, p, packageItem);
         }
     }
 }
 /// <summary>
 /// 递归添加父节点
 /// </summary>
 /// <param name="bundleItem">要添加的bundle</param>
 /// <param name="packageItem">在此package里添加</param>
 /// <returns></returns>
 PackageTreeItem RecursiveAddParents(BundleTreeItem bundleItem, PackageTreeItem packageItem)
 {
     if (bundleItem.parent.depth < 0)
     {
         return(FindOrCreatePackageItem(bundleItem, packageItem, packageItem));//在packageItem下找到或创建一个以bundleItem为内容的packageItem
     }
     else
     {
         var parent = RecursiveAddParents((BundleTreeItem)bundleItem.parent, packageItem);
         return(FindOrCreatePackageItem(bundleItem, parent, packageItem));
     }
 }
        protected override void DoubleClickedItem(int id)
        {
            PackageTreeItem item = FindItem(id, rootItem) as PackageTreeItem;

            if (item.isPackage || item.hasChildren)
            {
                SetExpanded(id, !IsExpanded(id));
            }
            else
            {
                Locate(item);
            }
        }
        protected override TreeViewItem BuildRoot()
        {
            Packages.Clear();
            PackageTreeItem root = new PackageTreeItem()
            {
                id          = 0,
                depth       = -1,
                displayName = "Root",
            };

            BuildTreeFromMap(root);
            SetupDepthsFromParentsAndChildren(root);
            return(root);
        }
 private void DeletePackageItem(IList <int> list)
 {
     G.Module.IsDirty = true;
     foreach (var id in list)
     {
         PackageTreeItem item = (PackageTreeItem)FindItem(id, rootItem);
         if (item != null)
         {
             PackageTreeItem parent = (PackageTreeItem)item.parent;
             RecursiveDeleteItem(item);
             if (!item.lost)
             {
                 RecursiveUpdateParentComplete(parent);
             }
         }
     }
     BuildRows(rootItem);
 }
        /// <summary>
        /// 从任意一个packageItem节点的第一层children中找到包含bundleItem内容的packageItem,若没有则创建一个
        /// </summary>
        /// <param name="bundleItem">要找的内容</param>
        /// <param name="parent">在该parent节点的第一层子节点中查找</param>
        /// <param name="packageItem">要添加到bundleItem中的包信息</param>
        /// <returns></returns>
        private PackageTreeItem FindOrCreatePackageItem(BundleTreeItem bundleItem, PackageTreeItem parent, PackageTreeItem packageItem)
        {
            PackageTreeItem child = null;

            if (parent.hasChildren)
            {
                foreach (PackageTreeItem c in parent.children)
                {
                    if (c.bundleItem == bundleItem)
                    {
                        child = c;
                        break;
                    }
                }
            }
            if (child == null)
            {
                child = new PackageTreeItem()
                {
                    bundleItem = bundleItem,
                    id         = bundleItem.isFolder ? --folderID : ++bundleID,
                    package    = packageItem,
                    complete   = bundleItem.hasChildren ? false : true
                };
                if (!child.bundleItem.packageItems.Exists(x => x.package == packageItem))
                {
                    child.bundleItem.packageItems.Add(child);
                }
                if (child.bundleItem.isFolder)
                {
                    folderCount++;
                }
                else
                {
                    bundleCount++;
                }

                parent.AddChild(child);

                RecursiveUpdateParentComplete(parent);
            }
            return(child);
        }
 private void RecursiveAddItem(PackageTreeItem packageItem, Configs.UserConfig.JsonClass.Package package)
 {
     if (packageItem.hasChildren)
     {
         foreach (PackageTreeItem item in packageItem.children)
         {
             RecursiveAddItem(item, package);
         }
     }
     else
     {
         if (!packageItem.bundleItem.isFolder)
         {
             package.Bundles.Add(packageItem.bundleItem.relativePath);
         }
         else
         {
             package.EmptyFolders.Add(packageItem.bundleItem.relativePath);
         }
     }
 }
        private void RecursiveUpdateParentComplete(PackageTreeItem parent)
        {
            if (parent.isPackage || parent == rootItem)
            {
                return;
            }
            if (!parent.hasChildren && !parent.bundleItem.hasChildren)
            {
                parent.complete = true;
                return;
            }
            int count = 0;

            foreach (PackageTreeItem item in parent.children)
            {
                if (!item.lost)
                {
                    count++;
                }
            }
            if (count == parent.bundleItem.children.Count)
            {
                parent.complete = true;
                foreach (PackageTreeItem item in parent.children)
                {
                    if (!item.lost && item.complete == false)
                    {
                        parent.complete = false;
                        break;
                    }
                }
            }
            else
            {
                parent.complete = false;
            }
            RecursiveUpdateParentComplete((PackageTreeItem)parent.parent);
        }
 private void BuildPackageTreeFromBundleTree(Configs.UserConfig.JsonClass.Package package, PackageTreeItem p)
 {
     foreach (string bundlePath in package.Bundles)
     {
         if (G.g.bundleTree.bundleDic.ContainsKey(bundlePath))
         {
             RecursiveAddParents(G.g.bundleTree.bundleDic[bundlePath], p);
         }
     }
     foreach (string emptyFolderPath in package.EmptyFolders)
     {
         if (G.g.bundleTree.folderDic.ContainsKey(emptyFolderPath))
         {
             RecursiveAddParents(G.g.bundleTree.folderDic[emptyFolderPath], p);
         }
     }
 }
        private void CellGUI(Rect rect, PackageTreeItem item, ColumnEnum column, ref RowGUIArgs args)
        {
            CenterRectUsingSingleLineHeight(ref rect);
            switch (column)
            {
            case ColumnEnum.Name:
                //args.rowRect = rect;
                float space = 5 + foldoutWidth + depthIndentWidth * item.depth;
                GUI.DrawTexture(new Rect(rect.x + space, rect.y, rect.height, rect.height), item.isPackage ? item.icon : item.bundleItem.icon, ScaleMode.ScaleToFit);
                GUI.Label(new Rect(rect.x + space + rect.height, rect.y, rect.width - space - rect.height, rect.height),
                          item.isPackage ? item.displayName : item.bundleItem.displayName,
                          item.lost ? labelErrorStyle : (item.isPackage ? EditorStyles.label : item.bundleItem.style));
                break;

            case ColumnEnum.Connection:
                Color color = EditorGUI.ColorField(new Rect(rect.x /* + Packages.IndexOf(item.package) * (rect.height + 4)*/,
                                                            rect.y, rect.height, rect.height), GUIContent.none, item.package.packageColor, false, false, false, colorPickerHDRConfig);
                if (color != item.package.packageColor)
                {
                    item.package.packageColor = color;
                }
                break;

            case ColumnEnum.FileName:
                if (item.isPackage)
                {
                    GUI.Label(rect, item.fileName);
                }
                break;

            case ColumnEnum.Necessery:
                if (item.isPackage && G.Module.UserConfig.Json.PackageMode == "Addon")
                {
                    int index     = G.NecesseryEnum.IndexOf(item.necessery);
                    int index_new = EditorGUI.Popup(rect, index, G.NecesseryEnum, inDropDownStyle);
                    if (index_new != index)
                    {
                        item.necessery   = G.NecesseryEnum[index_new];
                        G.Module.IsDirty = true;
                    }
                }
                break;

            case ColumnEnum.DeploymentLocation:
                if (item.isPackage && G.Module.UserConfig.Json.PackageMode == "Addon")
                {
                    int index     = G.DeploymentLocationEnum.IndexOf(item.deploymentLocation);
                    int index_new = EditorGUI.Popup(rect, index, G.DeploymentLocationEnum, inDropDownStyle);
                    if (index_new != index)
                    {
                        item.deploymentLocation = G.DeploymentLocationEnum[index_new];
                        G.Module.IsDirty        = true;
                    }
                }
                break;

            case ColumnEnum.CopyToStreaming:
                if (item.isPackage && G.Module.UserConfig.Json.PackageMode == "Addon")
                {
                    Rect rect_new = new Rect(rect.x + rect.width / 2 - 8, rect.y, 16, rect.height);
                    bool selected = EditorGUI.Toggle(rect_new, item.copyToStreaming, inToggleStyle);
                    if (selected != item.copyToStreaming)
                    {
                        item.copyToStreaming = selected;
                        G.Module.IsDirty     = true;
                    }
                }
                break;

            default:
                break;
            }
        }