- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEditor.Experimental.GraphView;
- using UnityEditor.UIElements;
- using UnityEngine.UIElements;
- using UnityEditor;
- public class StateNode : Node
- {
- public ObjectField entry;
- public List<ObjectField> actions;
- public ObjectField exit;
- public State state;
- public TextField titleInputField;
- public Port outputPort;
- public Port inputPort;
- private VisualElement actionsContainer;
- public StateNode(State state)
- {
- actions = new List<ObjectField>();
- this.state = state;
- }
- public virtual void Initialize(Vector2 pos)
- {
- SetPosition(new Rect(pos, Vector2.zero));
- }
- public virtual void Draw()
- {
- titleInputField = new TextField();
- titleInputField.value = "State";
- titleContainer.Insert(0,titleInputField);
- Button addActionButton = new Button(InsertAction);
- addActionButton.text = "Add Action";
- mainContainer.Insert(1,addActionButton);
- Add(entry);
- entry = new ObjectField();
- entry.objectType = typeof(Action);
- entry.label = "Entry Action";
- entry.value = state.entryAction;
- extensionContainer.Add(entry);
- actionsContainer = new VisualElement();
- if (state.actions != null)
- {
- foreach (Action act in state.actions)
- {
- ObjectField newObjectField = new ObjectField("Actions");
- newObjectField.objectType = typeof(Action);
- newObjectField.value = act;
- actions.Add(newObjectField);
- }
- }
- foreach (ObjectField action in actions)
- {
- action.objectType = typeof(Action);
- action.label = "Actions";
- actionsContainer.Add(action);
- }
- exit = new ObjectField();
- exit.objectType = typeof(Action);
- exit.label = "Exit Action";
- exit.value = state.exitAction;
- extensionContainer.Add(actionsContainer);
- extensionContainer.Add(exit);
- outputPort = InstantiatePort(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(bool));
- outputPort.portName = "Output";
- inputPort = InstantiatePort(Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, typeof(bool));
- inputPort.portName = "Input";
-
- outputContainer.Add(outputPort);
- inputContainer.Add(inputPort);
- RefreshExpandedState();
-
- }
- public VisualElement AddAction(out ObjectField objectField)
- {
- VisualElement ve = new VisualElement();
- ObjectField of = new ObjectField();
- of.objectType = typeof(Action);
- of.label = "Actions";
- ve.Add(of);
- Button removeButton = new Button(() =>
- {
- actionsContainer.Remove(ve);
- });
- removeButton.text = "Remove";
- ve.Add(removeButton);
- objectField = of;
- return ve;
- }
- public void InsertAction()
- {
- ObjectField newObjectField;
- VisualElement ve = AddAction(out newObjectField);
- actions.Add(newObjectField);
- actionsContainer.Add(ve);
-
- }
- /* private VisualElement CreateEditorFromNodeData()
- {
- SerializedObject soEditor = new SerializedObject(state);
- var container = new VisualElement();
- var it = soEditor.GetIterator();
- if (!it.NextVisible(true))
- return container;
- //Descends through serialized property children & allows us to edit them.
- do
- {
- var propertyField = new PropertyField(it.Copy())
- { name = "PropertyField:" + it.propertyPath };
- //Bind the property so we can edit the values.
- propertyField.Bind(soEditor);
- //This ignores the label name field, it's ugly.
- if (it.propertyPath == "m_Script" && soEditor.targetObject != null)
- {
- propertyField.SetEnabled(false);
- propertyField.visible = false;
- }
- container.Add(propertyField);
- }
- while (it.NextVisible(false));
- return container;
- }*/
- }