Files
EnglewoodLAB/Assets/Sample/UIToolkit/UTKMultiSelectDropdownSample.cs
2026-03-10 11:35:30 +09:00

594 lines
19 KiB
C#

#nullable enable
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;
using UVC.UIToolkit;
/// <summary>
/// UTKMultiSelectDropdown 컴포넌트 샘플
/// UXML 파일을 로드하여 쿼리 방식으로 사용하는 예제
/// </summary>
[RequireComponent(typeof(UIDocument))]
public class UTKMultiSelectDropdownSample : MonoBehaviour
{
#region Enums
/// <summary>게임 난이도</summary>
public enum Difficulty
{
Easy,
Normal,
Hard,
Expert
}
/// <summary>품질 설정</summary>
public enum QualityLevel
{
Low,
Medium,
High,
Ultra
}
/// <summary>파일 형식</summary>
public enum FileFormat
{
PNG,
JPG,
GIF,
BMP,
TIFF
}
/// <summary>정렬 방식</summary>
public enum SortOrder
{
Ascending,
Descending
}
#endregion
#region Fields
[SerializeField]
[Tooltip("UI를 표시할 UIDocument 컴포넌트")]
public UIDocument? _uiDocument;
[SerializeField]
[Tooltip("시작 시 적용할 테마")]
private UTKTheme initialTheme = UTKTheme.Dark;
private UTKToggle _themeToggle;
private VisualElement? _root;
// 다중 선택 드롭다운 참조
private UTKMultiSelectDropdown? _dropdownBasic;
private UTKMultiSelectDropdown? _dropdownDefault;
private UTKMultiSelectDropdown? _dropdownCategory;
private UTKMultiSelectDropdown? _dropdownTag;
private UTKMultiSelectDropdown? _dropdownSelectAll;
private UTKMultiSelectDropdown? _dropdownDisabled;
// 다중 선택 결과 라벨 참조
private Label? _resultBasic;
private Label? _resultDefault;
private Label? _resultCategory;
private Label? _resultTag;
private Label? _resultSelectAll;
// 버튼 참조
private UTKButton? _btnSelectAll;
private UTKButton? _btnClear;
// 단일 선택 드롭다운 참조
private UTKDropdown? _dropdownSingleBasic;
private UTKDropdown? _dropdownSingleDefault;
private UTKDropdown? _dropdownSingleSort;
private UTKDropdown? _dropdownSingleDisabled;
// 단일 선택 결과 라벨 참조
private Label? _dropdownResultBasic;
private Label? _dropdownResultDefault;
private Label? _dropdownResultSort;
// Enum 드롭다운 참조
private UTKEnumDropDown? _enumDropdownDifficulty;
private UTKEnumDropDown? _enumDropdownQuality;
private UTKEnumDropDown? _enumDropdownFormat;
private UTKEnumDropDown? _enumDropdownDisabled;
// Enum 결과 라벨 참조
private Label? _enumResultDifficulty;
private Label? _enumResultQuality;
private Label? _enumResultFormat;
#endregion
#region Unity Lifecycle
private void Start()
{
var doc = GetComponent<UIDocument>();
if (doc == null)
{
Debug.LogError("UIDocument가 할당되지 않았습니다.");
return;
}
_uiDocument = doc;
var toggle = _uiDocument.rootVisualElement.Q<UTKToggle>("toggle");
if (toggle == null)
{
Debug.LogError("UXML에서 UTKToggle을 찾을 수 없습니다.");
return;
}
_themeToggle = toggle;
UTKThemeManager.Instance.RegisterRoot(_uiDocument.rootVisualElement);
UTKThemeManager.Instance.SetTheme(initialTheme);
_themeToggle.OnValueChanged += (isOn) =>
{
UTKThemeManager.Instance.SetTheme(!isOn ? UTKTheme.Dark : UTKTheme.Light);
};
LoadUIFromUXML();
}
private void OnDestroy()
{
UnregisterEvents();
}
#endregion
#region Setup
private void LoadUIFromUXML()
{
// UIDocument 참조 확인
var doc = GetComponent<UIDocument>();
if (doc == null)
{
Debug.LogError("UIDocument가 할당되지 않았습니다.");
return;
}
_uiDocument = doc;
// UI 생성
_root = _uiDocument.rootVisualElement;
// 요소 쿼리
QueryElements();
// 초기 설정
SetupInitialValues();
// 이벤트 등록
RegisterEvents();
}
private void QueryElements()
{
if (_root == null) return;
// 다중 선택 드롭다운 쿼리
_dropdownBasic = _root.Q<UTKMultiSelectDropdown>("dropdown-basic");
_dropdownDefault = _root.Q<UTKMultiSelectDropdown>("dropdown-default");
_dropdownCategory = _root.Q<UTKMultiSelectDropdown>("dropdown-category");
_dropdownTag = _root.Q<UTKMultiSelectDropdown>("dropdown-tag");
_dropdownSelectAll = _root.Q<UTKMultiSelectDropdown>("dropdown-selectall");
_dropdownDisabled = _root.Q<UTKMultiSelectDropdown>("dropdown-disabled");
// 다중 선택 결과 라벨 쿼리
_resultBasic = _root.Q<Label>("result-basic");
_resultDefault = _root.Q<Label>("result-default");
_resultCategory = _root.Q<Label>("result-category");
_resultTag = _root.Q<Label>("result-tag");
_resultSelectAll = _root.Q<Label>("result-selectall");
// 버튼 쿼리
_btnSelectAll = _root.Q<UTKButton>("btn-selectall");
_btnClear = _root.Q<UTKButton>("btn-clear");
// 단일 선택 드롭다운 쿼리
_dropdownSingleBasic = _root.Q<UTKDropdown>("dropdown-single-basic");
_dropdownSingleDefault = _root.Q<UTKDropdown>("dropdown-single-default");
_dropdownSingleSort = _root.Q<UTKDropdown>("dropdown-single-sort");
_dropdownSingleDisabled = _root.Q<UTKDropdown>("dropdown-single-disabled");
// 단일 선택 결과 라벨 쿼리
_dropdownResultBasic = _root.Q<Label>("dropdown-result-basic");
_dropdownResultDefault = _root.Q<Label>("dropdown-result-default");
_dropdownResultSort = _root.Q<Label>("dropdown-result-sort");
// Enum 드롭다운 쿼리
_enumDropdownDifficulty = _root.Q<UTKEnumDropDown>("enum-dropdown-difficulty");
_enumDropdownQuality = _root.Q<UTKEnumDropDown>("enum-dropdown-quality");
_enumDropdownFormat = _root.Q<UTKEnumDropDown>("enum-dropdown-format");
_enumDropdownDisabled = _root.Q<UTKEnumDropDown>("enum-dropdown-disabled");
// Enum 결과 라벨 쿼리
_enumResultDifficulty = _root.Q<Label>("enum-result-difficulty");
_enumResultQuality = _root.Q<Label>("enum-result-quality");
_enumResultFormat = _root.Q<Label>("enum-result-format");
}
private void SetupInitialValues()
{
// [다중 선택] 샘플 2: 기본값 설정 (한국어, English 선택)
_dropdownDefault?.SetSelectedIndices(new List<int> { 0, 1 }, notify: false);
if (_resultDefault != null && _dropdownDefault != null)
{
_resultDefault.text = $"선택 언어: {string.Join(", ", _dropdownDefault.SelectedValues)}";
}
// [다중 선택] 샘플 6: 비활성화 드롭다운 기본값 설정
_dropdownDisabled?.SetSelectedIndices(new List<int> { 0, 2 }, notify: false);
// [단일 선택] 샘플 2: 기본값 설정 (한국어 선택)
if (_dropdownResultDefault != null && _dropdownSingleDefault != null)
{
_dropdownResultDefault.text = $"선택 언어: {_dropdownSingleDefault.SelectedValue}";
}
// [Enum] 샘플 1: 난이도 드롭다운 초기화
_enumDropdownDifficulty?.Init(Difficulty.Normal);
if (_enumResultDifficulty != null && _enumDropdownDifficulty != null)
{
_enumResultDifficulty.text = $"선택 난이도: {_enumDropdownDifficulty.Value}";
}
// [Enum] 샘플 2: 품질 드롭다운 초기화
_enumDropdownQuality?.Init(QualityLevel.High);
// [Enum] 샘플 3: 파일 형식 드롭다운 초기화
_enumDropdownFormat?.Init(FileFormat.PNG);
if (_enumResultFormat != null && _enumDropdownFormat != null)
{
_enumResultFormat.text = $"선택 형식: {_enumDropdownFormat.Value}";
}
// [Enum] 샘플 4: 비활성화 드롭다운 초기화
_enumDropdownDisabled?.Init(SortOrder.Ascending);
}
private void RegisterEvents()
{
// [다중 선택] 샘플 1: 기본 다중 선택 드롭다운
if (_dropdownBasic != null && _resultBasic != null)
{
_dropdownBasic.OnSelectionChanged += OnBasicSelectionChanged;
}
// [다중 선택] 샘플 2: 기본값이 있는 드롭다운
if (_dropdownDefault != null && _resultDefault != null)
{
_dropdownDefault.OnSelectionChanged += OnDefaultSelectionChanged;
}
// [다중 선택] 샘플 3: 카테고리 필터
if (_dropdownCategory != null && _resultCategory != null)
{
_dropdownCategory.OnSelectionChanged += OnCategorySelectionChanged;
}
// [다중 선택] 샘플 4: 태그 선택기
if (_dropdownTag != null && _resultTag != null)
{
_dropdownTag.OnSelectionChanged += OnTagSelectionChanged;
}
// [다중 선택] 샘플 5: 전체 선택/해제
if (_dropdownSelectAll != null && _resultSelectAll != null)
{
_dropdownSelectAll.OnSelectionChanged += OnSelectAllSelectionChanged;
}
if (_btnSelectAll != null)
{
_btnSelectAll.OnClicked += OnSelectAllButtonClicked;
}
if (_btnClear != null)
{
_btnClear.OnClicked += OnClearButtonClicked;
}
// [단일 선택] 샘플 1: 기본 단일 선택 드롭다운
if (_dropdownSingleBasic != null && _dropdownResultBasic != null)
{
_dropdownSingleBasic.OnSelectionChanged += OnDropdownBasicSelectionChanged;
}
// [단일 선택] 샘플 2: 기본값이 있는 드롭다운
if (_dropdownSingleDefault != null && _dropdownResultDefault != null)
{
_dropdownSingleDefault.OnSelectionChanged += OnDropdownDefaultSelectionChanged;
}
// [단일 선택] 샘플 3: 정렬 옵션
if (_dropdownSingleSort != null && _dropdownResultSort != null)
{
_dropdownSingleSort.OnSelectionChanged += OnDropdownSortSelectionChanged;
}
// [Enum] 샘플 1: 난이도 선택
if (_enumDropdownDifficulty != null && _enumResultDifficulty != null)
{
_enumDropdownDifficulty.OnValueChanged += OnEnumDifficultyChanged;
}
// [Enum] 샘플 2: 품질 선택
if (_enumDropdownQuality != null && _enumResultQuality != null)
{
_enumDropdownQuality.OnValueChanged += OnEnumQualityChanged;
}
// [Enum] 샘플 3: 파일 형식 선택
if (_enumDropdownFormat != null && _enumResultFormat != null)
{
_enumDropdownFormat.OnValueChanged += OnEnumFormatChanged;
}
}
private void UnregisterEvents()
{
if (_dropdownBasic != null)
{
_dropdownBasic.OnSelectionChanged -= OnBasicSelectionChanged;
}
if (_dropdownDefault != null)
{
_dropdownDefault.OnSelectionChanged -= OnDefaultSelectionChanged;
}
if (_dropdownCategory != null)
{
_dropdownCategory.OnSelectionChanged -= OnCategorySelectionChanged;
}
if (_dropdownTag != null)
{
_dropdownTag.OnSelectionChanged -= OnTagSelectionChanged;
}
if (_dropdownSelectAll != null)
{
_dropdownSelectAll.OnSelectionChanged -= OnSelectAllSelectionChanged;
}
if (_btnSelectAll != null)
{
_btnSelectAll.OnClicked -= OnSelectAllButtonClicked;
}
if (_btnClear != null)
{
_btnClear.OnClicked -= OnClearButtonClicked;
}
// [단일 선택] 이벤트 해제
if (_dropdownSingleBasic != null)
{
_dropdownSingleBasic.OnSelectionChanged -= OnDropdownBasicSelectionChanged;
}
if (_dropdownSingleDefault != null)
{
_dropdownSingleDefault.OnSelectionChanged -= OnDropdownDefaultSelectionChanged;
}
if (_dropdownSingleSort != null)
{
_dropdownSingleSort.OnSelectionChanged -= OnDropdownSortSelectionChanged;
}
// [Enum] 이벤트 해제
if (_enumDropdownDifficulty != null)
{
_enumDropdownDifficulty.OnValueChanged -= OnEnumDifficultyChanged;
}
if (_enumDropdownQuality != null)
{
_enumDropdownQuality.OnValueChanged -= OnEnumQualityChanged;
}
if (_enumDropdownFormat != null)
{
_enumDropdownFormat.OnValueChanged -= OnEnumFormatChanged;
}
}
#endregion
#region Event Handlers
private void OnBasicSelectionChanged(List<int> indices, List<string> values)
{
if (_resultBasic == null) return;
Debug.Log($"[기본 샘플] 선택된 개수: {values.Count}");
Debug.Log($"[기본 샘플] 선택 항목: {string.Join(", ", values)}");
_resultBasic.text = values.Count > 0
? $"선택 결과: {string.Join(", ", values)}"
: "선택 결과: 없음";
}
private void OnDefaultSelectionChanged(List<int> indices, List<string> values)
{
if (_resultDefault == null) return;
Debug.Log($"[기본값 샘플] 선택 언어: {string.Join(", ", values)}");
_resultDefault.text = values.Count > 0
? $"선택 언어: {string.Join(", ", values)}"
: "선택 언어: 없음";
}
private void OnCategorySelectionChanged(List<int> indices, List<string> values)
{
if (_resultCategory == null) return;
var categoryText = values.Count > 0
? string.Join(", ", values)
: "전체";
Debug.Log($"[카테고리 필터] 선택된 카테고리: {categoryText}");
// 실제로는 여기서 필터링 로직 수행
_resultCategory.text = values.Count > 0
? $"필터링된 항목: {values.Count * 15}개 (예시)"
: "필터링된 항목: 전체 120개";
}
private void OnTagSelectionChanged(List<int> indices, List<string> values)
{
if (_resultTag == null) return;
_resultTag.text = values.Count > 0
? $"적용된 태그: [{string.Join("] [", values)}]"
: "적용된 태그: 없음";
}
private void OnSelectAllSelectionChanged(List<int> indices, List<string> values)
{
if (_resultSelectAll == null) return;
_resultSelectAll.text = values.Count > 0
? $"선택된 권한: {string.Join(", ", values)}"
: "선택된 권한: 없음";
}
private void OnSelectAllButtonClicked()
{
_dropdownSelectAll?.SelectAll();
Debug.Log("[전체 선택] 모든 권한 선택됨");
}
private void OnClearButtonClicked()
{
_dropdownSelectAll?.ClearSelection();
Debug.Log("[전체 해제] 모든 권한 해제됨");
}
// [단일 선택] 이벤트 핸들러
private void OnDropdownBasicSelectionChanged(int index, string value)
{
if (_dropdownResultBasic == null) return;
Debug.Log($"[단일 선택 - 기본] 선택: [{index}] {value}");
_dropdownResultBasic.text = !string.IsNullOrEmpty(value)
? $"선택 결과: {value}"
: "선택 결과: 없음";
}
private void OnDropdownDefaultSelectionChanged(int index, string value)
{
if (_dropdownResultDefault == null) return;
Debug.Log($"[단일 선택 - 기본값] 선택 언어: {value}");
_dropdownResultDefault.text = !string.IsNullOrEmpty(value)
? $"선택 언어: {value}"
: "선택 언어: 없음";
}
private void OnDropdownSortSelectionChanged(int index, string value)
{
if (_dropdownResultSort == null) return;
Debug.Log($"[단일 선택 - 정렬] 정렬 방식: {value}");
// 실제로는 여기서 정렬 로직 수행
_dropdownResultSort.text = !string.IsNullOrEmpty(value)
? $"정렬 방식: {value}"
: "정렬 방식: 없음";
}
// [Enum] 이벤트 핸들러
private void OnEnumDifficultyChanged(Enum? value)
{
if (_enumResultDifficulty == null) return;
if (value is Difficulty difficulty)
{
Debug.Log($"[Enum - 난이도] 선택: {difficulty}");
_enumResultDifficulty.text = $"선택 난이도: {difficulty}";
// 실제로는 여기서 난이도 적용 로직 수행
switch (difficulty)
{
case Difficulty.Easy:
Debug.Log("쉬운 난이도 적용");
break;
case Difficulty.Normal:
Debug.Log("보통 난이도 적용");
break;
case Difficulty.Hard:
Debug.Log("어려운 난이도 적용");
break;
case Difficulty.Expert:
Debug.Log("전문가 난이도 적용");
break;
}
}
else
{
_enumResultDifficulty.text = "선택 난이도: 없음";
}
}
private void OnEnumQualityChanged(Enum? value)
{
if (_enumResultQuality == null) return;
if (value is QualityLevel quality)
{
Debug.Log($"[Enum - 품질] 선택: {quality}");
_enumResultQuality.text = $"선택 품질: {quality}";
// 실제로는 여기서 품질 설정 로직 수행
switch (quality)
{
case QualityLevel.Low:
Debug.Log("낮은 품질 적용");
break;
case QualityLevel.Medium:
Debug.Log("중간 품질 적용");
break;
case QualityLevel.High:
Debug.Log("높은 품질 적용");
break;
case QualityLevel.Ultra:
Debug.Log("최고 품질 적용");
break;
}
}
else
{
_enumResultQuality.text = "선택 품질: 없음";
}
}
private void OnEnumFormatChanged(Enum? value)
{
if (_enumResultFormat == null) return;
if (value is FileFormat format)
{
Debug.Log($"[Enum - 파일 형식] 선택: {format}");
_enumResultFormat.text = $"선택 형식: {format}";
// 실제로는 여기서 파일 형식 설정 로직 수행
Debug.Log($"파일을 {format} 형식으로 저장합니다.");
}
else
{
_enumResultFormat.text = "선택 형식: 없음";
}
}
#endregion
}