//Returns single node context menu static GenericMenu GetNodeMenu_Single(Node node) { var menu = new GenericMenu(); if ( node.graph.primeNode != node && node.allowAsPrime ) { menu.AddItem(new GUIContent("Set Start"), false, () => { node.graph.primeNode = node; }); } if ( node is IGraphAssignable ) { menu.AddItem(new GUIContent("Edit Nested (Double Click)"), false, () => { node.graph.currentChildGraph = ( node as IGraphAssignable ).nestedGraph; }); } menu.AddItem(new GUIContent("Duplicate (CTRL+D)"), false, () => { GraphEditorUtility.activeElement = node.Duplicate(node.graph); }); menu.AddItem(new GUIContent("Copy Node"), false, () => { CopyBuffer.Set<Node[]>(new Node[] { node }); }); if ( node.inConnections.Count > 0 ) { menu.AddItem(new GUIContent(node.isActive ? "Disable" : "Enable"), false, () => { node.SetActive(!node.isActive); }); } if ( node.graph.isTree && node.outConnections.Count > 0 ) { menu.AddItem(new GUIContent(node.collapsed ? "Expand Children" : "Collapse Children"), false, () => { node.collapsed = !node.collapsed; }); } if ( node is ITaskAssignable ) { var assignable = node as ITaskAssignable; if ( assignable.task != null ) { menu.AddItem(new GUIContent("Copy Assigned Task"), false, () => { CopyBuffer.Set<Task>(assignable.task); }); } else { menu.AddDisabledItem(new GUIContent("Copy Assigned Task")); } if ( CopyBuffer.Has<Task>() ) { menu.AddItem(new GUIContent("Paste Assigned Task"), false, () => { if ( assignable.task == CopyBuffer.Peek<Task>() ) { return; } if ( assignable.task != null ) { if ( !EditorUtility.DisplayDialog("Paste Task", string.Format("Node already has a Task assigned '{0}'. Replace assigned task with pasted task '{1}'?", assignable.task.name, CopyBuffer.Peek<Task>().name), "YES", "NO") ) { return; } } try { assignable.task = CopyBuffer.Get<Task>().Duplicate(node.graph); } catch { ParadoxNotion.Services.Logger.LogWarning("Can't paste Task here. Incombatible Types", "Editor", node); } }); } else { menu.AddDisabledItem(new GUIContent("Paste Assigned Task")); } } //extra items with override menu = node.OnContextMenu(menu); if ( menu != null ) { //extra items with attribute foreach ( var _m in node.GetType().RTGetMethods() ) { var m = _m; var att = m.RTGetAttribute<ContextMenu>(true); if ( att != null ) { menu.AddItem(new GUIContent(att.menuItem), false, () => { m.Invoke(node, null); }); } } menu.AddSeparator("/"); menu.AddItem(new GUIContent("Delete (DEL)"), false, () => { node.graph.RemoveNode(node); }); } return menu; }