### Первый способ
```csharp
valueLabel.AddManipulator(new ContextualMenuManipulator(evt =>
{
evt.menu.AppendAction("Action 1", action => Debug.Log("Action 1 executed"));
evt.menu.AppendAction("Action 2", action => Debug.Log("Action 2 executed"));
}));
```
### Второй способ
Создаем свой класс, который будет наследоваться от `ContextualMenuManipulator`
```csharp
public class FieldContextMenuManipulator : ContextualMenuManipulator
{
private readonly string fieldKey; // просто поле для примера
private readonly CustomEditorWindow editorWindow; // Ссылка на экземпляр окна редактора
// Конструктор
public FieldContextMenuManipulator(CustomEditorWindow editorWindow, string fieldKey)
: base(evt => PopulateMenu(evt, editorWindow, fieldKey)) // Устанавливает обработчик для создания контекстного меню
{
this.fieldKey = fieldKey;
this.editorWindow = editorWindow;
}
// Статический метод, который создает и заполняет контекстное меню
// Должен быть статическим, так как метод используется в статическом контексте
private static void PopulateMenu(ContextualMenuPopulateEvent evt, CustomEditorWindow editorWindow, string fieldKey)
{
// Добавление пункта меню "Action 1", который вызывает метод MyActionMethod1 с переданным ключом поля
evt.menu.AppendAction("Action 1", action => editorWindow.MyActionMethod1(fieldKey));
// Добавление пункта меню "Action 2", который вызывает метод MyActionMethod2 с переданным ключом поля
evt.menu.AppendAction("Action 2", action => editorWindow.MyActionMethod2(fieldKey));
}
}
```
Эти два метода нужно добавить в `CustomEditorWindow` (наследник `EditorWindow`)
```csharp
public void MyActionMethod1(string fieldKey)
{
Debug.Log(
quot;Action 1 executed for field: {fieldKey}");
// Ваш код для выполнения действия 1
}
public void MyActionMethod2(string fieldKey)
{
Debug.Log(quot;Action 2 executed for field: {fieldKey}");
// Ваш код для выполнения действия 2
}
```
Добавляем в `label` контекстное меню.
```csharp
label.AddManipulator(new FieldContextMenuManipulator(this, fieldKey));
```