UDN
Search public documentation:

UIListsKR
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(목록 구성)"은 추상적이고 비형식화의 데이터 레코드가 배열되고 표시되는 방법에 영향을 주는 모든 데이터입니다.

용어

목록 작업

개념적으로 UIList는 형식화되지 않은 데이터의 배열을 포함합니다. dataset의 각 레코드는 단일 요소에 해당합니다. 목록이 데이터를 표시하도록 구성된 방법에 따라 단일 요소는 해당 목록의 단일 셀에 해당할 수 있습니다. 레코드에 여러 필드가 있을 경우 단일 요소는 일반적으로 여러 개의 행을 가진 1개의 열에 해당합니다(기존의 "report"모드). 아주 드문 경우 단일 요소가 여러 개의 열이 있는 1개의 행에 해당할 수 있습니다. 이것은 일종의 옆으로 회전시킨 다중 열 또는 리포트뷰와 같습니다.

따라서 먼저 클릭된 열과 행에 따라 element index(요소 인덱스) 를 결정할 필요가 있습니다. 이것에 대한 알고리즘은 목록의 CellLinkType에 의해 구동됩니다. 각 셀이 1개의 데이터 레코드를 나타내는 가장 간단한 경우, 요소 인덱스는 다음과 같습니다.

NewIndex = (NumColumns * ClickedRow) + ClickedColumn;

각 행이 1개의 요소인 연결된 열을 사용하는 목록의 경우 알고리즘은 다음과 같습니다.

NewIndex = ClickedRow;

이러한 계산은 단지 예제일뿐이기 때문에 좋은 결과를 얻을 수 없습니다. 실제 알고리즘의 경우 목록의 현재 TopIndex를 고려할 필요가 있지만 이제 어떻게 되는지 아셨을 것입니다.

일단 선택된 요소에 대한 인덱스를 가졌으면 그 값을 SetIndex()로 전달하면 됩니다.

구성 요소

목록 으로 알고있는 데이터 프레젠테이션 매개물은 데이터를 제공하기 위해 데이터 소스, 발표자, 컨테이너의 3개 부분으로 구성됩니다.

UIListElementProvider: 데이터 소스는 목록에 요소를 제공하는 것을 담당합니다. 이것은 선택된 항목의 초기 세트를 제공, 사용자 선택을 저장 위치(프로파일, 원격 서버 또는 라이브 게임에서의 일부 액터 인스턴스일 수 있음)로 공개를 처리하고 또한 일부의 경우, 예를 들어 현재 게임 상태에 따라 특정 요소의 선택의 거부를 처리합니다.

UIComp_ListPresenter: 발표자는 목록 데이터의 형식 및 렌더링을 수행합니다. 이것은 어떤 요소를 렌더할지 및 요소가 렌더되야 하는 순서를 결정하고, 각 목록 요소의 기본적인 셀을 만들고, 스타일 및 스타일 변경 사항을 그러한 셀에 전달하고, 셀이 올바른 상태에 있도록 확실히 합니다.

UIList: 컨테이너는 발표자가 목록 데이터를 렌더링하는데 사용하는 매개 변수를 정의합니다. 컨테이너는 다음을 관리합니다.

  • list layout(목록 레이아웃): 요소의 수, 열과 행의 수, 발표자 목록 데이터를 렌더링하는데 사용하는 경계 영역의 정의, 1개 요소가 목록의 열과 행에 매핑되는 방식, 스크롤바, 머리글(column header) 등과 같은 모든 추가 목록 도우미를 관리합니다.
  • list interaction(목록 상호 작용): 선택된 요소의 인덱스를 추적, 한 번에 표시될 수 있는 요소의 최대 수를 추적, 보이는 첫 번째 요소의 인덱스를 추적, 요소 삽입 및 제거(삭제로 인해 인덱스가 유효하지 않게될 경우 목록의 선택된 인덱스를 업데이트하고,필요시 TopIndex를 조정하는 등)에 따른 모든 “정리 작업”을 처리, 목록 요소 네비게이션이 "wrap(래핑)” 해야 하는지 및 사용 불가된 요소의 선택이 허용되야 하는지의 여부 등과 같이 목록이 작동하는 방식에 영향을 미치는 사용자 구성 데이터를 저장 및 적용합니다.
  • input processing(입력 처리): 위/아래를 버튼을 누르거나 또는 마우스 클릭 등과 같은 사용자 입력에 따라 선택된 인덱스를 업데이트하고, 사용자가 스크롤바를 이동시킬 때 표시되는 요소를 업데이트하고, 사용자가 열의 크기를 조절할 때 발표자에 통지하는 등을 실행합니다.

고려해야 할 목록 구성 데이터의 예제에서는 CellLinkType, TopIndex, MaxVisibleItems, WrapType, bAllowDisabledItemSelection, bEnableMultiSelect입니다.

열/행으로 목록 요소가 매핑되어지는 방식의 차이는 UIList.uc의 ECellLinkType enum 주석에서 설명됩니다.

  • LINKED_None 은 목록이 표시하는 열과 행의 수에 관계없이 목록에서 1개의 요소가 1개의 셀로 매핑되는 것을 의미합니다.
  • LINKED_Columns 는 행은 변경되지만 열은 동일(연결됨)하다는 것을 의미합니다. 구성된 RowCount=는 목록의 =RowAutoSizeMode 가 None으로 설정된 경우에만 고려됩니다.
  • LINKED_Columns 는 열은 변경되지만 행은 동일(연결됨)하다는 것을 의미합니다.

데이터

UIList는 어떠한 유형의 데이터에도 바인딩될 수 있기 때문에 목록 자체는 인덱스하고만 작동합니다. UIList.GetCurrentItem()은 Items 배열의 현재 인덱스를 반환합니다. 이것은 데이터 저장소가 데이터를 출처를 포함한 목록을 제공하기 위해 사용하는 배열에 대한 인덱스에 해당합니다. 위젯과 데이터 저장소는 인터페이스를 통해 통신하고, 이 경우에는 UIListElementProvider와 UIListElementCellProvider 인터페이스를 사용합니다.

UIListElementProvider는 UIList.Items 배열로의 인덱스를 포함한 UIList를 제공하는 객체의 인터페이스이고, 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를 호출함
        }
    }
}