Version: 2018.4
言語: 日本語
イベントタイプリファレンス
IMGUI のサポート

ビルトインコントロール

UIElements には以下の標準コントロールが組み込まれています。

  • ボタン
  • コンテキストメニュー
  • エディターテキストフィールド
  • ラベル
  • スクロールビュー
  • テキストフィールド
  • トグルボタン

コンテキストメニュー

コンテキストメニューコントロールは、コンテキストに応じて一揃いの選択肢やアクションを表示する標準的なコントロールです。通常、このコンテキストは現在選択されているものですが、コンテキストは何でも構いません。

ここでは、コンテキストメニューを追加する方法を示し、コールバックを説明し、ユーザーの選択に応答する方法を説明します。

ビジュアル要素にコンテキストメニューを加える

コンテキストメニューを表示するには、コンテキストメニューを発生させるイベントのコールバックで ContextualMenuManager.DisplayMenu() を呼び出します。

例えば、マウスの右ボタンを離したときにコンテキストメニューを表示するには、OnMouseUpEvent のコールバックに以下のコードを追加します。

// VisualElement サブクラスで
void OnMouseUpEvent(MouseUpEvent evt)
{
    if (elementPanel == null || elementPanel.contextualMenuManager == null)
        return;

    if (evt.button != MouseButton.RightMouse || evt.modifiers != EventModifiers.None)
        return;

    elementPanel.contextualMenuManager.DisplayMenu(evt, this);
    evt.StopPropagation();
    evt.PreventDefault();
}

上の例では、ContextualMenuManager.DisplayMenu()DisplayMenu() の 2 番目の引数として ContextualMenuPopulateEvent イベントターゲットを送信します。このイベントは、ビジュアルツリーのルートから伝播経路に沿ってビジュアル要素ツリーに伝播されます。ビジュアルツリーのルートからイベントターゲットまで、次に、ビジュアルツリーをルートへと上昇します。伝播経路に沿って、ContextualMenuPopulateEvent イベントのコールバックを持つ要素は、コンテキストメニューの項目を追加、削除、変更することができます。

上の例は、StopPropagation の使い方と PreventDefault() で要素が表示されないようにする方法も示しています。

コンテキストメニューを追加するには、ContextualMenuManipulator をビジュアル要素にアタッチします。このマニピュレーターは、右ボタンの Mouse Up イベントかメニューの Key Up イベントのいずれかの後にコンテキストメニューを表示するコールバックを加えます。ContextualMenuManipulator マニピュレーターは ContextualMenuPopulateEvent に応答するコールバックも追加します。

このインストールされたコールバックはまた、デリゲートを呼び出してコンテキストメニューを生成します。デリゲートは、マニピュレーターをインスタンス化するときに必要です。次のコード例は、これを行う方法を示しています。

void InstallManipulator(VisualElement element)
{
    ContextualMenuManipulator m = new ContextualMenuManipulator(MyDelegate);
    m.target = element;
}

void MyDelegate(ContextualMenuPopulateEvent event)
{
    // event.menu を変更
    event.menu.AppendAction("Properties", DisplayProperties, DropdownMenu.MenuAction.AlwaysEnabled);
}

void DisplayProperties(DropdownMenu.MenuAction menuItem)
{
    // ...
}

ユーザーの選択に応答する

要素が ContextualMenuPopulateEvent を受け取ると、DropdownMenu.InsertAction()DropdownMenu.AppendAction() のいずれかを呼び出すことによって、メニュー項目をコンテキストメニューに加えます。

これらの関数はそれぞれ、パラメーターとして 2 つのコールバックをとります。最初のコールバックは、ユーザーがメニューの項目を選択したときに実行されます。2 番目のコールバックは、メニューを表示する前に実行されます。また、2 番目のコールバックはメニュー項目が有効かどうかをチェックします。

それらのコールバックは両方とも MenuAction をパラメーターとして受け取ります。MenuAction はメニュー項目を表し、以下のような便利なプロパティを持ちます。

  • MenuAction.userData には、AppendAction()InsertAction() によって使用された可能性のあるユーザーデータへの参照が含まれます。
  • MenuAction.eventInfo には、コンテキストメニューの表示をトリガーしたイベントに関する情報が含まれます。イベントへ応答するアクションの MenuAction.eventInfoを使用してください。例えば、マウスの位置を使用して、選択したコンテキストメニュー項目に基づいて、オブジェクトを作成し配置することができます。

イベントタイプリファレンス
IMGUI のサポート