UTKAccodion 완료. UTKComponentList 수정 중
This commit is contained in:
@@ -27,22 +27,123 @@ namespace UVC.UIToolkit
|
||||
/// <item>선택 이벤트 처리</item>
|
||||
/// </list>
|
||||
///
|
||||
/// <para><b>UXML에서 사용:</b></para>
|
||||
/// <code>
|
||||
/// <UVC.UIToolkit.Window.UTKComponentList name="tree-list" />
|
||||
/// </code>
|
||||
/// <para><b>UXML 사용 예시:</b></para>
|
||||
/// <code><![CDATA[
|
||||
/// <!-- UXML 파일에서 UTKComponentList 사용 -->
|
||||
/// <ui:UXML xmlns:utk="UVC.UIToolkit">
|
||||
/// <utk:UTKComponentList name="component-list" />
|
||||
/// </ui:UXML>
|
||||
/// ]]></code>
|
||||
///
|
||||
/// <para><b>코드에서 사용:</b></para>
|
||||
/// <code>
|
||||
/// var list = root.Q<UTKComponentList>();
|
||||
/// list.OnSelectionChanged += (item) => Debug.Log($"선택: {item.name}");
|
||||
/// list.OnVisibilityChanged += (item) => model.SetActive(item.id, item.IsVisible);
|
||||
/// list.SetData(treeItems);
|
||||
/// </code>
|
||||
/// <para><b>C# 사용 예시:</b></para>
|
||||
/// <code><![CDATA[
|
||||
/// // 1. 컴포넌트 리스트 참조 획득
|
||||
/// var componentList = root.Q<UTKComponentList>("component-list");
|
||||
///
|
||||
/// // 2. 데이터 구성 - 카테고리(그룹)와 일반 아이템
|
||||
/// var data = new List<UTKComponentListItemDataBase>
|
||||
/// {
|
||||
/// // 카테고리(그룹) 생성
|
||||
/// new UTKComponentListCategoryData
|
||||
/// {
|
||||
/// name = "모델 그룹 A",
|
||||
/// isExpanded = true,
|
||||
/// children = new List<UTKComponentListItemDataBase>
|
||||
/// {
|
||||
/// // 일반 아이템
|
||||
/// new UTKComponentListItemData
|
||||
/// {
|
||||
/// name = "의자 모델",
|
||||
/// ExternalKey = "chair_001",
|
||||
/// IsVisible = true
|
||||
/// },
|
||||
/// new UTKComponentListItemData
|
||||
/// {
|
||||
/// name = "책상 모델",
|
||||
/// ExternalKey = "desk_001",
|
||||
/// IsVisible = true
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // 3. 데이터 설정
|
||||
/// componentList.SetData(data);
|
||||
///
|
||||
/// // 4. 선택 이벤트 구독 - 아이템 선택 시 호출
|
||||
/// componentList.OnItemSelected += (selectedItems) =>
|
||||
/// {
|
||||
/// foreach (var item in selectedItems)
|
||||
/// {
|
||||
/// Debug.Log($"선택됨: {item.name}");
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // 5. 선택 해제 이벤트 구독
|
||||
/// componentList.OnItemDeselected += (deselectedItems) =>
|
||||
/// {
|
||||
/// foreach (var item in deselectedItems)
|
||||
/// {
|
||||
/// Debug.Log($"선택 해제: {item.name}");
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // 6. 가시성 변경 이벤트 구독 - 눈 아이콘 클릭 시 호출
|
||||
/// componentList.OnItemVisibilityChanged += (item, isVisible) =>
|
||||
/// {
|
||||
/// // 3D 모델의 GameObject 활성화/비활성화
|
||||
/// var gameObject = FindGameObjectByKey(item.ExternalKey);
|
||||
/// if (gameObject != null)
|
||||
/// {
|
||||
/// gameObject.SetActive(isVisible);
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // 7. 삭제 이벤트 구독 (Delete/Backspace 키)
|
||||
/// componentList.EnabledDeleteItem = true; // 삭제 기능 활성화 필수
|
||||
/// componentList.OnItemDeleted += (item) =>
|
||||
/// {
|
||||
/// Debug.Log($"삭제 요청: {item.name}");
|
||||
/// componentList.DeleteItem(item); // 리스트에서 제거
|
||||
/// };
|
||||
///
|
||||
/// // 8. 더블클릭 이벤트 구독
|
||||
/// componentList.OnItemDoubleClicked += (item) =>
|
||||
/// {
|
||||
/// Debug.Log($"더블클릭: {item.name}");
|
||||
/// // 카메라 포커스 등의 동작 수행
|
||||
/// };
|
||||
///
|
||||
/// // 9. 아이콘 클릭 이벤트 (setting-btn, search-btn)
|
||||
/// componentList.OnItemIconClicked += (iconName, item) =>
|
||||
/// {
|
||||
/// if (iconName == "setting-btn")
|
||||
/// {
|
||||
/// ShowCategorySettings(item);
|
||||
/// }
|
||||
/// };
|
||||
///
|
||||
/// // 10. 검색 실행
|
||||
/// componentList.ApplySearch("의자");
|
||||
///
|
||||
/// // 11. 프로그래밍 방식 선택
|
||||
/// componentList.SelectItem("의자 모델", notify: true);
|
||||
/// componentList.DeselectItem("의자 모델", notify: false);
|
||||
/// componentList.ClearSelection();
|
||||
///
|
||||
/// // 12. 아이템 추가/삭제
|
||||
/// var newItem = new UTKComponentListItemData { name = "새 아이템" };
|
||||
/// componentList.AddItem(newItem); // 루트에 추가
|
||||
/// componentList.AddItem(categoryData, newItem); // 특정 카테고리에 추가
|
||||
/// componentList.DeleteItem(newItem); // 삭제
|
||||
///
|
||||
/// // 13. 리소스 해제 (OnDestroy에서 호출)
|
||||
/// componentList.Dispose();
|
||||
/// ]]></code>
|
||||
///
|
||||
/// <para><b>관련 리소스:</b></para>
|
||||
/// <list type="bullet">
|
||||
/// <item>Resources/UIToolkit/Window/UTKComponentList.uxml - 메인 레이아웃</item>
|
||||
/// <item>Resources/UIToolkit/List/UTKComponentList.uxml - 메인 레이아웃</item>
|
||||
/// <item>Resources/UIToolkit/List/UTKComponentListItem.uxml - 개별 항목 템플릿</item>
|
||||
/// <item>Resources/UIToolkit/List/UTKComponentListGroupItem.uxml - 그룹 항목 템플릿</item>
|
||||
/// </list>
|
||||
@@ -63,6 +164,8 @@ namespace UVC.UIToolkit
|
||||
/// <summary>메인 UXML 파일 경로 (Resources 폴더 기준)</summary>
|
||||
private const string UXML_PATH = "UIToolkit/List/UTKComponentList";
|
||||
|
||||
private const string USS_PATH = "UIToolkit/List/UTKComponentListUss";
|
||||
|
||||
/// <summary>일반 항목 UXML 파일 경로 (Resources 폴더 기준)</summary>
|
||||
private const string ITEM_UXML_PATH = "UIToolkit/List/UTKComponentListItem";
|
||||
|
||||
@@ -85,8 +188,8 @@ namespace UVC.UIToolkit
|
||||
/// <summary>Unity UI Toolkit의 TreeView 컴포넌트</summary>
|
||||
private TreeView? _treeView;
|
||||
|
||||
/// <summary>검색어 지우기 버튼</summary>
|
||||
private Button? _clearButton;
|
||||
/// <summary>검색어 지우기 버튼 (UTKButton)</summary>
|
||||
private UTKButton? _clearButton;
|
||||
#endregion
|
||||
|
||||
#region 내부 데이터 (Internal Data)
|
||||
@@ -199,6 +302,8 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
visualTree!.CloneTree(this);
|
||||
|
||||
|
||||
|
||||
// 2. 항목 템플릿 로드
|
||||
_itemTemplate = Resources.Load<VisualTreeAsset>(ITEM_UXML_PATH);
|
||||
_groupItemTemplate = Resources.Load<VisualTreeAsset>(GROUP_ITEM_UXML_PATH);
|
||||
@@ -207,13 +312,29 @@ namespace UVC.UIToolkit
|
||||
if (_groupItemTemplate == null)
|
||||
Debug.LogError($"[UTKComponentList] Group Item UXML not found at: {GROUP_ITEM_UXML_PATH}");
|
||||
|
||||
// 테마 적용 및 변경 구독
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
SubscribeToThemeChanges();
|
||||
|
||||
// 2. 자식 요소 참조 획득 (UXML의 name 속성으로 찾음)
|
||||
// USS 로드 (테마 변수 스타일시트 이후에 로드되어야 변수가 해석됨)
|
||||
var uss = Resources.Load<StyleSheet>(USS_PATH);
|
||||
if (uss != null)
|
||||
{
|
||||
styleSheets.Add(uss);
|
||||
}
|
||||
|
||||
// 3. 자식 요소 참조 획득 (UXML의 name 속성으로 찾음)
|
||||
_searchField = this.Q<TextField>("search-field");
|
||||
_treeView = this.Q<TreeView>("main-tree-view");
|
||||
_clearButton = this.Q<Button>("clear-btn");
|
||||
_clearButton = this.Q<UTKButton>("clear-btn");
|
||||
|
||||
// 3. 이벤트 연결 및 로직 초기화
|
||||
// 4. Clear 버튼 아이콘 설정
|
||||
if (_clearButton != null)
|
||||
{
|
||||
_clearButton.SetMaterialIcon(UTKMaterialIcons.Close, 12);
|
||||
}
|
||||
|
||||
// 5. 이벤트 연결 및 로직 초기화
|
||||
InitializeLogic();
|
||||
}
|
||||
#endregion
|
||||
@@ -251,15 +372,7 @@ namespace UVC.UIToolkit
|
||||
if(_clearButton != null)
|
||||
{
|
||||
_clearButton.style.display = DisplayStyle.None; // 초기에는 숨김
|
||||
_clearButton.clicked += () =>
|
||||
{
|
||||
if (_searchField.value.Length > 0)
|
||||
{
|
||||
_searchField.value = string.Empty;
|
||||
OnSearch(string.Empty);
|
||||
}
|
||||
_clearButton.style.display = DisplayStyle.None; // 클리어 후 숨김
|
||||
};
|
||||
_clearButton.OnClicked += OnClearButtonClicked;
|
||||
}
|
||||
|
||||
// 스크롤바 hover/active 색상 설정
|
||||
@@ -1372,6 +1485,22 @@ namespace UVC.UIToolkit
|
||||
OnSearch(_searchField?.value ?? string.Empty);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clear 버튼 클릭 이벤트를 처리합니다.
|
||||
/// </summary>
|
||||
private void OnClearButtonClicked()
|
||||
{
|
||||
if (_searchField != null && _searchField.value.Length > 0)
|
||||
{
|
||||
_searchField.value = string.Empty;
|
||||
OnSearch(string.Empty);
|
||||
}
|
||||
if (_clearButton != null)
|
||||
{
|
||||
_clearButton.style.display = DisplayStyle.None;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 검색어에 따라 트리를 필터링합니다.
|
||||
/// 검색어가 비어있으면 원본 데이터로 복원됩니다.
|
||||
@@ -1562,6 +1691,24 @@ namespace UVC.UIToolkit
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 테마 (Theme)
|
||||
|
||||
private void SubscribeToThemeChanges()
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged += OnThemeChanged;
|
||||
RegisterCallback<DetachFromPanelEvent>(_ =>
|
||||
{
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
});
|
||||
}
|
||||
|
||||
private void OnThemeChanged(UTKTheme theme)
|
||||
{
|
||||
UTKThemeManager.Instance.ApplyThemeToElement(this);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IDisposable
|
||||
/// <summary>
|
||||
/// 리소스를 해제하고 이벤트 핸들러를 정리합니다.
|
||||
@@ -1571,6 +1718,9 @@ namespace UVC.UIToolkit
|
||||
if (_disposed) return;
|
||||
_disposed = true;
|
||||
|
||||
// 테마 변경 이벤트 해제
|
||||
UTKThemeManager.Instance.OnThemeChanged -= OnThemeChanged;
|
||||
|
||||
// 검색 필드 이벤트 해제
|
||||
if (_searchField != null)
|
||||
{
|
||||
@@ -1589,6 +1739,13 @@ namespace UVC.UIToolkit
|
||||
_treeView.makeItem = null;
|
||||
}
|
||||
|
||||
// Clear 버튼 이벤트 해제 및 정리
|
||||
if (_clearButton != null)
|
||||
{
|
||||
_clearButton.OnClicked -= OnClearButtonClicked;
|
||||
_clearButton.Dispose();
|
||||
}
|
||||
|
||||
// 외부 이벤트 구독자 정리
|
||||
OnItemVisibilityChanged = null;
|
||||
OnItemSelected = null;
|
||||
|
||||
Reference in New Issue
Block a user