private void CreateNodeCreationMenu() { Assembly assembly = Assembly.GetExecutingAssembly(); foreach (var type in assembly.GetTypes()) { if (type.GetCustomAttribute <NodeAttribute>() != null) { NodeMenuItem menuItem = new NodeMenuItem(type.GetCustomAttribute <NodeAttribute>().Type) { Header = type.GetCustomAttribute <NodeAttribute>().MenuName, }; menuItem.Click += HandleNodeMenu; if (type.IsSubclassOf(typeof(Nodes.ActionNodes.ActionNode))) { actionNodesMenu.Items.Add(menuItem); } else if (type.IsSubclassOf(typeof(Nodes.EventNodes.EventNode))) { eventNodesMenu.Items.Add(menuItem); } else if (type.IsSubclassOf(typeof(Nodes.TargetNodes.TargetNode))) { targetNodesMenu.Items.Add(menuItem); } } } }
/// <summary> /// Shows a node selection menu in the editor at the mouse position with all node which has a connection possibilities with the passed NodeConnector. /// </summary> /// <param name="connector"></param> public void ShowNodeSelectionMenuInNodeEditor(NodeConnector connector) { ClearNodeEditorContexMenu(); Assembly assembly = Assembly.GetExecutingAssembly(); foreach (var type in assembly.GetTypes()) { if (type.GetCustomAttribute <NodeAttribute>() == null || type.GetCustomAttribute <NodeAttribute>().AllowedTypes == null) { continue; } if (connector.CanConnect(type.GetCustomAttribute <NodeAttribute>().Type) && (type.GetCustomAttribute <NodeAttribute>().AllowedTypes.Contains(connector.ParentNodeType) || type.GetCustomAttribute <NodeAttribute>().AllowedTypes.Contains(Node.GetSuperiorType(connector.ParentNodeType)))) { NodeMenuItem menuItem = new NodeMenuItem(type.GetCustomAttribute <NodeAttribute>().Type, connector.ParentNode) { Header = type.GetCustomAttribute <NodeAttribute>().MenuName, }; menuItem.Click += HandleNodeMenu; if (type.Namespace.Contains("AIOwnerNodes")) { selectionMenuOwnerNodes.Items.Add(menuItem); } else if (type.Namespace.Contains("ActionNodes")) { selectionMenuActionNodes.Items.Add(menuItem); } else if (type.Namespace.Contains("EventNodes")) { selectionMenuEventNodes.Items.Add(menuItem); } else if (type.Namespace.Contains("TargetNodes")) { selectionMenuTargetNodes.Items.Add(menuItem); } } } }
/// <summary> /// Shows a node selection menu in the editor at the mouse position which allows to create any node at the mouse position /// </summary> /// <param name="connector"></param> public void ShowNodeSelectionMenuInNodeEditor(Point mousePosition) { ClearNodeEditorContexMenu(); Assembly assembly = Assembly.GetExecutingAssembly(); foreach (var type in assembly.GetTypes()) { if (type.GetCustomAttribute <NodeAttribute>() == null) { continue; } NodeMenuItem menuItem = new NodeMenuItem(type.GetCustomAttribute <NodeAttribute>().Type, mousePosition) { Header = type.GetCustomAttribute <NodeAttribute>().MenuName, }; menuItem.Click += HandleNodeMenu; if (type.Namespace.Contains("AIOwnerNodes")) { selectionMenuOwnerNodes.Items.Add(menuItem); } else if (type.Namespace.Contains("ActionNodes")) { selectionMenuActionNodes.Items.Add(menuItem); } else if (type.Namespace.Contains("EventNodes")) { selectionMenuEventNodes.Items.Add(menuItem); } else if (type.Namespace.Contains("TargetNodes")) { selectionMenuTargetNodes.Items.Add(menuItem); } } }