UTKPropertyTabListWindow 개발 중. UTKTabView Tab 버튼에 아이콘 설정 할 수 있게 기능 추가해야 함

This commit is contained in:
logonkhi
2026-02-20 19:56:23 +09:00
parent b64c3e10bc
commit 9d02afd8e8
13 changed files with 1290 additions and 33 deletions

View File

@@ -19,9 +19,10 @@ namespace UVC.Sample.UIToolkit
[Tooltip("시작 시 적용할 테마")]
private UTKTheme initialTheme = UTKTheme.Dark;
private UTKToggle _themeToggle;
private UTKToggle? _themeToggle;
private UTKPropertyListWindow _propertyWindow;
private UTKPropertyListWindow? _propertyWindow;
private UTKPropertyTabListWindow? _propertyTabWindow;
private void Start()
{
@@ -34,43 +35,48 @@ namespace UVC.Sample.UIToolkit
}
_uiDocument = doc;
var toggle = _uiDocument.rootVisualElement.Q<UTKToggle>("toggle");
if (toggle == null)
{
Debug.LogError("UXML에서 UTKToggle을 찾을 수 없습니다.");
return;
}
_themeToggle = toggle;
var window = _uiDocument.rootVisualElement.Q<UTKPropertyListWindow>("window");
if (window == null)
{
Debug.LogError("UXML에서 UTKPropertyListWindow를 찾을 수 없습니다.");
return;
}
_propertyWindow = window;
UTKThemeManager.Instance.RegisterRoot(_uiDocument.rootVisualElement);
UTKThemeManager.Instance.SetTheme(initialTheme);
_themeToggle.OnValueChanged += (isOn) =>
{
UTKThemeManager.Instance.SetTheme(!isOn ? UTKTheme.Dark : UTKTheme.Light);
};
var root = _uiDocument.rootVisualElement;
CreateSamplePropertyWindow(root);
// PropertyListWindow 샘플
var window = root.Q<UTKPropertyListWindow>("window");
if (window != null)
{
_propertyWindow = window;
_propertyWindow.style.position = Position.Absolute;
_propertyWindow.style.top = 50;
_propertyWindow.style.left = 0;
_propertyWindow.style.bottom = 0;
_propertyWindow.style.width = 300;
CreateSamplePropertyWindow();
}
// PropertyTabListWindow 샘플
var tabWindow = root.Q<UTKPropertyTabListWindow>("tabWindow");
if (tabWindow != null)
{
_propertyTabWindow = tabWindow;
_propertyTabWindow.style.position = Position.Absolute;
_propertyTabWindow.style.top = 50;
_propertyTabWindow.style.right = 0;
_propertyTabWindow.style.bottom = 0;
_propertyTabWindow.style.width = 300;
CreateSamplePropertyTabWindow();
}
UTKThemeManager.Instance.OnThemeChanged += theme =>
{
UTKThemeManager.Instance.ApplyThemeToElement(_uiDocument.rootVisualElement);
};
}
private void CreateSamplePropertyWindow(VisualElement root)
private void CreateSamplePropertyWindow()
{
if (_propertyWindow == null) return;
// 세로 높이를 부모에 맞게 꽉 채우기
_propertyWindow.style.position = Position.Absolute;
_propertyWindow.style.top = 0;
_propertyWindow.style.bottom = 0;
_propertyWindow.style.right = 0;
_propertyWindow.style.width = 300;
_propertyWindow.ShowCloseButton = true;
_propertyWindow.OnCloseClicked += () =>
{
Debug.Log("Property Window Close clicked");
@@ -105,8 +111,111 @@ namespace UVC.Sample.UIToolkit
// 샘플 데이터 생성
var entries = CreateSampleEntries();
_propertyWindow.LoadMixedProperties(entries);
}
root.Add(_propertyWindow);
/// <summary>
/// UTKPropertyTabListWindow 샘플 데이터 설정
/// 탭별로 서로 다른 데이터 타입(Flat/Grouped/Mixed)을 보여줍니다.
/// </summary>
private void CreateSamplePropertyTabWindow()
{
if (_propertyTabWindow == null) return;
_propertyTabWindow.ShowCloseButton = true;
_propertyTabWindow.OnCloseClicked += () =>
{
Debug.Log("Tab Property Window Close clicked");
_propertyTabWindow?.Hide();
};
_propertyTabWindow.OnTabChanged += (index, data) =>
{
Debug.Log($"Tab Changed: index={index}, name={data?.Name ?? "All"}");
};
_propertyTabWindow.OnPropertyValueChanged += args =>
{
Debug.Log($"[Tab] Property Changed: {args.PropertyId} {args.PropertyName} ({args.PropertyType}) = {args.NewValue}");
};
// === 탭 1: 기본 속성 (Grouped) ===
var basicTab = new TabPropertyData("기본", UTKMaterialIcons.Settings);
var basicGroups = new List<IUTKPropertyGroup>();
var infoGroup = new UTKPropertyGroup("tab_info", "기본 정보");
infoGroup.AddItem(new UTKStringPropertyItem("tab_name", "이름", "오브젝트 A"));
infoGroup.AddItem(new UTKBoolPropertyItem("tab_active", "활성화", true));
infoGroup.AddItem(new UTKEnumPropertyItem("tab_layer", "레이어", SampleLayer.Default));
infoGroup.AddItem(new UTKDropdownPropertyItem("tab_tag", "태그",
new List<string> { "Untagged", "Player", "Enemy" }, "Player"));
basicGroups.Add(infoGroup);
var transformGroup = new UTKPropertyGroup("tab_transform", "Transform");
transformGroup.AddItem(new UTKVector3PropertyItem("tab_pos", "Position", new Vector3(0, 1, 0)));
transformGroup.AddItem(new UTKVector3PropertyItem("tab_rot", "Rotation", Vector3.zero));
transformGroup.AddItem(new UTKVector3PropertyItem("tab_scale", "Scale", Vector3.one));
basicGroups.Add(transformGroup);
basicTab.SetGroupedData(basicGroups);
// === 탭 2: 외관 (Grouped) ===
var appearanceTab = new TabPropertyData("외관", UTKMaterialIcons.Palette);
var appearanceGroups = new List<IUTKPropertyGroup>();
var colorGroup = new UTKPropertyGroup("tab_colors", "색상");
colorGroup.AddItem(new UTKColorPropertyItem("tab_main_color", "메인 색상", Color.blue));
colorGroup.AddItem(new UTKColorPropertyItem("tab_emission", "발광 색상", Color.yellow, true));
colorGroup.AddItem(new UTKFloatPropertyItem("tab_alpha", "투명도", 1f, 0f, 1f, useSlider: true));
appearanceGroups.Add(colorGroup);
var materialGroup = new UTKPropertyGroup("tab_material", "머티리얼");
materialGroup.AddItem(new UTKDropdownPropertyItem("tab_shader", "셰이더",
new List<string> { "Standard", "Unlit", "URP/Lit", "URP/Simple Lit" }, "URP/Lit"));
materialGroup.AddItem(new UTKFloatPropertyItem("tab_metallic", "메탈릭", 0.5f, 0f, 1f, useSlider: true));
materialGroup.AddItem(new UTKFloatPropertyItem("tab_smoothness", "부드러움", 0.5f, 0f, 1f, useSlider: true));
appearanceGroups.Add(materialGroup);
appearanceTab.SetGroupedData(appearanceGroups);
// === 탭 3: 고급 설정 (Flat) ===
var advancedTab = new TabPropertyData("고급", UTKMaterialIcons.Tune);
var advancedItems = new List<IUTKPropertyItem>
{
new UTKBoolPropertyItem("tab_debug", "디버그 모드", false),
new UTKIntPropertyItem("tab_priority", "우선순위", 0, -10, 10, useStepper: true),
new UTKFloatPropertyItem("tab_lod_bias", "LOD Bias", 1.0f, 0.1f, 5.0f, useSlider: true, useStepper: true),
new UTKMultiSelectDropdownPropertyItem("tab_flags", "플래그",
new List<string> { "Static", "Batching", "Navigation", "Occluder", "Occludee" },
new List<string> { "Static", "Batching" }),
new UTKRadioPropertyItem("tab_quality", "품질",
new List<string> { "Low", "Medium", "High", "Ultra" }, 2),
};
advancedTab.SetFlatData(advancedItems);
// === 탭 4: 일정 (Mixed) ===
var scheduleTab = new TabPropertyData("일정", UTKMaterialIcons.CalendarMonth);
var scheduleEntries = new List<IUTKPropertyEntry>();
scheduleEntries.Add(new UTKDatePropertyItem("tab_created", "생성일", DateTime.Today.AddDays(-30)));
scheduleEntries.Add(new UTKDateTimePropertyItem("tab_modified", "수정일", DateTime.Now));
var periodGroup = new UTKPropertyGroup("tab_period", "유효 기간");
periodGroup.AddItem(new UTKDateRangePropertyItem("tab_valid", "유효 기간",
DateTime.Today, DateTime.Today.AddMonths(1)));
periodGroup.AddItem(new UTKDateTimeRangePropertyItem("tab_session", "세션 기간",
DateTime.Now, DateTime.Now.AddHours(2)));
scheduleEntries.Add(periodGroup);
scheduleTab.SetMixedData(scheduleEntries);
// 탭 데이터 설정
_propertyTabWindow.SetTabData(new List<TabPropertyData>
{
basicTab,
appearanceTab,
advancedTab,
scheduleTab
});
}
private List<IUTKPropertyEntry> CreateSampleEntries()
@@ -621,6 +730,8 @@ namespace UVC.Sample.UIToolkit
{
_propertyWindow?.Dispose();
_propertyWindow = null;
_propertyTabWindow?.Dispose();
_propertyTabWindow = null;
}
// 샘플 열거형