#nullable enable using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UIElements; using UVC.UIToolkit; /// /// UTKStyleGuideSample의 Window 카테고리 Initialize 메서드들 /// public partial class UTKStyleGuideSample { #region Window Initializers private void InitializeAccordionListWindowSample(VisualElement root) { var container = root.Q("accordion-list-window-container"); if (container == null) return; var accordionWindow = new UTKAccordionListWindow(); accordionWindow.Title = "프리팹 라이브러리"; accordionWindow.ShowCloseButton = true; var data = new UTKAccordionData(); // ======================================== // 수평 레이아웃 섹션 1: Settings // ======================================== var settingsSection = new UTKAccordionSectionData { Title = "Settings", IsExpanded = true, LayoutType = UTKAccordionLayoutType.Horizontal, HorizontalItems = new List { new UTKAccordionHorizontalItemData { Head = UTKAccordionContentSpec.FromImage(UTKMaterialIcons.LibraryAdd), Content = UTKAccordionContentSpec.FromText("Graphics", "open_graphics"), Tail = new List { UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Refresh, 12, "refresh_graphics", "새로고침"), UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Settings, 12, "setting_graphics", "설정"), } }, new UTKAccordionHorizontalItemData { Head = UTKAccordionContentSpec.FromImage(UTKMaterialIcons.AudioFile), Content = UTKAccordionContentSpec.FromText("Audio", "open_audio"), Tail = new List { UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Refresh, 12, "refresh_audio", "새로고침"), UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Settings, 12, "setting_audio", "설정"), } }, new UTKAccordionHorizontalItemData { Head = UTKAccordionContentSpec.FromImage(UTKMaterialIcons.Explore), Content = UTKAccordionContentSpec.FromText("Network", "open_network"), Tail = new List { UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Refresh, 12, "refresh_network", "새로고침"), } } } }; data.Sections.Add(settingsSection); // ======================================== // 수평 레이아웃 섹션 2: Components // ======================================== var componentsSection = new UTKAccordionSectionData { Title = "Components", IsExpanded = false, LayoutType = UTKAccordionLayoutType.Horizontal, HorizontalItems = new List { new UTKAccordionHorizontalItemData { Content = UTKAccordionContentSpec.FromText("Transform", "open_transform"), }, new UTKAccordionHorizontalItemData { Content = UTKAccordionContentSpec.FromText("Rigidbody", "open_rigidbody"), }, new UTKAccordionHorizontalItemData { Content = UTKAccordionContentSpec.FromText("Collider", "open_collider"), } } }; data.Sections.Add(componentsSection); // ======================================== // 그리드 레이아웃 섹션 1: Vehicles // ======================================== var vehiclesSection = new UTKAccordionSectionData { Title = "Vehicles", IsExpanded = true, LayoutType = UTKAccordionLayoutType.Grid, GridItems = new List { new UTKAccordionGridItemData { Caption = "Forklift", ImagePath = "Simulator/Images/lib_forklift_400x300", PrefabPath = "Simulator/FreeForkLift/Prefabs/Forklift", Tag = "vehicle" }, new UTKAccordionGridItemData { Caption = "Truck", ImagePath = "Simulator/Images/lib_forklift_400x300", PrefabPath = "Simulator/FreeForkLift/Prefabs/Forklift", Tag = "vehicle" } } }; data.Sections.Add(vehiclesSection); // ======================================== // 그리드 레이아웃 섹션 2: Objects // ======================================== var objectsSection = new UTKAccordionSectionData { Title = "Objects", IsExpanded = true, LayoutType = UTKAccordionLayoutType.Grid, GridItems = new List { new UTKAccordionGridItemData { Caption = "Pallet", ImagePath = "Simulator/Images/lib_pallet_400x300", PrefabPath = "Simulator/FreeForkLift/Prefabs/PalletEmpty", Tag = "object" }, new UTKAccordionGridItemData { Caption = "Pallet (Full)", ImagePath = "Simulator/Images/lib_pallet_400x300", PrefabPath = "Simulator/FreeForkLift/Prefabs/PalletEmpty", Tag = "object" }, new UTKAccordionGridItemData { Caption = "Box", ImagePath = "Simulator/Images/lib_pallet_400x300", PrefabPath = "Simulator/FreeForkLift/Prefabs/PalletEmpty", Tag = "object" } } }; data.Sections.Add(objectsSection); // ======================================== // 그리드 레이아웃 섹션 3: Characters // ======================================== var charactersSection = new UTKAccordionSectionData { Title = "Characters", IsExpanded = true, LayoutType = UTKAccordionLayoutType.Grid, GridItems = new List { new UTKAccordionGridItemData { Caption = "Worker", ImagePath = "Simulator/Images/lib_worker_400x300", PrefabPath = "Simulator/CharCrafter – Free Preset Characters Pack (Vol. 1)/Prefabs/Male Young Guy", Tag = "character" }, new UTKAccordionGridItemData { Caption = "Manager", ImagePath = "Simulator/Images/lib_worker_400x300", PrefabPath = "Simulator/CharCrafter – Free Preset Characters Pack (Vol. 1)/Prefabs/Male Young Guy", Tag = "character" } } }; data.Sections.Add(charactersSection); accordionWindow.SetData(data); accordionWindow.Show(); container.Add(accordionWindow); SetCodeSamples(root, csharpCode: @"// 아코디언 리스트 윈도우 생성 var accordionWindow = new UTKAccordionListWindow(); accordionWindow.Title = ""프리펍 라이브러리""; accordionWindow.ShowCloseButton = true; var data = new UTKAccordionData(); // 수평 레이아웃 섹션 var settingsSection = new UTKAccordionSectionData { Title = ""Settings"", IsExpanded = true, LayoutType = UTKAccordionLayoutType.Horizontal, HorizontalItems = new List { new UTKAccordionHorizontalItemData { Head = UTKAccordionContentSpec.FromImage(UTKMaterialIcons.LibraryAdd), Content = UTKAccordionContentSpec.FromText(""Graphics"", ""open_graphics""), Tail = new List { UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Refresh, 12, ""refresh_graphics"", ""새로고침""), UTKAccordionContentSpec.FromIconButton(UTKMaterialIcons.Settings, 12, ""setting_graphics"", ""설정""), } } } }; data.Sections.Add(settingsSection); // 그리드 레이아웃 섹션 var vehiclesSection = new UTKAccordionSectionData { Title = ""Vehicles"", IsExpanded = true, LayoutType = UTKAccordionLayoutType.Grid, GridItems = new List { new UTKAccordionGridItemData { Caption = ""Forklift"", ImagePath = ""Simulator/Images/lib_forklift_400x300"", PrefabPath = ""Simulator/FreeForkLift/Prefabs/Forklift"", Tag = ""vehicle"" } } }; data.Sections.Add(vehiclesSection); accordionWindow.SetData(data); accordionWindow.Show();"); } private void InitializeComponentListWindowSample(VisualElement root) { var container = root.Q("component-list-window-container"); if (container == null) return; var componentWindow = new UTKComponentListWindow(); componentWindow.Title = "모델 리스트"; componentWindow.ShowCloseButton = true; componentWindow.OnItemIconClicked += (itemType, itemData) => { Debug.Log($"아이콘 클릭됨: {itemType}, {itemData.name})"); }; componentWindow.OnItemVisibilityChanged += (itemData, isVisible) => { Debug.Log($"가시성 변경됨: {itemData.name}, IsVisible={isVisible})"); }; // 샘플 데이터 var category1 = new UTKComponentListCategoryData { name = "캐릭터", isExpanded = true }; category1.Add(new UTKComponentListItemData { name = "플레이어", ExternalKey = "player_001", IsVisible = true }); category1.Add(new UTKComponentListItemData { name = "NPC_01", ExternalKey = "npc_001", IsVisible = true }); category1.Add(new UTKComponentListItemData { name = "NPC_02", ExternalKey = "npc_002", IsVisible = false }); var category2 = new UTKComponentListCategoryData { name = "환경", isExpanded = false }; category2.Add(new UTKComponentListItemData { name = "나무", ExternalKey = "tree_001", IsVisible = true }); category2.Add(new UTKComponentListItemData { name = "바위", ExternalKey = "rock_001", IsVisible = true }); var data = new List { category1, category2 }; componentWindow.SetData(data); componentWindow.Show(); container.Add(componentWindow); SetCodeSamples(root, csharpCode: @"// 컴포넌트 리스트 윈도우 생성 var componentWindow = new UTKComponentListWindow(); componentWindow.Title = ""모델 리스트""; componentWindow.ShowCloseButton = true; // 샘플 데이터 var category1 = new UTKComponentListCategoryData { name = ""캐릭터"", isExpanded = true }; category1.Add(new UTKComponentListItemData { name = ""플레이어"", ExternalKey = ""player_001"", IsVisible = true }); category1.Add(new UTKComponentListItemData { name = ""NPC_01"", ExternalKey = ""npc_001"", IsVisible = true }); category1.Add(new UTKComponentListItemData { name = ""NPC_02"", ExternalKey = ""npc_002"", IsVisible = false }); var category2 = new UTKComponentListCategoryData { name = ""환경"", isExpanded = false }; category2.Add(new UTKComponentListItemData { name = ""나무"", ExternalKey = ""tree_001"", IsVisible = true }); category2.Add(new UTKComponentListItemData { name = ""바위"", ExternalKey = ""rock_001"", IsVisible = true }); var data = new List { category1, category2 }; componentWindow.SetData(data); componentWindow.Show();"); } private void InitializeComponentTabListWindowSample(VisualElement root) { var container = root.Q("component-tab-list-window-container"); if (container == null) return; var tabWindow = new UTKComponentTabListWindow(); tabWindow.Title = "모델 라이브러리"; tabWindow.ShowCloseButton = true; // 샘플 데이터 (카테고리가 탭으로 자동 생성됨) var category1 = new UTKComponentListCategoryData { name = "캐릭터", isExpanded = true }; category1.Add(new UTKComponentListItemData { name = "플레이어", IsVisible = true }); category1.Add(new UTKComponentListItemData { name = "몬스터", IsVisible = true }); var category2 = new UTKComponentListCategoryData { name = "환경", isExpanded = true }; category2.Add(new UTKComponentListItemData { name = "나무", IsVisible = true }); category2.Add(new UTKComponentListItemData { name = "풀", IsVisible = true }); var category3 = new UTKComponentListCategoryData { name = "아이템", isExpanded = true }; category3.Add(new UTKComponentListItemData { name = "검", IsVisible = true }); category3.Add(new UTKComponentListItemData { name = "방패", IsVisible = true }); var data = new List { category1, category2, category3 }; tabWindow.SetData(data); tabWindow.Show(); container.Add(tabWindow); SetCodeSamples(root, csharpCode: @"// 컴포넌트 탭 리스트 윈도우 생성 var tabWindow = new UTKComponentTabListWindow(); tabWindow.Title = ""모델 라이브러리""; tabWindow.ShowCloseButton = true; // 샘플 데이터 (카테고리가 탭으로 자동 생성됨) var category1 = new UTKComponentListCategoryData { name = ""캐릭터"", isExpanded = true }; category1.Add(new UTKComponentListItemData { name = ""플레이어"", IsVisible = true }); category1.Add(new UTKComponentListItemData { name = ""몬스터"", IsVisible = true }); var category2 = new UTKComponentListCategoryData { name = ""환경"", isExpanded = true }; category2.Add(new UTKComponentListItemData { name = ""나무"", IsVisible = true }); category2.Add(new UTKComponentListItemData { name = ""풀"", IsVisible = true }); var category3 = new UTKComponentListCategoryData { name = ""아이템"", isExpanded = true }; category3.Add(new UTKComponentListItemData { name = ""검"", IsVisible = true }); category3.Add(new UTKComponentListItemData { name = ""방패"", IsVisible = true }); var data = new List { category1, category2, category3 }; tabWindow.SetData(data); tabWindow.Show();"); } private void InitializeImageListWindowSample(VisualElement root) { var container = root.Q("image-list-window-container"); if (container == null) return; var imageWindow = new UTKImageListWindow(); imageWindow.Title = "텍스처 라이브러리"; imageWindow.ShowCloseButton = true; // 샘플 데이터 var data = new List { new UTKImageListItemData { itemName = "Texture_01", externalId = "tex_001", imagePath = "Simulator/Images/lib_forklift_400x300", objectPrefabPath = "Simulator/FreeForkLift/Prefabs/Forklift" }, new UTKImageListItemData { itemName = "Texture_02", externalId = "tex_002", imagePath = "Simulator/Images/lib_pallet_400x300", objectPrefabPath = "Simulator/FreeForkLift/Prefabs/PalletEmpty" }, new UTKImageListItemData { itemName = "Texture_03", externalId = "tex_003", imagePath = "Simulator/Images/lib_worker_400x300", objectPrefabPath = "Simulator/CharCrafter – Free Preset Characters Pack (Vol. 1)/Prefabs/Male Young Guy" }, new UTKImageListItemData { itemName = "Texture_04", externalId = "tex_004", imagePath = "Simulator/Images/lib_forklift_400x300", objectPrefabPath = "Simulator/FreeForkLift/Prefabs/Forklift" } }; imageWindow.SetData(data); imageWindow.Show(); container.Add(imageWindow); SetCodeSamples(root, csharpCode: @"// 이미지 리스트 윈도우 생성 var imageWindow = new UTKImageListWindow(); imageWindow.Title = ""텍스처 라이브러리""; imageWindow.ShowCloseButton = true; // 샘플 데이터 var data = new List { new UTKImageListItemData { itemName = ""Texture_01"", externalId = ""tex_001"", imagePath = ""Simulator/Images/lib_forklift_400x300"", objectPrefabPath = ""Simulator/FreeForkLift/Prefabs/Forklift"" }, new UTKImageListItemData { itemName = ""Texture_02"", externalId = ""tex_002"", imagePath = ""Simulator/Images/lib_pallet_400x300"", objectPrefabPath = ""Simulator/FreeForkLift/Prefabs/PalletEmpty"" }, new UTKImageListItemData { itemName = ""Texture_03"", externalId = ""tex_003"", imagePath = ""Simulator/Images/lib_worker_400x300"", objectPrefabPath = ""Simulator/CharCrafter – Free Preset Characters Pack (Vol. 1)/Prefabs/Male Young Guy"" }, new UTKImageListItemData { itemName = ""Texture_04"", externalId = ""tex_004"", imagePath = ""Simulator/Images/lib_forklift_400x300"", objectPrefabPath = ""Simulator/FreeForkLift/Prefabs/Forklift"" } }; imageWindow.SetData(data); imageWindow.Show();"); } private void InitializeTreeListWindowSample(VisualElement root) { var container = root.Q("tree-list-window-container"); if (container == null) return; var treeWindow = new UTKTreeListWindow(); treeWindow.Title = "씬 계층 구조"; treeWindow.ShowCloseButton = true; treeWindow.OnItemSelected += (itemDataList) => { Debug.Log($"선택된 아이템: {string.Join(", ", itemDataList.ConvertAll(i => i.name))}"); }; // 샘플 데이터 var environment = new UTKTreeListItemData { name = "Environment", isExpanded = true }; environment.Add(new UTKTreeListItemData { name = "Terrain", ExternalKey = "terrain_001", IsVisible = true }); environment.Add(new UTKTreeListItemData { name = "Trees", ExternalKey = "trees_001", IsVisible = true }); var characters = new UTKTreeListItemData { name = "Characters", isExpanded = false }; characters.Add(new UTKTreeListItemData { name = "Player", ExternalKey = "player_001", IsVisible = true }); characters.Add(new UTKTreeListItemData { name = "Enemies", ExternalKey = "enemies_001", IsVisible = true }); var rootNode = new UTKTreeListItemData { name = "Root", isExpanded = true }; rootNode.Add(environment); rootNode.Add(characters); var data = new List { rootNode }; treeWindow.SetData(data); treeWindow.Show(); container.Add(treeWindow); SetCodeSamples(root, csharpCode: @"// 트리 리스트 윈도우 생성 var treeWindow = new UTKTreeListWindow(); treeWindow.Title = ""씬 계층 구조""; treeWindow.ShowCloseButton = true; // 샘플 데이터 var environment = new UTKTreeListItemData { name = ""Environment"", isExpanded = true }; environment.Add(new UTKTreeListItemData { name = ""Terrain"", ExternalKey = ""terrain_001"", IsVisible = true }); environment.Add(new UTKTreeListItemData { name = ""Trees"", ExternalKey = ""trees_001"", IsVisible = true }); var characters = new UTKTreeListItemData { name = ""Characters"", isExpanded = false }; characters.Add(new UTKTreeListItemData { name = ""Player"", ExternalKey = ""player_001"", IsVisible = true }); characters.Add(new UTKTreeListItemData { name = ""Enemies"", ExternalKey = ""enemies_001"", IsVisible = true }); var rootNode = new UTKTreeListItemData { name = ""Root"", isExpanded = true }; rootNode.Add(environment); rootNode.Add(characters); var data = new List { rootNode }; treeWindow.SetData(data); treeWindow.Show();"); } private void InitializePropertyListWindowSample(VisualElement root) { var container = root.Q("property-list-window-container"); if (container == null) return; var propertyWindow = new UTKPropertyListWindow(); propertyWindow.Title = "속성 편집기"; propertyWindow.ShowCloseButton = true; propertyWindow.style.width = 320; propertyWindow.style.height = 600; // 이벤트 구독 propertyWindow.OnCloseClicked += () => { Debug.Log("Property Window Close clicked"); }; propertyWindow.OnPropertyValueChanged += args => { Debug.Log($"Property Changed: {args.PropertyId} = {args.NewValue}"); }; propertyWindow.OnPropertyClicked += args => { Debug.Log($"Property Clicked: {args.Id} {args.DisplayName}"); }; propertyWindow.OnPropertyButtonClicked += (id, actionName) => { Debug.Log($"Button Clicked: {id} - Action: {actionName}"); }; // 샘플 데이터 생성 (모든 PropertyItem 종류 포함) var entries = CreatePropertyListSampleEntries(); propertyWindow.LoadMixedProperties(entries); propertyWindow.Show(); container.Add(propertyWindow); // PropertyTabListWindow 샘플도 함께 초기화 (동일 UXML 내) InitializePropertyTabListWindowSample(root); SetCodeSamples(root, csharpCode: @"// 속성 윈도우 생성 var propertyWindow = new UTKPropertyListWindow(); propertyWindow.Title = ""속성 편집기""; propertyWindow.ShowCloseButton = true; // 이벤트 구독 propertyWindow.OnPropertyValueChanged += args => { Debug.Log($""{args.PropertyId} = {args.NewValue}""); }; // 샘플 데이터 var entries = new List(); // String entries.Add(new UTKStringPropertyItem(""name"", ""Name"", ""Sample Object"")); // Bool entries.Add(new UTKBoolPropertyItem(""active"", ""Is Active"", true)); // Int (Slider) entries.Add(new UTKIntPropertyItem(""count"", ""Count"", 10, 0, 100, useSlider: true)); // Float (Slider + Stepper) entries.Add(new UTKFloatPropertyItem(""speed"", ""Speed"", 1.5f, 0f, 10f, useSlider: true, useStepper: true)); // Vector2/Vector3 entries.Add(new UTKVector2PropertyItem(""offset"", ""Offset"", Vector2.zero)); entries.Add(new UTKVector3PropertyItem(""position"", ""Position"", Vector3.zero)); // Color entries.Add(new UTKColorPropertyItem(""color"", ""Color"", Color.red)); // Date/DateTime entries.Add(new UTKDatePropertyItem(""date"", ""Date"", DateTime.Today)); entries.Add(new UTKDateTimePropertyItem(""datetime"", ""DateTime"", DateTime.Now)); // Range entries.Add(new UTKIntRangePropertyItem(""range"", ""Range"", 10, 90)); entries.Add(new UTKFloatRangePropertyItem(""floatRange"", ""Float Range"", 1.5f, 8.5f)); // Dropdown entries.Add(new UTKDropdownPropertyItem(""dropdown"", ""Dropdown"", new List { ""Option A"", ""Option B"", ""Option C"" }, ""Option A"")); // Enum entries.Add(new UTKEnumPropertyItem(""layer"", ""Layer"", LayerMask.NameToLayer(""Default""))); // Group var group = new UTKPropertyGroup(""transform"", ""Transform""); group.AddItem(new UTKVector3PropertyItem(""pos"", ""Position"", Vector3.zero)); group.AddItem(new UTKVector3PropertyItem(""rot"", ""Rotation"", Vector3.zero)); entries.Add(group); propertyWindow.LoadMixedProperties(entries); propertyWindow.Show();", uxmlCode: @" "); } private void InitializePropertyTabListWindowSample(VisualElement root) { var container = root.Q("property-tab-list-window-container"); if (container == null) return; var tabWindow = new UTKPropertyTabListWindow("속성 탭 편집기", showAllTab: true); tabWindow.ShowCloseButton = true; tabWindow.style.width = 320; tabWindow.style.height = 600; // 이벤트 구독 tabWindow.OnCloseClicked += () => { Debug.Log("PropertyTabListWindow Close clicked"); }; tabWindow.OnTabChanged += (index, tabData) => { Debug.Log($"Tab Changed: index={index}, name={tabData?.Name}"); }; tabWindow.OnPropertyValueChanged += args => { Debug.Log($"Property Changed: {args.PropertyId} = {args.NewValue}"); }; // ===== 탭 1: 기본 속성 (Flat) ===== var generalTab = new TabPropertyData("일반"); generalTab.SetFlatData(new List { new UTKStringPropertyItem("name", "Name", "Sample Object"), new UTKBoolPropertyItem("active", "Is Active", true), new UTKIntPropertyItem("count", "Count", 10, 0, 100, useSlider: true), new UTKFloatPropertyItem("speed", "Speed", 1.5f, 0f, 10f, useSlider: true, useStepper: true), new UTKDropdownPropertyItem("type", "Type", new List { "Static", "Dynamic", "Kinematic" }, "Static"), }); // ===== 탭 2: Transform (Grouped) ===== var transformTab = new TabPropertyData("트랜스폼"); var posGroup = new UTKPropertyGroup("position", "Position"); posGroup.AddItem(new UTKVector3PropertyItem("pos", "Position", Vector3.zero)); posGroup.AddItem(new UTKVector3PropertyItem("rot", "Rotation", Vector3.zero)); posGroup.AddItem(new UTKVector3PropertyItem("scl", "Scale", Vector3.one)); var physicsGroup = new UTKPropertyGroup("physics", "Physics"); physicsGroup.AddItem(new UTKFloatPropertyItem("mass", "Mass", 1.0f, 0f, 100f, useSlider: true)); physicsGroup.AddItem(new UTKBoolPropertyItem("gravity", "Use Gravity", true)); physicsGroup.AddItem(new UTKDropdownPropertyItem("collision", "Collision", new List { "Discrete", "Continuous", "ContinuousDynamic" }, "Discrete")); transformTab.SetGroupedData(new List { posGroup, physicsGroup }); // ===== 탭 3: 외형 (Mixed) ===== var appearanceTab = new TabPropertyData("외형"); var mixedEntries = new List { new UTKColorPropertyItem("mainColor", "Main Color", Color.blue), new UTKColorPropertyItem("emissionColor", "Emission", Color.yellow, useAlpha: true), new UTKFloatPropertyItem("alpha", "Alpha", 1f, 0f, 1f, useSlider: true), }; var materialGroup = new UTKPropertyGroup("material", "Material"); materialGroup.AddItem(new UTKStringPropertyItem("shader", "Shader", "Standard")); materialGroup.AddItem(new UTKDropdownPropertyItem("renderQueue", "Render Queue", new List { "Geometry", "AlphaTest", "Transparent" }, "Geometry")); mixedEntries.Add(materialGroup); appearanceTab.SetMixedData(mixedEntries); // ===== 탭 4: 비활성 탭 ===== var disabledTab = new TabPropertyData("비활성") { IsEnabled = false, Tooltip = "이 탭은 비활성 상태입니다" }; disabledTab.SetFlatData(new List()); // 탭 데이터 설정 tabWindow.SetTabData(new List { generalTab, transformTab, appearanceTab, disabledTab }); tabWindow.Show(); container.Add(tabWindow); } /// /// 모든 PropertyItem 종류를 포함하는 샘플 데이터를 생성합니다. /// private List CreatePropertyListSampleEntries() { var entries = new List(); // ===== 개별 아이템들 ===== // String (편집 가능) entries.Add(new UTKStringPropertyItem("string", "String", "Editable text")); // String with Action Button var stringWithButton = new UTKStringPropertyItem("string_btn", "String Button", "Click button"); stringWithButton.ActionButton = new UTKButtonItem("btn_search", "search", "", UTKMaterialIcons.Search, UTKButton.ButtonVariant.OutlineNormal, UTKButton.ButtonSize.Small); stringWithButton.ActionButton.IconOnly = true; stringWithButton.ActionButton.IconSize = 14; entries.Add(stringWithButton); // String (읽기 전용) entries.Add(new UTKStringPropertyItem("string_ro", "String (RO)", "Read-only", isReadOnly: true)); // Bool (편집 가능) entries.Add(new UTKBoolPropertyItem("bool", "Bool", true)); // Bool (읽기 전용) entries.Add(new UTKBoolPropertyItem("bool_ro", "Bool (RO)", true, isReadOnly: true)); // Int (Slider) entries.Add(new UTKIntPropertyItem("int", "Int", 42, 0, 100, useSlider: true)); // Int (Slider + Stepper) entries.Add(new UTKIntPropertyItem("int_stepper", "Int Stepper", 50, 0, 100, useSlider: true, useStepper: true)); // Int (읽기 전용) entries.Add(new UTKIntPropertyItem("int_ro", "Int (RO)", 99, 0, 100, useSlider: true, isReadOnly: true)); // Float (Slider + Stepper) entries.Add(new UTKFloatPropertyItem("float", "Float", 3.14f, 0f, 10f, useSlider: true, useStepper: true)); // Float (Stepper만) entries.Add(new UTKFloatPropertyItem("float_stepper", "Float Stepper", 2.5f, 0f, 10f, useSlider: false, useStepper: true)); // Float (읽기 전용) entries.Add(new UTKFloatPropertyItem("float_ro", "Float (RO)", 7.2f, 0f, 10f, useSlider: true, isReadOnly: true)); // Vector2 entries.Add(new UTKVector2PropertyItem("vec2", "Vector2", new Vector2(1, 2))); // Vector2 (읽기 전용) entries.Add(new UTKVector2PropertyItem("vec2_ro", "Vector2 (RO)", new Vector2(3, 4)) { IsReadOnly = true }); // Vector3 entries.Add(new UTKVector3PropertyItem("vec3", "Vector3", new Vector3(1, 2, 3))); // Vector3 (읽기 전용) entries.Add(new UTKVector3PropertyItem("vec3_ro", "Vector3 (RO)", new Vector3(4, 5, 6)) { IsReadOnly = true }); // Color entries.Add(new UTKColorPropertyItem("color", "Color", Color.red)); // Color (Alpha 포함) entries.Add(new UTKColorPropertyItem("color_alpha", "Color (Alpha)", Color.blue, useAlpha: true)); // Color (읽기 전용) entries.Add(new UTKColorPropertyItem("color_ro", "Color (RO)", Color.green) { IsReadOnly = true }); // ColorState entries.Add(new UTKColorStatePropertyItem("colorstate", "ColorState", new UTKColorState("Active", Color.green))); // ColorState (읽기 전용) entries.Add(new UTKColorStatePropertyItem("colorstate_ro", "ColorState (RO)", new UTKColorState("Locked", Color.gray)) { IsReadOnly = true }); // Date entries.Add(new UTKDatePropertyItem("date", "Date", DateTime.Today)); // Date (읽기 전용) entries.Add(new UTKDatePropertyItem("date_ro", "Date (RO)", DateTime.Today.AddDays(7), isReadOnly: true)); // DateTime entries.Add(new UTKDateTimePropertyItem("datetime", "DateTime", DateTime.Now)); // DateTime (읽기 전용) entries.Add(new UTKDateTimePropertyItem("datetime_ro", "DateTime (RO)", DateTime.Now.AddHours(1), isReadOnly: true)); // DateRange entries.Add(new UTKDateRangePropertyItem("daterange", "DateRange", DateTime.Today, DateTime.Today.AddDays(7))); // DateRange (읽기 전용) entries.Add(new UTKDateRangePropertyItem("daterange_ro", "DateRange (RO)", DateTime.Today.AddDays(10), DateTime.Today.AddDays(20)) { IsReadOnly = true }); // DateTimeRange entries.Add(new UTKDateTimeRangePropertyItem("datetimerange", "DateTimeRange", DateTime.Now, DateTime.Now.AddHours(2))); // DateTimeRange (읽기 전용) entries.Add(new UTKDateTimeRangePropertyItem("datetimerange_ro", "DateTimeRange (RO)", DateTime.Now.AddHours(3), DateTime.Now.AddHours(5)) { IsReadOnly = true }); // Enum entries.Add(new UTKEnumPropertyItem("enum", "Enum", SampleLayer.Default)); // Enum (읽기 전용) entries.Add(new UTKEnumPropertyItem("enum_ro", "Enum (RO)", SampleLayer.Water) { IsReadOnly = true }); // Dropdown entries.Add(new UTKDropdownPropertyItem("dropdown", "Dropdown", new List { "Option A", "Option B", "Option C" }, "Option A")); // Dropdown (읽기 전용) entries.Add(new UTKDropdownPropertyItem("dropdown_ro", "Dropdown (RO)", new List { "Option X", "Option Y", "Option Z" }, "Option Y") { IsReadOnly = true }); // MultiSelectDropdown entries.Add(new UTKMultiSelectDropdownPropertyItem("multiselect", "MultiSelect", new List { "Tag1", "Tag2", "Tag3", "Tag4" }, new List { "Tag1", "Tag3" })); // MultiSelectDropdown (읽기 전용) entries.Add(new UTKMultiSelectDropdownPropertyItem("multiselect_ro", "MultiSelect (RO)", new List { "Feature A", "Feature B", "Feature C" }, new List { "Feature B" }) { IsReadOnly = true }); // Radio entries.Add(new UTKRadioPropertyItem("radio", "Radio", new List { "Choice 1", "Choice 2", "Choice 3" }, 0)); // Radio (읽기 전용) entries.Add(new UTKRadioPropertyItem("radio_ro", "Radio (RO)", new List { "Choice A", "Choice B", "Choice C" }, 1) { IsReadOnly = true }); // IntRange entries.Add(new UTKIntRangePropertyItem("intrange", "IntRange", 10, 90)); // IntRange (Stepper) entries.Add(new UTKIntRangePropertyItem("intrange_stepper", "IntRange Stepper", 20, 80, useStepper: true)); // IntRange (읽기 전용) entries.Add(new UTKIntRangePropertyItem("intrange_ro", "IntRange (RO)", 30, 70, isReadOnly: true)); // FloatRange entries.Add(new UTKFloatRangePropertyItem("floatrange", "FloatRange", 1.5f, 8.5f)); // FloatRange (Stepper) entries.Add(new UTKFloatRangePropertyItem("floatrange_stepper", "FloatRange Stepper", 2.5f, 7.5f, stepperStep: 0.5f, stepperMinValue: 0f, stepperMaxValue: 100f, useStepper: true)); // FloatRange (읽기 전용) entries.Add(new UTKFloatRangePropertyItem("floatrange_ro", "FloatRange (RO)", 3.0f, 6.0f) { IsReadOnly = true }); // FloatDropdown entries.Add(new UTKFloatDropdownPropertyItem("floatdropdown", "FloatDropdown", 1.5f, new List { "mm", "cm", "m" }, "cm")); // FloatDropdown (Stepper) entries.Add(new UTKFloatDropdownPropertyItem("floatdropdown_stepper", "FloatDropdown Stepper", 10.0f, new List { "mm", "cm", "m" }, "m", floatMinValue: 0f, floatMaxValue: 1000f, stepperStep: 0.5f, useStepper: true)); // FloatDropdown (읽기 전용) entries.Add(new UTKFloatDropdownPropertyItem("floatdropdown_ro", "FloatDropdown (RO)", 5.0f, new List { "mm", "cm", "m" }, "m", isReadOnly: true)); // ===== 그룹에 속한 아이템들 ===== // Basic Properties 그룹 var basicGroup = new UTKPropertyGroup("basic", "Basic Properties"); basicGroup.AddItem(new UTKStringPropertyItem("name", "Name", "Sample Object")); basicGroup.AddItem(new UTKBoolPropertyItem("active", "Is Active", true)); basicGroup.AddItem(new UTKIntPropertyItem("count", "Count", 10, 0, 100, useSlider: true)); entries.Add(basicGroup); // Transform 그룹 var transformGroup = new UTKPropertyGroup("transform", "Transform"); transformGroup.AddItem(new UTKVector3PropertyItem("position", "Position", Vector3.zero)); transformGroup.AddItem(new UTKVector3PropertyItem("rotation", "Rotation", Vector3.zero)); transformGroup.AddItem(new UTKVector3PropertyItem("scale", "Scale", Vector3.one)); entries.Add(transformGroup); // Appearance 그룹 var appearanceGroup = new UTKPropertyGroup("appearance", "Appearance"); appearanceGroup.AddItem(new UTKColorPropertyItem("mainColor", "Main Color", Color.blue)); appearanceGroup.AddItem(new UTKColorPropertyItem("emissionColor", "Emission", Color.yellow, useAlpha: true)); appearanceGroup.AddItem(new UTKFloatPropertyItem("alpha", "Alpha", 1f, 0f, 1f, useSlider: true)); entries.Add(appearanceGroup); // Button 그룹 var buttonGroup = new UTKPropertyGroup("buttons", "Buttons"); buttonGroup.AddItem(new UTKButtonItem("btn_save", "save", "Save", UTKMaterialIcons.Save, UTKButton.ButtonVariant.Primary, UTKButton.ButtonSize.Medium)); buttonGroup.AddItem(new UTKButtonItem("btn_load", "load", "Load", UTKMaterialIcons.Download, UTKButton.ButtonVariant.Normal, UTKButton.ButtonSize.Medium)); buttonGroup.AddItem(new UTKButtonItem("btn_delete", "delete", "Delete", UTKMaterialIcons.Delete, UTKButton.ButtonVariant.Danger, UTKButton.ButtonSize.Medium)); entries.Add(buttonGroup); return entries; } // 샘플 열거형 (UTKPropertyListWindowSample과 동일) public enum SampleLayer { Default, TransparentFX, IgnoreRaycast, Water, UI } #endregion }