# GraphChanges

> The set of changes to a graph reported to Graph.OnGraphChanged in a single change event.

## Definition

* **Type:** Class
* **Namespace:** [Unity.GraphToolkit.Editor](/engine/6000.7/script-reference/unity/graphtoolkit/editor.md)
* **Assembly:** UnityEditor

```csharp
public class GraphChanges
```

## Remarks

Access this through [GraphLogger.GraphChanges](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphlogger/graphchanges.md) inside [Graph.OnGraphChanged](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graph/ongraphchanged.md). Inspect [GraphChanges.ChangedNodes](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changednodes.md), [GraphChanges.ChangedVariables](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changedvariables.md), [GraphChanges.ChangedConstantNodes](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changedconstantnodes.md), and [GraphChanges.ChangedSubgraphNodes](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changedsubgraphnodes.md) to react to what was added or modified. Each entry's `ChangeKinds` property is a set of [ChangeKind](/engine/6000.7/script-reference/unity/graphtoolkit/editor/changekind.md) bit-flags describing the categories of change that apply. Removed elements are not reported, except for removed ports, which appear in [ChangedNode.ChangedPorts](/engine/6000.7/script-reference/unity/graphtoolkit/editor/changednode/changedports.md) on their owning node.

## Examples

```csharp
public override void OnGraphChanged(GraphLogger graphLogger)
{
    GraphChanges changes = graphLogger.GraphChanges;

    foreach (ChangedNode changedNode in changes.ChangedNodes)
    {
        if ((changedNode.ChangeKinds & ChangeKind.Added) != 0)
            Debug.Log($"Node added: {changedNode.Node}");

        if ((changedNode.ChangeKinds & ChangeKind.Data) != 0)
            Debug.Log($"Node data changed: {changedNode.Node}");

        if ((changedNode.ChangeKinds & ChangeKind.Layout) != 0)
            Debug.Log($"Node moved or resized: {changedNode.Node}");

        // Node is either a user-defined Node subclass or an IVariableNode.
        switch (changedNode.Node)
        {
            case IVariableNode variableNode: /* variable reference */ break;
            case Node userNode:              /* user-defined node */  break;
        }

        // When ChangeKind.PortChanged is set, inspect ChangedPorts for details.
        foreach (ChangedPort changedPort in changedNode.ChangedPorts)
        {
            if ((changedPort.ChangeKinds & ChangeKind.Removed) != 0)
                Debug.Log($"  Port removed: {changedPort.ID}");
            else
                Debug.Log($"  Port changed: {changedPort.Port?.Name} ({changedPort.ChangeKinds})");
        }
    }

    foreach (ChangedVariable changedVariable in changes.ChangedVariables)
        Debug.Log($"Variable changed: {changedVariable.Variable.Name} ({changedVariable.ChangeKinds})");

    foreach (ChangedConstantNode changedConstant in changes.ChangedConstantNodes)
        Debug.Log($"Constant node changed: {changedConstant.ConstantNode} ({changedConstant.ChangeKinds})");

    foreach (ChangedSubgraphNode changedSubgraph in changes.ChangedSubgraphNodes)
        Debug.Log($"Subgraph node changed: {changedSubgraph.SubgraphNode} ({changedSubgraph.ChangeKinds})");
}
```

## Properties

| Property                                                                                                               | Description                                                          |
| ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
| [ChangedConstantNodes](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changedconstantnodes.md) | The constant nodes that were added or modified in this change event. |
| [ChangedNodes](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changednodes.md)                 | The nodes that were added or modified in this change event.          |
| [ChangedSubgraphNodes](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changedsubgraphnodes.md) | The subgraph nodes that were added or modified in this change event. |
| [ChangedVariables](/engine/6000.7/script-reference/unity/graphtoolkit/editor/graphchanges/changedvariables.md)         | The variables that were added or modified in this change event.      |
