UTKFloatStepper 추가. UTKFloatPropertyItem, UTKFloatPropertyItemView에 추가

This commit is contained in:
logonkhi
2026-02-09 20:28:09 +09:00
parent a38efd756e
commit 97bbb789ed
65 changed files with 2785 additions and 131 deletions

View File

@@ -82,6 +82,16 @@ namespace UVC.Sample.UIToolkit
Debug.Log($"Property Changed: {args.PropertyId} {args.PropertyName} ({args.PropertyType}) = {args.NewValue}");
};
_propertyWindow.OnPropertyClicked += args =>
{
Debug.Log($"Property Clicked: {args.Id} {args.DisplayName} ({args.PropertyType})");
};
_propertyWindow.OnPropertyButtonClicked += (id, actionName) =>
{
Debug.Log($"Button Clicked: {id} - Action: {actionName}");
};
// 샘플 데이터 생성
var entries = CreateSampleEntries();
_propertyWindow.LoadMixedProperties(entries);
@@ -94,17 +104,41 @@ namespace UVC.Sample.UIToolkit
var entries = new List<IUTKPropertyEntry>();
// ===== Group에 속하지 않은 개별 아이템들 =====
// String (편집 가능)
entries.Add(new UTKStringPropertyItem("string", "String", "Editable text"));
// String with Action Button
var stringWithButton = new UTKStringPropertyItem("string_with_btn", "String Button", "Click the button");
stringWithButton.ActionButton = new UTKButtonItem("btn_string_action", "string_action", "", UTKMaterialIcons.Search,
UTKButton.ButtonVariant.OutlineNormal, UTKButton.ButtonSize.Small);
stringWithButton.ActionButton.IconOnly = true;
stringWithButton.ActionButton.IconSize = 14;
entries.Add(stringWithButton);
var stringWithButton2 = new UTKStringPropertyItem("string_with_btn2", "String Button2", "Click the button");
stringWithButton2.ActionButton = new UTKButtonItem("btn_string_action", "string_action", "Search", UTKMaterialIcons.Search,
UTKButton.ButtonVariant.OutlineNormal, UTKButton.ButtonSize.Small);
stringWithButton2.ActionButton.IconSize = 14;
entries.Add(stringWithButton2);
// String (ShowLabel = false, 전체 너비)
var stringNoLabel = new UTKStringPropertyItem("string_no_label", "No Label String", "Full width input");
stringNoLabel.ShowLabel = false;
entries.Add(stringNoLabel);
// String (읽기 전용)
var roString = new UTKStringPropertyItem("string_ro", "String (RO)", "Read-only text", isReadOnly: true);
entries.Add(roString);
// Bool (편집 가능)
entries.Add(new UTKBoolPropertyItem("bool", "Bool", true));
// Bool (ShowLabel = false)
var boolNoLabel = new UTKBoolPropertyItem("bool_no_label", "No Label Bool", false);
boolNoLabel.ShowLabel = false;
entries.Add(boolNoLabel);
// Bool (읽기 전용)
var roBool = new UTKBoolPropertyItem("bool_ro", "Bool (RO)", true);
roBool.IsReadOnly = true;
@@ -112,7 +146,12 @@ namespace UVC.Sample.UIToolkit
// Int (편집 가능)
entries.Add(new UTKIntPropertyItem("int", "Int", 42, 0, 100));
// Int (ShowLabel = false)
var intNoLabel = new UTKIntPropertyItem("int_no_label", "No Label Int", 75, 0, 100);
intNoLabel.ShowLabel = false;
entries.Add(intNoLabel);
// Int (읽기 전용)
entries.Add(new UTKIntPropertyItem("int_ro", "Int (RO)", 99, 0, 100, isReadOnly: true));
@@ -134,13 +173,24 @@ namespace UVC.Sample.UIToolkit
// Int stepper (읽기 전용)
entries.Add(new UTKIntPropertyItem("int3_ro", "Int3 (RO)", 99, 0, 100, true, true, isReadOnly: true));
// Float (편집 가능)
entries.Add(new UTKFloatPropertyItem("float", "Float", 3.14f, 0f, 10f, true));
// Float (읽기 전용)
var roFloat = new UTKFloatPropertyItem("float_ro", "Float (RO)", 2.71f, 0f, 10f, true);
roFloat.IsReadOnly = true;
entries.Add(roFloat);
// Float (useSlider=true, useStepper=true)
entries.Add(new UTKFloatPropertyItem("float1", "Float (Slider+Stepper)", 3.14f, 0f, 10f, useSlider: true, useStepper: true));
// Float (useSlider=true, useStepper=false)
entries.Add(new UTKFloatPropertyItem("float2", "Float (Slider)", 5.0f, 0f, 10f, useSlider: true, useStepper: false));
// Float (useSlider=false, useStepper=true)
var floatStepper = new UTKFloatPropertyItem("float3", "Float (Stepper)", 2.5f, 0f, 10f, useSlider: false, useStepper: true)
{
Step = 0.5f // 0.5씩 증감
};
entries.Add(floatStepper);
// Float (useSlider=false, useStepper=false)
entries.Add(new UTKFloatPropertyItem("float4", "Float (Field)", 7.2f, 0f, 10f, useSlider: false, useStepper: false));
// Float (ReadOnly=true)
entries.Add(new UTKFloatPropertyItem("float_ro", "Float (ReadOnly)", 2.71f, 0f, 10f, useSlider: true, useStepper: false, isReadOnly: true));
// Vector2 (편집 가능)
entries.Add(new UTKVector2PropertyItem("vec2", "Vector2", new Vector2(1, 2)));
@@ -217,15 +267,27 @@ namespace UVC.Sample.UIToolkit
entries.Add(roEnum);
// Dropdown (편집 가능)
entries.Add(new UTKDropdownPropertyItem("dropdown", "Dropdown",
entries.Add(new UTKDropdownPropertyItem("dropdown", "Dropdown",
new List<string> { "Option A", "Option B", "Option C" }, "Option A"));
// Dropdown (읽기 전용)
var roDropdown = new UTKDropdownPropertyItem("dropdown_ro", "Dropdown (RO)",
var roDropdown = new UTKDropdownPropertyItem("dropdown_ro", "Dropdown (RO)",
new List<string> { "Option X", "Option Y", "Option Z" }, "Option Y");
roDropdown.IsReadOnly = true;
entries.Add(roDropdown);
// MultiSelectDropdown (편집 가능)
entries.Add(new UTKMultiSelectDropdownPropertyItem("multiselect", "MultiSelect",
new List<string> { "Tag1", "Tag2", "Tag3", "Tag4" },
new List<string> { "Tag1", "Tag3" }));
// MultiSelectDropdown (읽기 전용)
var roMultiSelect = new UTKMultiSelectDropdownPropertyItem("multiselect_ro", "MultiSelect (RO)",
new List<string> { "Feature A", "Feature B", "Feature C", "Feature D" },
new List<string> { "Feature B", "Feature C" });
roMultiSelect.IsReadOnly = true;
entries.Add(roMultiSelect);
// Radio (편집 가능)
entries.Add(new UTKRadioPropertyItem("radio", "Radio",
new List<string> { "Choice 1", "Choice 2", "Choice 3" }, 0));
@@ -261,6 +323,15 @@ namespace UVC.Sample.UIToolkit
// 기본 속성 그룹 (편집 가능)
var basicGroup = new UTKPropertyGroup("basic", "Basic Properties (Editable)");
basicGroup.AddItem(new UTKStringPropertyItem("name", "Name", "Sample Object"));
// String with Edit Button
var pathItem = new UTKStringPropertyItem("path", "File Path", "C:/Users/Sample/file.txt");
pathItem.ActionButton = new UTKButtonItem("btn_browse", "browse_file", "", UTKMaterialIcons.FolderOpen,
UTKButton.ButtonVariant.OutlineNormal, UTKButton.ButtonSize.Small);
pathItem.ActionButton.IconOnly = true;
pathItem.ActionButton.IconSize = 14;
basicGroup.AddItem(pathItem);
basicGroup.AddItem(new UTKStringPropertyItem("description", "Description", "This is a sample object") { IsMultiline = true });
basicGroup.AddItem(new UTKBoolPropertyItem("active", "Is Active", true));
basicGroup.AddItem(new UTKIntPropertyItem("count", "Count", 10, 0, 100, true));
@@ -363,6 +434,9 @@ namespace UVC.Sample.UIToolkit
selectionGroup.AddItem(new UTKEnumPropertyItem("layer", "Layer", SampleLayer.Default));
selectionGroup.AddItem(new UTKDropdownPropertyItem("tag", "Tag",
new List<string> { "Untagged", "Player", "Enemy", "Item", "Environment" }, "Player"));
selectionGroup.AddItem(new UTKMultiSelectDropdownPropertyItem("categories", "Categories",
new List<string> { "Physics", "Rendering", "Audio", "UI", "Network" },
new List<string> { "Physics", "Rendering" }));
selectionGroup.AddItem(new UTKRadioPropertyItem("quality", "Quality",
new List<string> { "Low", "Medium", "High", "Ultra" }, 2));
entries.Add(selectionGroup);
@@ -376,6 +450,11 @@ namespace UVC.Sample.UIToolkit
new List<string> { "Untagged", "Player", "Enemy", "Item", "Environment" }, "Enemy");
roTag.IsReadOnly = true;
selectionGroupRO.AddItem(roTag);
var roCategories = new UTKMultiSelectDropdownPropertyItem("categories_ro", "Categories",
new List<string> { "Physics", "Rendering", "Audio", "UI", "Network" },
new List<string> { "Audio", "UI", "Network" });
roCategories.IsReadOnly = true;
selectionGroupRO.AddItem(roCategories);
var roQuality = new UTKRadioPropertyItem("quality_ro", "Quality",
new List<string> { "Low", "Medium", "High", "Ultra" }, 3);
roQuality.IsReadOnly = true;
@@ -398,6 +477,75 @@ namespace UVC.Sample.UIToolkit
rangeGroupRO.AddItem(roDamageRange);
entries.Add(rangeGroupRO);
// Button 그룹 (라벨 표시 - ShowLabel = true, 기본값)
var buttonGroup = new UTKPropertyGroup("buttons", "Buttons (With Label)");
// Primary 버튼
buttonGroup.AddItem(new UTKButtonItem("btn_save", "save", "Save", UTKMaterialIcons.Save,
UTKButton.ButtonVariant.Primary, UTKButton.ButtonSize.Medium));
// Normal 버튼
buttonGroup.AddItem(new UTKButtonItem("btn_load", "load", "Load", UTKMaterialIcons.Download,
UTKButton.ButtonVariant.Normal, UTKButton.ButtonSize.Medium));
// Danger 버튼
buttonGroup.AddItem(new UTKButtonItem("btn_delete", "delete", "Delete", UTKMaterialIcons.Delete,
UTKButton.ButtonVariant.Danger, UTKButton.ButtonSize.Medium));
// Icon Only 버튼
var iconOnlyBtn = new UTKButtonItem("btn_settings", "settings", "", UTKMaterialIcons.Settings,
UTKButton.ButtonVariant.OutlinePrimary, UTKButton.ButtonSize.Medium);
iconOnlyBtn.IconOnly = true;
iconOnlyBtn.IconSize = 16;
buttonGroup.AddItem(iconOnlyBtn);
// Text 버튼
buttonGroup.AddItem(new UTKButtonItem("btn_help", "help", "Help", UTKMaterialIcons.Help,
UTKButton.ButtonVariant.Text, UTKButton.ButtonSize.Medium));
entries.Add(buttonGroup);
// Button 그룹 (라벨 없음 - ShowLabel = false, 전체 너비 사용)
var buttonGroupNoLabel = new UTKPropertyGroup("buttons_no_label", "Buttons (No Label)");
// Primary 버튼 (전체 너비)
var btnSaveNoLabel = new UTKButtonItem("btn_save_no_label", "save_no_label", "Save Changes", UTKMaterialIcons.Save,
UTKButton.ButtonVariant.Primary, UTKButton.ButtonSize.Medium);
btnSaveNoLabel.ShowLabel = false;
buttonGroupNoLabel.AddItem(btnSaveNoLabel);
// Normal 버튼 (전체 너비)
var btnLoadNoLabel = new UTKButtonItem("btn_load_no_label", "load_no_label", "Load Data", UTKMaterialIcons.Download,
UTKButton.ButtonVariant.Normal, UTKButton.ButtonSize.Medium);
btnLoadNoLabel.ShowLabel = false;
buttonGroupNoLabel.AddItem(btnLoadNoLabel);
// Danger 버튼 (전체 너비)
var btnDeleteNoLabel = new UTKButtonItem("btn_delete_no_label", "delete_no_label", "Delete All", UTKMaterialIcons.Delete,
UTKButton.ButtonVariant.Danger, UTKButton.ButtonSize.Medium);
btnDeleteNoLabel.ShowLabel = false;
buttonGroupNoLabel.AddItem(btnDeleteNoLabel);
entries.Add(buttonGroupNoLabel);
// Individual Button Items (라벨 표시)
entries.Add(new UTKButtonItem("btn_apply", "apply", "Apply Changes", UTKMaterialIcons.Check,
UTKButton.ButtonVariant.Primary, UTKButton.ButtonSize.Medium));
entries.Add(new UTKButtonItem("btn_reset", "reset", "Reset to Default", UTKMaterialIcons.Refresh,
UTKButton.ButtonVariant.OutlineNormal, UTKButton.ButtonSize.Medium));
// Individual Button Items (라벨 없음 - 전체 너비)
var btnConfirmNoLabel = new UTKButtonItem("btn_confirm_no_label", "confirm_no_label", "Confirm Action", UTKMaterialIcons.CheckCircle,
UTKButton.ButtonVariant.Primary, UTKButton.ButtonSize.Medium);
btnConfirmNoLabel.ShowLabel = false;
entries.Add(btnConfirmNoLabel);
var btnCancelNoLabel = new UTKButtonItem("btn_cancel_no_label", "cancel_no_label", "Cancel Operation", UTKMaterialIcons.Cancel,
UTKButton.ButtonVariant.OutlineNormal, UTKButton.ButtonSize.Medium);
btnCancelNoLabel.ShowLabel = false;
entries.Add(btnCancelNoLabel);
return entries;
}

View File

@@ -187,7 +187,7 @@ doubleField.IsEnabled = false;",
var disabledRow = root.Q<VisualElement>("stepper-disabled-row");
if (disabledRow != null)
{
var stepper = new UTKNumberStepper(0, 100, 30, 1);
var stepper = new UTKIntStepper(0, 100, 30, 1);
stepper.style.width = 150;
stepper.SetEnabled(false);
disabledRow.Add(stepper);
@@ -195,18 +195,18 @@ doubleField.IsEnabled = false;",
SetCodeSamples(root,
csharpCode: @"// 기본 사용법
var stepper = new UTKNumberStepper(minValue: 0, maxValue: 100, value: 50, step: 1);
var stepper = new UTKIntStepper(minValue: 0, maxValue: 100, value: 50, step: 1);
stepper.OnValueChanged += (newValue) => Debug.Log($""Value: {newValue}"");
// Step 설정
var stepper5 = new UTKNumberStepper(0, 100, 25, 5); // Step 5씩 증감
var stepper5 = new UTKIntStepper(0, 100, 25, 5); // Step 5씩 증감
// Wrap Around (최소/최대값에서 순환)
var wrapStepper = new UTKNumberStepper(0, 100, 0, 10);
var wrapStepper = new UTKIntStepper(0, 100, 0, 10);
wrapStepper.WrapAround = true; // 0 -> -10 시 100으로 순환
// 비활성화
var disabledStepper = new UTKNumberStepper(0, 100, 30, 1);
var disabledStepper = new UTKIntStepper(0, 100, 30, 1);
disabledStepper.SetEnabled(false);
// 속성 변경
@@ -218,19 +218,19 @@ stepper.Step = 2;",
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
<!-- Step 1 -->
<utk:UTKNumberStepper min-value=""0"" max-value=""100"" value=""50"" step=""1"" />
<utk:UTKIntStepper min-value=""0"" max-value=""100"" value=""50"" step=""1"" />
<!-- Step 5 -->
<utk:UTKNumberStepper min-value=""0"" max-value=""100"" value=""25"" step=""5"" />
<utk:UTKIntStepper min-value=""0"" max-value=""100"" value=""25"" step=""5"" />
<!-- Wrap Around -->
<utk:UTKNumberStepper min-value=""0"" max-value=""100"" value=""0"" step=""10"" wrap-around=""true"" />
<utk:UTKIntStepper min-value=""0"" max-value=""100"" value=""0"" step=""10"" wrap-around=""true"" />
<!-- 비활성화 -->
<utk:UTKNumberStepper min-value=""0"" max-value=""100"" value=""30"" step=""1"" is-enabled=""false"" />
<utk:UTKIntStepper min-value=""0"" max-value=""100"" value=""30"" step=""1"" is-enabled=""false"" />
<!-- 커스텀 스타일 -->
<utk:UTKNumberStepper class=""custom-stepper"" style=""width: 150px;"" />
<utk:UTKIntStepper class=""custom-stepper"" style=""width: 150px;"" />
</ui:UXML>");
}

View File

@@ -67,7 +67,7 @@ public partial class UTKStyleGuideSample : MonoBehaviour
["UTKVector4Field"] = "UIToolkit/Sample/Input/UTKVector4FieldSample",
["UTKRectField"] = "UIToolkit/Sample/Input/UTKRectFieldSample",
["UTKBoundsField"] = "UIToolkit/Sample/Input/UTKBoundsFieldSample",
["UTKNumberStepper"] = "UIToolkit/Sample/Input/UTKNumberStepperSample",
["UTKIntStepper"] = "UIToolkit/Sample/Input/UTKIntStepperSample",
// Slider
["UTKSlider"] = "UIToolkit/Sample/Slider/UTKSliderSample",
["UTKSliderInt"] = "UIToolkit/Sample/Slider/UTKSliderIntSample",
@@ -111,7 +111,7 @@ public partial class UTKStyleGuideSample : MonoBehaviour
{
["Icon"] = new[] { "UTKMaterialIcons", "UTKImageIcons", "UTKImage" },
["Button"] = new[] { "UTKButton", "UTKCheckBox", "UTKToggle", "UTKRadioButton", "UTKToggleButtonGroup" },
["Input"] = new[] { "UTKInputField", "UTKIntegerField", "UTKLongField", "UTKFloatField", "UTKDoubleField", "UTKVector2Field", "UTKVector3Field", "UTKVector4Field", "UTKRectField", "UTKBoundsField", "UTKNumberStepper" },
["Input"] = new[] { "UTKInputField", "UTKIntegerField", "UTKLongField", "UTKFloatField", "UTKDoubleField", "UTKVector2Field", "UTKVector3Field", "UTKVector4Field", "UTKRectField", "UTKBoundsField", "UTKIntStepper" },
["Slider"] = new[] { "UTKSlider", "UTKSliderInt", "UTKMinMaxSlider", "UTKProgressBar" },
["Dropdown"] = new[] { "UTKDropdown", "UTKEnumDropDown", "UTKMultiSelectDropdown" },
["Label"] = new[] { "UTKLabel", "UTKHelpBox" },
@@ -448,7 +448,7 @@ public partial class UTKStyleGuideSample : MonoBehaviour
case "UTKDoubleField":
InitializeDoubleFieldSample(root);
break;
case "UTKNumberStepper":
case "UTKIntStepper":
InitializeNumberStepperSample(root);
break;
case "UTKVector2Field":