public void ShowNodeMenu(Vector2 position, FilterAttribute filter = null, Action <Node> onAddNode = null, bool flowNodes = true) { var valueMenuPos = GetMenuPosition(); if (filter == null) { filter = new FilterAttribute(); //filter.CanSelectType = true; //filter.HideTypes.Add(typeof(void)); } else { filter = new FilterAttribute(filter); } filter.DisplayInstanceOnStatic = true; filter.MaxMethodParam = int.MaxValue; filter.Public = true; filter.Instance = true; if (flowNodes) { filter.VoidType = true; } ItemSelector w = ItemSelector.ShowWindow(editorData.selectedGroup ?? editorData.selectedRoot as UnityEngine.Object ?? editorData.graph, new MemberData(editorData.selectedGroup ?? editorData.selectedRoot as UnityEngine.Object ?? editorData.graph, MemberData.TargetType.SelfTarget), filter, delegate(MemberData value) { NodeEditorUtility.AddNewNode <MultipurposeNode>(editorData, null, null, position, delegate(MultipurposeNode n) { if (n.target == null) { n.target = new MultipurposeMember(); } n.target.target = value; MemberDataUtility.UpdateMultipurposeMember(n.target); if (onAddNode != null) { onAddNode(n); } Refresh(); }); }).ChangePosition(valueMenuPos); w.displayNoneOption = false; w.displayCustomVariable = false; if (filter.SetMember) { return; //Return on set member is true. } List <ItemSelector.CustomItem> customItems = new List <ItemSelector.CustomItem>(); foreach (NodeMenu menuItem in NodeEditorUtility.FindNodeMenu()) { if (filter.OnlyGetType && menuItem.type != typeof(Type)) { continue; } bool isFlowNode = !menuItem.type.IsSubclassOf(typeof(ValueNode)); if (editorData.selectedRoot && menuItem.HideOnFlow || !flowNodes && isFlowNode) { continue; } if (isFlowNode && filter.SetMember || !filter.IsValidTarget(MemberData.TargetType.FlowNode)) { continue; } if (!isFlowNode && !filter.IsValidTarget(MemberData.TargetType.ValueNode)) { continue; } if (editorData.selectedGroup && (menuItem.HideOnGroup)) { continue; } if (menuItem.HideOnStateMachine && !editorData.selectedRoot && !editorData.selectedGroup) { continue; } if (menuItem.returnType != null && menuItem.returnType != typeof(object) && !filter.IsValidType(menuItem.returnType)) { continue; } if (menuItem.IsCoroutine && !editorData.supportCoroutine) { continue; } customItems.Add(new ItemSelector.CustomItem(menuItem.name, delegate() { NodeEditorUtility.AddNewNode <Node>(editorData, menuItem.name.Split(' ')[0], menuItem.type, position, onAddNode); Refresh(); }, menuItem.category.Replace("/", ".")) { icon = isFlowNode ? uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)) : null, tooltip = new GUIContent(menuItem.tooltip), }); } #region Flow if (flowNodes && !filter.SetMember && filter.IsValidType(typeof(void))) { if (!(!editorData.selectedRoot && !editorData.selectedGroup)) { customItems.Add(new ItemSelector.CustomItem("Continue", delegate() { NodeEditorUtility.AddNewNode <NodeJumpStatement>( editorData, "Continue", position, delegate(NodeJumpStatement n) { n.statementType = JumpStatementType.Continue; }); Refresh(); }, "JumpStatement") { icon = uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)), }); customItems.Add(new ItemSelector.CustomItem("Break", delegate() { NodeEditorUtility.AddNewNode <NodeJumpStatement>( editorData, "Break", position, delegate(NodeJumpStatement n) { n.statementType = JumpStatementType.Break; }); Refresh(); }, "JumpStatement") { icon = uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)), }); } if (editorData.selectedRoot) { customItems.Add(new ItemSelector.CustomItem("Return", delegate() { NodeEditorUtility.AddNewNode <NodeReturn>( editorData, "Return", position, delegate(NodeReturn n) { }); Refresh(); }, "Return") { icon = uNodeEditorUtility.GetTypeIcon(typeof(TypeIcons.FlowIcon)), }); } } #endregion if (filter.IsValidTarget(MemberData.TargetType.ValueNode)) { if (filter.IsValidType(typeof(Type))) { customItems.Add(new ItemSelector.CustomItem("typeof()", delegate() { var win = TypeSelectorWindow.ShowWindow(Vector2.zero, new FilterAttribute() { OnlyGetType = true, DisplayRuntimeType = false }, delegate(MemberData[] types) { NodeEditorUtility.AddNewNode <MultipurposeNode>( editorData, position, delegate(MultipurposeNode n) { if (n.target == null) { n.target = new MultipurposeMember(); } n.target.target = types[0]; if (onAddNode != null) { onAddNode(n); } Refresh(); }); }); win.targetObject = editorData.selectedGroup ?? editorData.selectedRoot as UnityEngine.Object ?? editorData.graph; win.ChangePosition(valueMenuPos); }, "Data")); } var nodeMenuItems = NodeEditorUtility.FindCreateNodeCommands(); foreach (var n in nodeMenuItems) { n.graph = this; n.filter = filter; if (!n.IsValid()) { continue; } customItems.Add(new ItemSelector.CustomItem(n.name, () => { var createdNode = n.Setup(position); if (onAddNode != null) { onAddNode(createdNode); } }, n.category) { icon = uNodeEditorUtility.GetTypeIcon(n.icon), }); } } w.customItems = customItems; }
protected override IList <TreeViewItem> BuildRows(TreeViewItem root) { var rows = GetRows() ?? new List <TreeViewItem>(); rows.Clear(); bool isSearching = !string.IsNullOrEmpty(searchString); { //Node var item = new TreeViewItem(uNodeEditorUtility.GetUIDFromString("[NODES]"), -1, "Nodes"); if (isSearching || IsExpanded(item.id)) { //Init menu var menus = NodeEditorUtility.FindNodeMenu(); var createNodeMenus = NodeEditorUtility.FindCreateNodeCommands(); //Init data List <NodeTreeData> datas = new List <NodeTreeData>(); foreach (var m in menus) { datas.Add(new NodeTreeData() { name = m.name, menu = m, category = m.category, }); } foreach (var m in createNodeMenus) { datas.Add(new NodeTreeData() { name = m.name, command = m, category = m.category, }); } //Sorting datas.Sort((x, y) => { int index = string.Compare(x.category, y.category); if (index == 0) { return(string.Compare(x.name, y.name)); } return(index); }); //Finalize AddNodes(datas, item, rows); } else { item.children = CreateChildListForCollapsedParent(); } root.AddChild(item); rows.Insert(0, item); } foreach (var pair in typeList) { int prevCount = rows.Count; var item = new NamespaceTreeView(pair.Key, uNodeEditorUtility.GetUIDFromString("[NS]" + pair.Key), -1); namespaceTrees[pair.Key] = item; if (pair.Value.Count > 0) { if (isSearching || IsExpanded(item.id)) { AddChildrenType(pair.Value, item, rows); } else { item.children = CreateChildListForCollapsedParent(); } } if (!isSearching || item.children != null && item.children.Count > 0 || IsMatchSearch(item, searchString)) { root.AddChild(item); rows.Insert(rows.Count - (rows.Count - prevCount), item); } } SetupDepthsFromParentsAndChildren(root); return(rows); }