Пример #1
0
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();

        TreeContainer container = target as TreeContainer;

        Undo.RecordObject(container, "Created Tree Container");

        EditorGUI.BeginChangeCheck();

        TreeNode root = null;

        if (GUILayout.Button("Create"))
        {
            root = new RootNode(new ChildNode(), new ChildNode());
        }

        GUILayout.Label(container.Tree?.ToString());

        if (EditorGUI.EndChangeCheck())
        {
            Undo.RecordObject(container, "Created Tree");

            if (root != null)
            {
                container.Tree = root;
            }

            PrefabUtility.RecordPrefabInstancePropertyModifications(container);

            EditorUtility.SetDirty(target);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
    }
Пример #2
0
        /// <summary>
        /// 递归生成语法树,节点的名字从0开始编号,显示的内容不是这些数字
        /// </summary>
        /// <param name="TN"></param>
        /// <param name="FatherNode"></param>
        private void BuildingTree(TreeNode TN, TreeContainer.TreeNode CurrentNode, TreeContainer.TreeNode FatherNode)
        {
            TreeContainer.TreeNode temp, tempFatherNode;
            //生成所有的孩子节点
            for (int i = 0; i < 4; ++i) {
                if (TN.Child[i] == null) {
                    continue;
                }
                temp = CreaterTreeNode(TN.Child[i]);
                temp = Tree.AddNode(temp, CurrentNode);
                tempFatherNode = CurrentNode;
                BuildingTree(TN.Child[i], temp, tempFatherNode);
            }
            //生成兄弟节点
            TreeNode tempTN = TN;
            //开始用while,错了,改成if。
            if (tempTN.Sibling != null)
            {
                tempTN = tempTN.Sibling;

                temp = CreaterTreeNode(tempTN);
                temp = Tree.AddNode(temp, FatherNode);
                BuildingTree(tempTN, temp, FatherNode);
            }
        }
Пример #3
0
 internal void UpdatePBT()
 {
     TreeContainer.Clear();
     if (RootTask != null)
     {
         TreeContainer.Add(new PBTTaskTreeControl(glGui, this, null, RootTask));
     }
     else
     {
         TreeContainer.Add(new PBTTaskBrowserForm(glGui, this, task => { RootTask = task; UpdatePBT(); }, true, false));
     }
 }
Пример #4
0
        public override void InitializeContainer(string fileName)
        {
            container = new TreeContainer(new XmlLocator());

            if (fileName == null)
            {
                container.Initialize();
            }
            else
            {
                container.Initialize(fileName);
            }
        }
Пример #5
0
        public override void InitializeContainer(string targetNamespace)
        {
            container = new TreeContainer(new ReflectionLocator());

            if (targetNamespace == null)
            {
                container.Initialize();
            }
            else
            {
                container.Initialize(targetNamespace);
            }
        }
Пример #6
0
        /// <summary>
        /// Render out the correct markup for the tree
        /// </summary>
        /// <remarks>
        /// Since we're inheriting from a UserControl, we need to render out the markup manually
        /// </remarks>
        /// <param name="writer"></param>
        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            //You'll notice that we're replacing the 'serviceUrl' parameter with our own custom web service!

            writer.Write(@"
<script type=""text/javascript"">
jQuery(document).ready(function() {
    var ctxMenu = " + GetJSONContextMenu() + @";	
    var app = """ + App + @""";
    var showContext = " + ShowContextMenu.ToString().ToLower() + @";
    var isDialog = " + IsDialog.ToString().ToLower() + @";
    var dialogMode = """ + DialogMode.ToString() + @""";
    var treeType = """ + TreeType + @""";
    var functionToCall = """ + FunctionToCall + @""";
    var nodeKey = """ + NodeKey + @""";
	
    //create the javascript tree
    jQuery(""#" + ClientID + @""").UmbracoTree({
        doNotInit: " + ManualInitialization.ToString().ToLower() + @",
        jsonFullMenu: ctxMenu,
        appActions: UmbClientMgr.appActions(),
        deletingText: '" + umbraco.ui.GetText("deleting") + @"',
        app: app,
        showContext: showContext,
        isDialog: isDialog,
        dialogMode: dialogMode,
        treeType: treeType,
        functionToCall : functionToCall,
        nodeKey : nodeKey,
        treeMode: """ + Mode.ToString().ToLower() + @""",
        dataUrl: """ + IOHelper.ResolveUrl(SystemDirectories.Umbraco) + @"/webservices/TreeDataService.ashx"",
        serviceUrl: """ + IOHelper.ResolveUrl(SystemDirectories.Umbraco) + @"/controls/Tree/CustomTreeService.asmx/GetInitAppTreeData""});
        
     //add event handler for ajax errors, this will refresh the whole application
    var mainTree = UmbClientMgr.mainTree();
    if (mainTree != null) {
        mainTree.addEventHandler(""ajaxError"", function(e) {
            if (e.msg == ""rebuildTree"") {
	            UmbClientMgr.mainWindow(""umbraco.aspx"");
            }
        });
    }
});	

</script>");

            //render the controls
            TreeContainer.RenderControl(writer);
        }
Пример #7
0
    public static void Remove(string name)
    {
        TreeContainer target = null;

        foreach (TreeContainer tc in Instance.trees)
        {
            if (tc.name == name)
            {
                target = tc;
            }
        }
        if (target != null)
        {
            Instance.trees.Remove(target);
        }
    }
Пример #8
0
    /// <summary>
    /// 新建,黏贴插入操作
    /// </summary>
    /// <param name="index">Index.</param>
    /// <param name="itemName">Item name.</param>
    /// <param name="parentFolder">Parent folder.</param>
    /// <param name="menuList">Menu list.</param>
    private TreeItem InsertItem(int index, string itemName, TreeFolder parentFolder, TreeContainer menuList)
    {
        //实例化文件夹
        GameObject go = GameObject.Instantiate(Resources.Load("Prefabs/TreeItem")) as GameObject;

        go.name = itemName;
        TreeItem item = go.GetComponent <TreeItem>();

        item.MyTreeContainer = menuList;
        item.BeFolder        = false;
        item.Name            = itemName;
        go.transform.SetParent(parentFolder.SubRootRectTransform as Transform);
        item._RectTransform           = go.GetComponent <RectTransform>();
        item._RectTransform.pivot     = new Vector2(0, 1);
        item._RectTransform.anchorMax = new Vector2(0, 1);
        item._RectTransform.anchorMin = new Vector2(0, 1);

        item.ItemNameText.text     = itemName;
        item.ItemNameText.fontSize = UIEnum.FontSize;
        var   textRt = item.ItemNameText.gameObject.GetComponent <RectTransform>();
        float w      = Tools.GetStringW(item.ItemNameText.text, UIEnum.FontSize);

        textRt.sizeDelta = new Vector2(w, UIEnum.ItmeH);

        //重新设置下Folder的边框宽度
        float w1 = UIEnum.ItemImageW + w;

        item._RectTransform.sizeDelta = new Vector2(w1, UIEnum.ItemH);

        item.ParentFolder = parentFolder;

        //这里这句还是要注意点,文件夹和item混合插入应该会出问题,不过目前没这种需求
        float h = (index + 1) * UIEnum.ItemH;

        item._RectTransform.anchoredPosition = new Vector2(UIEnum.FolderBtnW * 2 + 4, -h);
        item.CreateMenu(item);

        parentFolder.ItemList.Insert(index, item);
        parentFolder.RefreshItemNum();
        //新建文件夹后通知上级进行重新排序,比如rootFolder下有10个subFolder,在第二个subFolder下新建,那么后面所有subFolder都要重排
        //这里注意下ui坐标系是左下是0,0所以负值是向下移动
        parentFolder.ParentYOrder(-UIEnum.ItemH, index);

        return(item);
    }
Пример #9
0
    /// <summary>
    /// 生成单个Tab页的GameData
    /// </summary>
    public static void GenerateGameData(string editorType)
    {
        //初始化缓存
        //ioBuffer4GameData = new IoBuffer();

        //获取某个tab的TreeContainer
        TreeContainer _treeContainer = GEditorRoot.GetIns().TreeContainerDic[editorType];
        //获取某个tab的KvContainer
        KVContainer _kvContainer = GEditorRoot.GetIns().KVContainerDic [editorType];

        //得到一个treeContainer下所有的treeItem信息
        TreeItemData[] itemData = _treeContainer.GetAllTreeItemData();

        //确保所有的treeItem数据都被(从sql)拉取到本地
        for (int i = 0; i < itemData.Length; i++)
        {
            string _treeItemID = itemData[i].TreeItemID;
            _kvContainer.CheckAndLoadTreeItemData2Local(_treeItemID);
        }

        //开始过滤并,返回过滤后要存储的二进制数据
        byte[] bs = GEditorConfig.FilterData(editorType, _kvContainer.KVDateDic);

        if (null == bs)
        {
            Debug.Log("未导出 editorType:" + editorType + " 原因数据为null");
            return;
        }
        //Debug.Log("TExportData------->bs.len:"+bs.Length);
        //ioBuffer4GameData.PutString(editorType);//存储tab名
        //ioBuffer4GameData.PutInt(_treeContainer.RootFolder.SubAllItemNums);//存储当前tab下数据总条数

        //递归存储一个treeItem下的所有gdata
        //SaveOneTreeItemData(_treeContainer.RootFolder,editorType);

        //NINFO 对存储到ioBuffer4GameData中的数据进行冗余过滤

        FileHelper.Save(GEditorEnum.EDITOR_GAME_DATA_ROOTURL, editorType + GEditorEnum.EDITOR_GAME_DATA_NAME, bs /*ioBuffer4GameData.ToArray()*/);

        //ioBuffer4GameData.Clear();

        //ioBuffer4GameData = null;
    }
Пример #10
0
    public static TreeFolder Create(string folderName, RectTransform parentRectTrm, TreeContainer menuList)
    {
        //实例化文件夹
        GameObject go = GameObject.Instantiate(Resources.Load("Prefabs/TreeFolder")) as GameObject;

        go.name = folderName;
        TreeFolder folder = go.GetComponent <TreeFolder>();

        folder.MyTreeContainer = menuList;
        folder.BeFolder        = true;
        folder.Name            = folderName;
        go.transform.SetParent(parentRectTrm as Transform);
        folder._RectTransform           = go.GetComponent <RectTransform>();
        folder._RectTransform.pivot     = new Vector2(0, 1);
        folder._RectTransform.anchorMax = new Vector2(0, 1);
        folder._RectTransform.anchorMin = new Vector2(0, 1);

        //设置下文件夹文字及大小
        StringBuilder sb = new StringBuilder();

        sb.Append(folderName);
        sb.Append('(');
        sb.Append(folder.SubItemNums);
        sb.Append(')');
        folder.ItemNameText.text     = sb.ToString();
        folder.ItemNameText.fontSize = UIEnum.FontSize;
        var   textRt = folder.ItemNameText.gameObject.GetComponent <RectTransform>();
        float w      = Tools.GetStringW(folder.ItemNameText.text, UIEnum.FontSize);

        textRt.sizeDelta = new Vector2(w, UIEnum.ItmeH);

        //重新设置下Folder的边框宽度
        float w1 = UIEnum.FolderBtnW + UIEnum.FolderImageW + w;

        folder._RectTransform.sizeDelta = new Vector2(w1, UIEnum.FolderH);

        //设置+-打开关闭文件夹button事件
        folder.FolderBtn.onClick.AddListener(folder.OnButtonClick);



        return(folder);
    }
Пример #11
0
    /// <summary>
    /// 这个方法只有从folder右键创建item时调用
    /// 其他地方用InsertItem
    /// </summary>
    /// <param name="itemName">Item name.</param>
    /// <param name="parentFolder">Parent folder.</param>
    /// <param name="menuList">Menu list.</param>
    public static TreeItem Create(string itemName, TreeFolder parentFolder, TreeContainer treeContainer)
    {
        //添加文件夹时,如果父文件夹没有打开,先打开再添加
        if (!parentFolder.BeFolderOpen)
        {
            parentFolder.BeFolderOpen = true;
        }

        //实例化文件夹
        GameObject go = GameObject.Instantiate(Resources.Load("Prefabs/TreeItem")) as GameObject;

        go.name = itemName;
        TreeItem item = go.GetComponent <TreeItem>();

        item.MyTreeContainer = treeContainer;
        item.BeFolder        = false;
        item.Name            = itemName;
        go.transform.SetParent(parentFolder.SubRootRectTransform as Transform);
        item._RectTransform           = go.GetComponent <RectTransform>();
        item._RectTransform.pivot     = new Vector2(0, 1);
        item._RectTransform.anchorMax = new Vector2(0, 1);
        item._RectTransform.anchorMin = new Vector2(0, 1);

        item.ItemNameText.text     = itemName;
        item.ItemNameText.fontSize = UIEnum.FontSize;
        var   textRt = item.ItemNameText.gameObject.GetComponent <RectTransform>();
        float w      = Tools.GetStringW(item.ItemNameText.text, UIEnum.FontSize);

        textRt.sizeDelta = new Vector2(w, UIEnum.ItmeH);

        //重新设置下Folder的边框宽度
        float w1 = UIEnum.ItemImageW + w;

        item._RectTransform.sizeDelta = new Vector2(w1, UIEnum.ItemH);

        item.ParentFolder = parentFolder;

        //float h = (parentFolder.SubItemNums + 1) * UIEnum.ItemH;
        float h = parentFolder.CurFolderH;

        //float h = parentFolder.CurFolderH;
        item._RectTransform.anchoredPosition = new Vector2(UIEnum.FolderBtnW * 2 + 4, -h);
        item.CreateMenu(item);

        parentFolder.ItemList.Add(item);
        parentFolder.RefreshItemNum();


        //新建文件夹后通知上级进行重新排序,比如rootFolder下有10个subFolder,在第二个subFolder下新建,那么后面所有subFolder都要重排
        //这里注意下ui坐标系是左下是0,0所以负值是向下移动
        parentFolder.ParentYOrder(-UIEnum.ItemH, item.IndexInParentFolder);


        //刷新下MenuList的边框宽,用于刷新MenuList滚动区域,item距离Menulist左边距离+一个图标间隔+4(文字和图标间隔)+w1(文字长度)
        float _w = item.CurItemLeftOffset + UIEnum.ItemImageW + 4 + w1;

        treeContainer.SetTreeW(_w);
        treeContainer.RefreshTreeArea();

        return(item);
    }
Пример #12
0
    /// <summary>
    /// 编辑器初始化,重要流程
    /// </summary>
    private void InitGEditor()
    {
        //创建Tab管理器
        TabContainer = new TabContainer(TabContainer.TabLayoutType.horizontal, TabPanel);
        TabContainer.TabSelectEvent   = OnTabSelect;
        TabContainer.TabDeSelectEvent = OnTabDeSelect;

        //创建Tree管理器
        if (null == TreeContainerDic)
        {
            TreeContainerDic = new Dictionary <string, TreeContainer> ();
        }

        //创建列表管理器
        if (null == KVContainerDic)
        {
            KVContainerDic = new Dictionary <string, KVContainer>();
        }

        //加载tab数据,根据数据创建打开tab
        //检测是否存在tab.config配置文件,如果没有,就使用默认打开项目(GEditorEnum.OPENED_EDITORS)
        string tabCfgPath     = GEditorEnum.EDITOR_DATA_ROOTURL + GEditorEnum.EDITOR_TAB_CONFIG_NAME;
        bool   beTabCfgExists = FileHelper.BeFileExists(tabCfgPath);

        //VLog.I("tabCfgPaht:"+tabCfgPath+" beExis:"+beTabCfgExists);
        string[,] _CurOpenedTabs = null;
        if (beTabCfgExists)
        {
            _CurOpenedTabs = GEditorDataMgr.LoadTabConfig(tabCfgPath);                        //非首次,使用tab.config中记录的数据
        }
        else
        {
            _CurOpenedTabs = GEditorEnum.OPENED_EDITORS;         //首次打开,不存tab.config相关记录,使用默认打开tab页
        }
        for (int i = 0; i < _CurOpenedTabs.GetLength(0); i++)
        {
            //根据数创建tab项
            TabData tabData = new TabData();
            tabData.Name    = _CurOpenedTabs[i, 0];
            tabData.RefName = _CurOpenedTabs[i, 1];
            tabData.Index   = i;

            var tabItem = TabItem.Create(tabData, TabPanel, TabContainer);
            TabContainer.Add(tabItem);

            //根据现有打开的tab,创建对应的tree项
            string        treeCfgPath        = GEditorEnum.EDITOR_DATA_ROOTURL + GEditorEnum.EDITOR_TREE_CONFIG_NAME + tabData.RefName + ".config";
            bool          beTreeConfigExists = FileHelper.BeFileExists(treeCfgPath);
            TreeContainer treeContainer      = new TreeContainer();
            if (beTreeConfigExists)            //treeConfig配表存在,从配表载入TreeContainer
            {
                byte[] bs = GEditorDataMgr.LoadOneTreeConfig(treeCfgPath);
                treeContainer.CreateByData(tabData.RefName, TreePanel, TreePanel, 0, 0, bs);
                TreeContainerDic.Add(tabData.RefName, treeContainer);
            }
            else            //treeConfig配表不存在存在,创建新的根节点
            {
                treeContainer.Create(tabData.RefName, TreePanel, TreePanel, 0, 0);
                TreeContainerDic.Add(tabData.RefName, treeContainer);
            }
            treeContainer.Hide();            //创建完先隐藏,等等具体tab被选中时才显示


            //设置tabitem初始选中状态,这句需要放在TreeContainer被创建之后,
            //因为Beselect一旦被执行,就会执行切换TreeContainer的操作,如果TreeContainer还没被创建,就会出错
            if (i == 0)
            {
                tabItem.BeSelecte = true;
            }
            else
            {
                tabItem.BeSelecte = false;
            }


            //创建KVContainer,打开几个tab创建几个,跟tree类似
            KVContainerDic.Add(tabData.RefName, new KVContainer(KeyValuePanel, KeyPanel, ValuePanel, tabData.RefName));
        }

        //打开数据库,保持长连接
        GEditorDataMgr.ConnectSql();

        //判定是否是首次打开editor,如果是创建sql table,并创建首次打开标示文件app.config
        GEditorDataMgr.CheckSQLTableExist();
    }
        private void OnLoad(object sender, EventArgs e)
        {
            MakeCurrent();
            MouseUp += (s, ev) => { try { MakeCurrent(); } catch (GraphicsContextException) { } }; // workaround for correct context switching (mouseclicks might change the gui directly)
            glGui    = new GLGui(this);

            if (monospaceFont == null)
            {
                monospaceFont = new GLFont(new Font("Lucida Console", 6.5f));
                monospaceFont.Options.Monospacing = GLFontMonospacing.Yes;
            }

            var verticalSplitter = glGui.Add(new GLSplitLayout(glGui)
            {
                Size             = ClientSize,
                SplitterPosition = 0.7f,
                Orientation      = GLSplitterOrientation.Vertical,
                Anchor           = GLAnchorStyles.All
            });

            TreeContainer = verticalSplitter.Add(new PBTTreeContainer(glGui));
            TreeContainer.Add(new PBTTaskTreeControl <DataType>(glGui, Root.Root, true));

            var sidebar = verticalSplitter.Add(new GLFlowLayout(glGui)
            {
                FlowDirection = GLFlowDirection.TopDown
            });
            var sidebarSkin = sidebar.Skin;

            sidebarSkin.BackgroundColor = System.Drawing.Color.FromArgb(48, 48, 48);
            sidebar.Skin = sidebarSkin;

            var extended = sidebar.Add(new GLCheckBox(glGui)
            {
                Text = "extended view", Checked = true, AutoSize = true
            });

            extended.Changed += (s, ev) =>
            {
                MakeCurrent();
                TreeContainer.Clear();
                TreeContainer.Add(new PBTTaskTreeControl <DataType>(glGui, Root.Root, extended.Checked));
            };

            var filter = sidebar.Add(new GLButton(glGui)
            {
                Text = "Impulse Filter", AutoSize = true
            });

            var horizontalSplitter = sidebar.Add(new GLSplitLayout(glGui)
            {
                Size             = new Size(sidebar.InnerWidth, sidebar.InnerHeight - extended.Outer.Bottom),
                SplitterPosition = 0.5f,
                Orientation      = GLSplitterOrientation.Horizontal,
                Anchor           = GLAnchorStyles.All
            });

            dataControl = horizontalSplitter.Add(new GLDataControl(glGui));
            dataControl.SetData(Root.Context.Data);

            var horizontalSplitter2 = horizontalSplitter.Add(new GLSplitLayout(glGui)
            {
                Orientation      = GLSplitterOrientation.Horizontal,
                SplitterPosition = 0.5f
            });

            var impulseLogScroll = horizontalSplitter2.Add(new GLScrollableControl(glGui));

            impulseLog = impulseLogScroll.Add(new GLLabel(glGui)
            {
                Multiline = true, AutoSize = true
            });
            var impulseLogSkin = impulseLog.SkinEnabled;

            impulseLogSkin.Font    = monospaceFont;
            impulseLog.SkinEnabled = impulseLogSkin;

            impulseLogger    = new PBTImpulseLogger <DataType, ImpulseType>(new LabelWriter(impulseLog), Root.Context);
            HandleDestroyed += (s, ev) => impulseLogger.Dispose();
            filter.Click    += (s, ev) => glGui.Add(new PBTImpulseFilterForm <DataType, ImpulseType>(glGui, impulseLogger));

            Overview = horizontalSplitter2.Add(new PBTOverviewControl <DataType>(glGui, TreeContainer));

            Resize += (s, ev) => { MakeCurrent(); GL.Viewport(ClientSize); };
            Paint  += OnRender;
            //Application.Idle += (s, ev) => Invalidate();
            Timer t = new Timer();

            t.Interval = 16;
            t.Tick    += (s, ev) => Invalidate();
            t.Start();
        }
Пример #14
0
    /// <summary>
    /// 创建子文件夹
    /// 不需要加入xy偏移量,因为这个偏移量是固定的
    /// </summary>
    /// <param name="name">Name.</param>
    /// <param name="parentTrm">Parent trm.</param>
    public static TreeFolder CreateSubFolder(string folderName, TreeFolder parentFolder, TreeContainer menuList)
    {
        //添加文件夹时,如果父文件夹没有打开,先打开再添加
        if (!parentFolder.BeFolderOpen)
        {
            parentFolder.BeFolderOpen = true;
        }

        var folder = TreeFolder.Create(folderName, parentFolder.SubRootRectTransform, menuList);

        folder.ParentFolder = parentFolder;
        folder.BeRootFolder = false;

        //这里计算的是相对父folder的位置
        //float h = (parentFolder.SubItemNums + 1) * MenuListFolder.FolderH;
        float h = parentFolder.CurFolderH;

        folder._RectTransform.anchoredPosition = new Vector2(UIEnum.FolderBtnW, -h);
        folder.CreateMenu(folder);
        parentFolder.ItemList.Add(folder);

        //新建文件夹后通知上级进行重新排序,比如rootFolder下有10个subFolder,在第二个subFolder下新建,那么后面所有subFolder都要重排
        //这里注意下ui坐标系是左下是0,0所以负值是向下移动
        parentFolder.ParentYOrder(-UIEnum.FolderH, folder.IndexInParentFolder);


        //刷新下MenuList的边框宽,用于刷新MenuList滚动区域,item距离Menulist左边距离+两个图标间隔+4(文字和图标间隔)+w1(文字长度)
        if (!folder.BeRootFolder)
        {
            var   textRt = folder.ItemNameText.gameObject.GetComponent <RectTransform>();
            float w      = Tools.GetStringW(folder.ItemNameText.text, UIEnum.FontSize);
            float w1     = UIEnum.FolderBtnW + UIEnum.FolderImageW + w;
            float _w     = folder.CurItemLeftOffset + UIEnum.ItemImageW * 2 + 4 + w1;
            menuList.SetTreeW(_w);
            menuList.RefreshTreeArea();
        }

        return(folder);
    }
Пример #15
0
    /// <summary>
    /// 创建根文件夹
    /// </summary>
    /// <returns>The root.</returns>
    /// <param name="name">Name.</param>
    /// <param name="parentTrm">Parent trm.</param>
    /// <param name="offx">Offx.</param>
    /// <param name="offy">Offy.</param>
    public static TreeFolder CreateRootFolder(string rootFolderName, RectTransform parentTrm, TreeContainer menuList, float offx, float offy)
    {
        TreeFolder folder = TreeFolder.Create(rootFolderName, parentTrm, menuList);

        folder.ParentFolder = null;
        folder.BeRootFolder = true;
        //设置PosX,PosY
        folder._RectTransform.anchoredPosition = new Vector2(offx - UIEnum.FolderBtnW, offy);
        //根目录去掉+-号显示
        folder.FolderBtn.gameObject.SetActive(false);
        //创建菜单
        folder.CreateMenu(folder);
        return(folder);
    }