# InsertAction

> Adds an item that executes an action in the dropdown menu.

## Definition

* **Type:** Method
* **Namespace:** [UnityEngine.UIElements](/engine/6000.0/script-reference/unityengine/uielements.md)
* **Assembly:** UnityEngine.UIElementsModule

## InsertAction(int, string, Action\<DropdownMenuAction>, Func\<DropdownMenuAction, Status>, Object)

Adds an item that executes an action in the dropdown menu.

```csharp
public void InsertAction(int atIndex, string actionName, Action<DropdownMenuAction> action, Func<DropdownMenuAction, DropdownMenuAction.Status> actionStatusCallback, object userData = null)
```

### Parameters

**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): The index to insert the item at.**** (\[string]\(https\://learn.microsoft.com/dotnet/api/system.string)): The name of the item. This name is displayed in the dropdown menu.**** (\[Action\<DropdownMenuAction>]\(https\://learn.microsoft.com/dotnet/api/system.action)): Callback to execute when the user selects this item in the menu.**** (\[Func\<DropdownMenuAction, Status>]\(https\://learn.microsoft.com/dotnet/api/system.func-1)): The callback to execute to determine the status of the item.**** (\[Object]\(https\://learn.microsoft.com/dotnet/api/system.object)): The object to store in the **userData** property of the [DropdownMenuAction](/engine/6000.0/script-reference/unityengine/uielements/dropdownmenuaction.md) item. This object is accessible through the action callback.

### Remarks

The item is added to the end of the specified index in the list.

### Examples

```csharp
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ContextMenuWindow : EditorWindow
{
    [MenuItem("My/Context Menu Window")]
    static void ShowMe() => GetWindow<ContextMenuWindow>();

    void CreateGUI()
    {
        var contextMenuContainer = new VisualElement();
        contextMenuContainer.style.flexGrow = 1;
        contextMenuContainer.AddManipulator(new ContextualMenuManipulator(e =>
        {
            e.menu.AppendAction("My Action 1", a => Debug.Log("My Action 1 Works"), DropdownMenuAction.Status.Normal);  // 0
            e.menu.AppendAction("My Action 3", a => Debug.Log("My Action 3 Works"), DropdownMenuAction.Status.Normal);  // 1
            e.menu.AppendAction("Submenu/My Action 4", a => Debug.Log("My Action 4 Works"), DropdownMenuAction.Status.Normal);  // 2
            e.menu.AppendAction("Submenu/My Action 6", a => Debug.Log("My Action 6 Works"), DropdownMenuAction.Status.Normal);  // 3

            // Indices from 1 to 3 are shifted up index by 1. In result 'My Action 2' now has an index of 2.
            e.menu.InsertAction(1, "My Action 2", a => Debug.Log("My Action 2 Works"), DropdownMenuAction.AlwaysEnabled);

            // If we want to insert an between submenu items, we have to use shifted indices
            e.menu.InsertAction(4, "Submenu/My Action 5", a => Debug.Log("My Action 5 Works"), DropdownMenuAction.AlwaysDisabled);
        }));

        rootVisualElement.Add(contextMenuContainer);
    }
}
```

## InsertAction(int, string, Action\<DropdownMenuAction>, Status)

Adds an item that executes an action in the dropdown menu.

```csharp
public void InsertAction(int atIndex, string actionName, Action<DropdownMenuAction> action, DropdownMenuAction.Status status = Status.Normal)
```

### Parameters

**** (\[int]\(https\://learn.microsoft.com/dotnet/api/system.int32)): The index to insert the item at.**** (\[string]\(https\://learn.microsoft.com/dotnet/api/system.string)): The name of the item. This name is displayed in the dropdown menu.**** (\[Action\<DropdownMenuAction>]\(https\://learn.microsoft.com/dotnet/api/system.action)): The callback to execute when the user selects this item in the menu.**** (\[Status]\(/engine/6000.0/script-reference/unityengine/uielements/dropdownmenuaction/status)): The status of the item.

### Remarks

The item is added to the end of the specified index in the list.

### Examples

```csharp
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ContextMenuWindow : EditorWindow
{
    [MenuItem("My/Context Menu Window")]
    static void ShowMe() => GetWindow<ContextMenuWindow>();

    void CreateGUI()
    {
        var contextMenuContainer = new VisualElement();
        contextMenuContainer.style.flexGrow = 1;
        contextMenuContainer.AddManipulator(new ContextualMenuManipulator(e =>
        {
            e.menu.AppendAction("My Action 1", a => Debug.Log("My Action 1 Works"), DropdownMenuAction.Status.Normal);  // 0
            e.menu.AppendAction("My Action 3", a => Debug.Log("My Action 3 Works"), DropdownMenuAction.Status.Normal);  // 1
            e.menu.AppendAction("Submenu/My Action 4", a => Debug.Log("My Action 4 Works"), DropdownMenuAction.Status.Normal);  // 2
            e.menu.AppendAction("Submenu/My Action 6", a => Debug.Log("My Action 6 Works"), DropdownMenuAction.Status.Normal);  // 3

            // Indices from 1 to 3 are shifted up index by 1. In result 'My Action 2' now has an index of 2.
            e.menu.InsertAction(1, "My Action 2", a => Debug.Log("My Action 2 Works"), DropdownMenuAction.Status.Normal);

            // If we want to insert an between submenu items, we have to use shifted indices
            e.menu.InsertAction(4, "Submenu/My Action 5", a => Debug.Log("My Action 5 Works"), DropdownMenuAction.Status.Disabled);
        }));

        rootVisualElement.Add(contextMenuContainer);
    }
}
```
