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(); } }
/// <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); } }
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)); } }
public override void InitializeContainer(string fileName) { container = new TreeContainer(new XmlLocator()); if (fileName == null) { container.Initialize(); } else { container.Initialize(fileName); } }
public override void InitializeContainer(string targetNamespace) { container = new TreeContainer(new ReflectionLocator()); if (targetNamespace == null) { container.Initialize(); } else { container.Initialize(targetNamespace); } }
/// <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); }
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); } }
/// <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); }
/// <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; }
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); }
/// <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); }
/// <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(); }
/// <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); }
/// <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); }