Командные события
События команды отправляются для того, чтобы позволить Unity Editor передавать действия меню высшего уровня Редактору UI, а также их эквивалентные комбинации клавиш.
Доступны следующие команды:
CopyCutPasteDeleteDeselectAllSoftDeleteDuplicateFrameSelectedFrameSelectedWithLockSelectAllFindFocusProjectWindow
В следующей таблице описаны события команды и фазы их распространения:
| Мероприятие | Описание | Просыпается | Пузырьки вверх | Аннулируемые |
|---|---|---|---|---|
| ValidateCommandEvent | Редактор отправляет это событие при определении того, обрабатывает ли элемент панели данную команду. | Да | Да | Да |
| ExecuteCommandEvent | Редактор отправляет это событие, когда элемент на панели выполняет команду. | Да | Да | Да |
Уникальные свойства
target: Элемент с фокусом клавиатуры. Это значение null, если ни один элемент не имеет фокуса.
commandName: Команда для проверки или выполнения.
Список событий
ValidateCommandEvent
Событие ValidateCommandEvent спрашивает у EditorWindow, может ли оно выполнить команду. Например, Редактор может включить или отключить пункт меню на основе результатов события validation command.
Чтобы проверить, может ли Редактор выполнять команду:
- Зарегистрировать обратный вызов для
ValidateCommandEvent. - Проверьте свойство
commandNameсобытия. - Вызов метода
Event.StopPropogation()на событии, если команда может быть выполнена.
ExecuteCommandEvent
Событие ExecuteCommandEvent просит Окно Редактора выполнить команду.
Даже если это событие следует за событием проверки, рекомендуется убедиться, что действие возможно сначала, независимо от любой предыдущей проверки.
Чтобы ответить на команду:
- Зарегистрировать обратный вызов для
ExecuteCommandEvent. - Проверьте свойство
commandNameсобытия. - Вызов метода
Event.StopPropogation()на событии до выполнения фактической логики команды, чтобы Редактор знал, что комментарий был выполнен.
Пример
В следующем примере используются события команды для поддержки копирования и вставки в пользовательском окне редактора. В примере отображается список фруктов в пользовательском окне редактора. Пользователи могут использовать сочетания клавиш для копирования и вставки любых фруктов.
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class CopyPasteExample : EditorWindow
{
[MenuItem("Window/UI Toolkit Examples/CopyPasteExample")]
public static void Show()
{
GetWindow<CopyPasteExample>();
}
readonly List<string> fruits = new ()
{
"Banana",
"Apple",
"Lime",
"Orange"
};
ListView m_ListView;
public void CreateGUI()
{
Func<VisualElement> makeItem = () => new Label();
Action<VisualElement, int> bindItem = (e, i) => (e as Label).text = fruits[i];
m_ListView = new ListView();
m_ListView.makeItem = makeItem;
m_ListView.bindItem = bindItem;
m_ListView.itemsSource = fruits;
m_ListView.selectionType = SelectionType.Single;
m_ListView.RegisterCallback<ValidateCommandEvent>(OnValidateCommand);
m_ListView.RegisterCallback<ExecuteCommandEvent>(OnExecuteCommand);
rootVisualElement.Add(m_ListView);
}
void OnExecuteCommand(ExecuteCommandEvent evt)
{
if (evt.commandName == "Copy" && m_ListView.selectedIndices.Count() > 0)
{
EditorGUIUtility.systemCopyBuffer = fruits[m_ListView.selectedIndex];
evt.StopPropagation();
}
else if (evt.commandName == "Paste" && !string.IsNullOrEmpty(EditorGUIUtility.systemCopyBuffer))
{
fruits.Add(EditorGUIUtility.systemCopyBuffer);
m_ListView.RefreshItems();
evt.StopPropagation();
}
}
void OnValidateCommand(ValidateCommandEvent evt)
{
if (evt.commandName == "Copy" && m_ListView.selectedIndices.Count() > 0)
{
evt.StopPropagation();
}
else if (evt.commandName == "Paste" && !string.IsNullOrEmpty(EditorGUIUtility.systemCopyBuffer))
{
evt.StopPropagation();
}
}
}