Unity 6.3
0 онлайн 106 гостей 3 в системе
Вход
UI системы Шаг 181 из 317

Командные события

События команды отправляются для того, чтобы позволить Unity Editor передавать действия меню высшего уровня Редактору UI, а также их эквивалентные комбинации клавиш.

Доступны следующие команды:

  • Copy
  • Cut
  • Paste
  • Delete
  • DeselectAll
  • SoftDelete
  • Duplicate
  • FrameSelected
  • FrameSelectedWithLock
  • SelectAll
  • Find
  • FocusProjectWindow

В следующей таблице описаны события команды и фазы их распространения:

Мероприятие Описание Просыпается Пузырьки вверх Аннулируемые
ValidateCommandEvent Редактор отправляет это событие при определении того, обрабатывает ли элемент панели данную команду. Да Да Да
ExecuteCommandEvent Редактор отправляет это событие, когда элемент на панели выполняет команду. Да Да Да

Уникальные свойства

target: Элемент с фокусом клавиатуры. Это значение null, если ни один элемент не имеет фокуса.

commandName: Команда для проверки или выполнения.

Список событий

ValidateCommandEvent

Событие ValidateCommandEvent спрашивает у EditorWindow, может ли оно выполнить команду. Например, Редактор может включить или отключить пункт меню на основе результатов события validation command.

Чтобы проверить, может ли Редактор выполнять команду:

  1. Зарегистрировать обратный вызов для ValidateCommandEvent.
  2. Проверьте свойство commandName события.
  3. Вызов метода Event.StopPropogation() на событии, если команда может быть выполнена.

ExecuteCommandEvent

Событие ExecuteCommandEvent просит Окно Редактора выполнить команду.

Даже если это событие следует за событием проверки, рекомендуется убедиться, что действие возможно сначала, независимо от любой предыдущей проверки.

Чтобы ответить на команду:

  1. Зарегистрировать обратный вызов для ExecuteCommandEvent.
  2. Проверьте свойство commandName события.
  3. Вызов метода 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();
        }
    }
}