UDN
Search public documentation:

UIListsJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UI リスト システム

ドキュメント概要: UnrealEngine3 内のリストの技術ガイド。

ドキュメントの変更ログ: Ron Prestenback? により作成、Richard Nalezynski? により管理。

概観

リストはデータのコンテナです。一般的に、"list configuration (リスト設定)" は、抽象的で型付けされないデータ レコードがどのようにアレンジされ表示されるかに影響を与えるデータです。

ターミノロジー

Lists を扱う

概念的に、UIList は型付けされないデータの配列を含みます。データセット内の各レコードは 1 つの要素に対応しています。リストがどのようにそのデータを表示するように設定されているかによって、1 つの要素はリストの 1 つのセルに対応する場合があります。レコードに複数のフィールドがあると、1 つの要素は通常、複数のコラムを持つ 1 つの列に対応します (従来の “report (レポート)” モード)。まれに、1 つの要素は、複数の列を持つ 1 つのコラムに対応することがあります。横に回転した複数のコラム、またはレポート ビューのような感じです。

従って、最初にしなければいけないことは、クリックされた列とコラムに基づいて element index (要素インデックス) を決定することです。このアルゴリズムは、リストの CellLinkType によってドリブンされます。各セルが 1 つのデータ レコードを表すような単純な場合では、要素インデックスは以下のようになります。

NewIndex = (NumColumns * ClickedRow) + ClickedColumn;

各列が 1 つの要素であるようなリンクされたコラムを使用するリストに関しては、アルゴリズムは以下のようになります。

NewIndex = ClickedRow;

これらの計算は単なる例なので、実際に良い結果をもたらしません。実際のアルゴリズムに関しては、リストの現在の TopIndex を考慮に入れる必要がありますが、言っていることは分かっていただけるでしょう。

選択された要素のインデックスができると、その値を SetIndex() にパスするだけです。

コンポーネント

リスト として知識のあるデータ プレゼンテーション ビークルは、データを提示するのに、データ ソース、プレゼンター、コンテナ3 つの部分から成り立ちます。

UIListElementProvider: データ ソースは、リストに要素を提供します。選択されたアイテムの最初のセットの提供、ユーザー セレクションの格納先への公開、また、いくつかの場合では例えば、現在のゲーム状態によって特定の要素の選択の拒否を処理します。

UIComp_ListPresenter: プレゼンターは、リスト データのフォーマットとレンダリングを行います。これは、どの要素をレンダリングするか、要素がレンダリングされる順序の決定、各リスト要素の基本的なセルの作成、スタイルとスタイル変更をこれらのセルへプロパゲート、セルが正常な状態にあるように維持などをします。

UIList: コンテナは、プレゼンターがリスト データをレンダリングするのに使用するパラメータを定義します。コンテナは以下を管理します。

  • list layout (リスト レイアウト): 要素の数、コラムと列の数、プレゼンターがリスト データをレンダリングするのに使用する境界域の定義、1 つの要素がどのようにリスト コラムや列にマップされるかのコントロール、スクロールバー、コラム ヘッダのような追加のリスト ヘルパーの管理などをします。
  • list interaction (リスト インタラクション): 選択された要素のインデックスのトラック、一度に表示される要素の最大数のトラック、表示される最初の要素のインデックスのトラック、要素の挿入や削除 (リストの選択されたインデックスが削除によって無効になった場合、そのアップデートや、必要に応じて TopIndex の調整など) に伴うクリーンアップのすべての処理、(リスト要素ナビゲーションがラップするべきかどうかや無効化されたようその選択が可能かどうかなどの) リストがどのように機能するかに影響を与えるユーザー設定データの格納と適用を行います。
  • input processing (入力処理): (上/下を押す、マウスのクリックなどの) ユーザー入力に基づいた選択されたインデックスのアップデート、ユーザーがスクロールバーを移動する際の表示されている要素のアップデート、ユーザーがコラムをリサイズした際のプレゼンターへの通知などを行います。

考慮に入れなければいけないリスト設定データの例は、CellLinkType、TopIndex、MaxVisibleItems、WrapType、bAllowDisabledItemSelection、bEnableMultiSelect です。

コラム/列にどのようにリスト要素がマップされるかの差異は、UIList.uc の ECellLinkType enum のコメントに説明されています。

  • LINKED_None は、1 つのリスト要素が、リストが表示しているコラムと列の数に関係なく、リスト内の 1 つのセルにマップするということです。
  • LINKED_Columns は、列は多様ですが、コラムは同じまま (リンクされている) ということです。設定された RowCount は、リストの RowAutoSizeMode が None に設定されている場合のみに尊重されます。
  • LINKED_Rows は、コラムは多様ですが、列は同じまま (リンクされている) ということです。

データ

UIList は、いかなるタイプのデータにもバインドすることができるので、リスト自身はインデックスとのみ動作します。UIList.GetCurrentItem() は、Items 配列の現在のインデックスの値を返します。これは、データ ストアがリストにデータを提供するのに使用している配列へのインデックスに対応します。ウィジェットとデータ ストアはインターフェースを通じてコミュニケートし、この場合は、UIListElementProvider と UIListElementCellProvider インターフェースになります。

UIListElementProvider は UIList にインデックスを提供するオブジェクトのインターフェースです。これらのインデックスは、UIList.Items 配列に投入され、UIList.DataProvider 変数でキャッシュされます。

UIListElementCellProvider は、特定の列の各コラムに実際の値を提供するオブジェクトのインターフェースです。リストにバインドされているデータのタイプによって、リストの各要素のデータは異なるオブジェクト (例えば、データをサーバーに提供するのに、受信した各サーバーが、それぞれの UIDataProvider_Settings を持つような OnlineGameSearch データ ストアの場合) からくる場合があります。または、同じオブジェクトからくる場合もあります。この理由のため、UIListElementProvider インターフェースは、任意のインデックス [データ ストア値配列へ] の正しいセル値プロバイダー GetElementCellValueProvider() を取得するメソッドを持ちます。選択された要素の正しいセル値プロバイダを取得したら、GetCellFieldValue() メソッドを呼び出し、その特定の要素のために探しているデータ フィールドの値を取得します。従って、以下のようになります。

if ( MyList->DataProvider )
{
    INT CurrentItem = MyList->GetCurrentItem();
    if(CurrentItem != INDEX_NONE )
    {
        TScriptInterface<IUIListElementCellProvider> CellProvider = MyList->DataProvider->GetElementCellValueProvider(MyList->DataSource.DataStoreFieldName, CurrentItem);
        if ( CellProvider )
        {
             // 希望のフィールドの値を得るために GetCellFieldValue を呼び出します。
        }
    }
}