UTKInput Validation 기능 추가
This commit is contained in:
@@ -96,6 +96,10 @@ namespace UVC.Sample.UIToolkit
|
||||
_propertyWindow.OnPropertyButtonClicked += (id, actionName) =>
|
||||
{
|
||||
Debug.Log($"Button Clicked: {id} - Action: {actionName}");
|
||||
if(id == "string_with_btn" && actionName == "string_action")
|
||||
{
|
||||
_propertyWindow.SetPropertyValue("string_with_btn", "Button clicked!");
|
||||
}
|
||||
};
|
||||
|
||||
// 샘플 데이터 생성
|
||||
|
||||
@@ -15,6 +15,45 @@ public partial class UTKStyleGuideSample
|
||||
|
||||
private void InitializeInputFieldSample(VisualElement root)
|
||||
{
|
||||
// Validation - Email
|
||||
var emailInput = root.Q<UTKInputField>("input-validation-email");
|
||||
if (emailInput != null)
|
||||
{
|
||||
emailInput.ErrorMessage = "올바른 이메일 형식이 아닙니다.";
|
||||
emailInput.Validation = () => emailInput.Value.Contains("@") && emailInput.Value.Contains(".");
|
||||
}
|
||||
|
||||
// Validation - Required
|
||||
var requiredInput = root.Q<UTKInputField>("input-validation-required");
|
||||
if (requiredInput != null)
|
||||
{
|
||||
requiredInput.ErrorMessage = "이름은 필수 항목입니다.";
|
||||
requiredInput.Validation = () => !string.IsNullOrWhiteSpace(requiredInput.Value);
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var emailValid = emailInput?.Validate() ?? true;
|
||||
var nameValid = requiredInput?.Validate() ?? true;
|
||||
var allValid = emailValid && nameValid;
|
||||
Debug.Log($"Validation: {(allValid ? "All Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
emailInput?.ClearError();
|
||||
requiredInput?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 입력 필드
|
||||
var input = new UTKInputField();
|
||||
@@ -27,10 +66,6 @@ var password = new UTKInputField();
|
||||
password.label = ""비밀번호"";
|
||||
password.isPasswordField = true;
|
||||
|
||||
// 검증 오류 표시
|
||||
input.ErrorMessage = ""이름은 필수입니다."";
|
||||
input.ErrorMessage = """"; // 오류 제거
|
||||
|
||||
// 변형 스타일
|
||||
input.Variant = UTKInputField.InputFieldVariant.Outlined;
|
||||
|
||||
@@ -39,13 +74,34 @@ input.OnFocused += () => Debug.Log(""포커스"");
|
||||
input.OnBlurred += () => Debug.Log(""포커스 해제"");
|
||||
input.OnSubmit += (value) => Debug.Log($""제출: {value}"");
|
||||
|
||||
// 비활성화
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
// 1) ErrorMessage + Validation 함수 설정
|
||||
var emailInput = new UTKInputField(""이메일"", ""example@email.com"");
|
||||
emailInput.ErrorMessage = ""올바른 이메일 형식이 아닙니다."";
|
||||
emailInput.Validation = () => emailInput.Value.Contains(""@"");
|
||||
// → Submit(Enter) 또는 FocusOut 시 자동 검증
|
||||
// → 실패: 붉은 외곽선 + 에러 메시지 표시
|
||||
// → 통과: 에러 상태 자동 해제
|
||||
|
||||
// 2) 필수 입력 검증
|
||||
var nameInput = new UTKInputField(""이름"");
|
||||
nameInput.ErrorMessage = ""이름은 필수 항목입니다."";
|
||||
nameInput.Validation = () => !string.IsNullOrWhiteSpace(nameInput.Value);
|
||||
|
||||
// 3) 강제 검증 호출 (폼 제출 버튼 등에서 사용)
|
||||
bool isValid = nameInput.Validate(); // Validation 실행 + UI 업데이트
|
||||
if (!isValid) return;
|
||||
|
||||
// 4) 에러 수동 해제
|
||||
nameInput.ClearError();
|
||||
|
||||
// 5) 에러 메시지 직접 설정 (Validation 없이, 서버 오류 등)
|
||||
input.ErrorMessage = ""서버 오류가 발생했습니다."";
|
||||
input.ErrorMessage = """"; // 오류 제거
|
||||
|
||||
// 비활성화 / 읽기 전용
|
||||
input.IsEnabled = false;
|
||||
|
||||
// 읽기 전용
|
||||
input.isReadOnly = true;
|
||||
|
||||
// 여러 줄 입력
|
||||
input.multiline = true;",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
@@ -62,6 +118,9 @@ input.multiline = true;",
|
||||
<!-- 여러 줄 입력 -->
|
||||
<utk:UTKInputField label=""설명"" multiline=""true"" />
|
||||
|
||||
<!-- 에러 메시지 설정 (C#에서 Validation 설정 권장) -->
|
||||
<utk:UTKInputField label=""이메일"" error-message=""올바른 이메일 형식이 아닙니다."" />
|
||||
|
||||
<!-- 비활성화 -->
|
||||
<utk:UTKInputField label=""읽기전용"" is-enabled=""false"" value=""수정 불가"" />
|
||||
|
||||
@@ -70,21 +129,78 @@ input.multiline = true;",
|
||||
|
||||
private void InitializeIntegerFieldSample(VisualElement root)
|
||||
{
|
||||
// Validation - Range (1~150)
|
||||
var rangeField = root.Q<UTKIntegerField>("int-validation-range");
|
||||
if (rangeField != null)
|
||||
{
|
||||
rangeField.ErrorMessage = "나이는 1~150 사이여야 합니다.";
|
||||
rangeField.Validation = () => rangeField.Value >= 1 && rangeField.Value <= 150;
|
||||
}
|
||||
|
||||
// Validation - Positive Only
|
||||
var positiveField = root.Q<UTKIntegerField>("int-validation-positive");
|
||||
if (positiveField != null)
|
||||
{
|
||||
positiveField.ErrorMessage = "수량은 0보다 커야 합니다.";
|
||||
positiveField.Validation = () => positiveField.Value > 0;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("int-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var rangeValid = rangeField?.Validate() ?? true;
|
||||
var positiveValid = positiveField?.Validate() ?? true;
|
||||
var allValid = rangeValid && positiveValid;
|
||||
Debug.Log($"IntegerField Validation: {(allValid ? "All Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
rangeField?.ClearError();
|
||||
positiveField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 정수 필드
|
||||
var intField = new UTKIntegerField(""나이"");
|
||||
intField.Value = 25;
|
||||
intField.OnValueChanged += (value) => Debug.Log($""나이: {value}"");
|
||||
|
||||
// 범위 제한 (이벤트로 처리)
|
||||
intField.OnValueChanged += (value) =>
|
||||
{
|
||||
if (value < 0) intField.Value = 0;
|
||||
if (value > 150) intField.Value = 150;
|
||||
};
|
||||
|
||||
// 비활성화
|
||||
intField.IsEnabled = false;",
|
||||
intField.IsEnabled = false;
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
// 1) ErrorMessage + Validation 함수 설정
|
||||
var ageField = new UTKIntegerField(""나이"", 0);
|
||||
ageField.ErrorMessage = ""나이는 1~150 사이여야 합니다."";
|
||||
ageField.Validation = () => ageField.Value >= 1 && ageField.Value <= 150;
|
||||
// → FocusOut 또는 Enter 시 자동 검증
|
||||
// → 실패: 붉은 외곽선 + 에러 메시지 표시
|
||||
// → 통과: 에러 상태 자동 해제
|
||||
|
||||
// 2) 양수만 허용
|
||||
var qtyField = new UTKIntegerField(""수량"", 0);
|
||||
qtyField.ErrorMessage = ""수량은 0보다 커야 합니다."";
|
||||
qtyField.Validation = () => qtyField.Value > 0;
|
||||
|
||||
// 3) 강제 검증 호출 (폼 제출 버튼 등에서 사용)
|
||||
bool isValid = ageField.Validate(); // Validation 실행 + UI 업데이트
|
||||
if (!isValid) return;
|
||||
|
||||
// 4) 에러 수동 해제
|
||||
ageField.ClearError();
|
||||
|
||||
// 5) 에러 메시지 직접 설정 (Validation 없이, 서버 오류 등)
|
||||
intField.ErrorMessage = ""서버 오류가 발생했습니다."";
|
||||
intField.ErrorMessage = """"; // 오류 제거",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -102,6 +218,45 @@ intField.IsEnabled = false;",
|
||||
|
||||
private void InitializeLongFieldSample(VisualElement root)
|
||||
{
|
||||
// Validation - Range (0 ~ 1,000,000)
|
||||
var rangeField = root.Q<UTKLongField>("long-validation-range");
|
||||
if (rangeField != null)
|
||||
{
|
||||
rangeField.ErrorMessage = "파일 크기는 0 ~ 1,000,000 사이여야 합니다.";
|
||||
rangeField.Validation = () => rangeField.Value >= 0 && rangeField.Value <= 1000000;
|
||||
}
|
||||
|
||||
// Validation - Positive Only
|
||||
var positiveField = root.Q<UTKLongField>("long-validation-positive");
|
||||
if (positiveField != null)
|
||||
{
|
||||
positiveField.ErrorMessage = "개수는 0보다 커야 합니다.";
|
||||
positiveField.Validation = () => positiveField.Value > 0;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("long-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var rangeValid = rangeField?.Validate() ?? true;
|
||||
var positiveValid = positiveField?.Validate() ?? true;
|
||||
var allValid = rangeValid && positiveValid;
|
||||
Debug.Log($"LongField Validation: {(allValid ? "All Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
rangeField?.ClearError();
|
||||
positiveField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 Long 필드
|
||||
var longField = new UTKLongField(""파일 크기"");
|
||||
@@ -109,7 +264,19 @@ longField.Value = 1073741824; // 1GB
|
||||
longField.OnValueChanged += (value) => Debug.Log($""크기: {value} bytes"");
|
||||
|
||||
// 비활성화
|
||||
longField.IsEnabled = false;",
|
||||
longField.IsEnabled = false;
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
// 1) ErrorMessage + Validation 함수 설정
|
||||
var sizeField = new UTKLongField(""파일 크기"", 0);
|
||||
sizeField.ErrorMessage = ""파일 크기는 0 ~ 1,000,000 사이여야 합니다."";
|
||||
sizeField.Validation = () => sizeField.Value >= 0 && sizeField.Value <= 1000000;
|
||||
|
||||
// 2) 강제 검증 호출
|
||||
bool isValid = sizeField.Validate();
|
||||
|
||||
// 3) 에러 수동 해제
|
||||
sizeField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -127,21 +294,66 @@ longField.IsEnabled = false;",
|
||||
|
||||
private void InitializeFloatFieldSample(VisualElement root)
|
||||
{
|
||||
// Validation - Range (0 ~ 100)
|
||||
var rangeField = root.Q<UTKFloatField>("float-validation-range");
|
||||
if (rangeField != null)
|
||||
{
|
||||
rangeField.ErrorMessage = "속도는 0 ~ 100 사이여야 합니다.";
|
||||
rangeField.Validation = () => rangeField.Value >= 0f && rangeField.Value <= 100f;
|
||||
}
|
||||
|
||||
// Validation - Positive Only
|
||||
var positiveField = root.Q<UTKFloatField>("float-validation-positive");
|
||||
if (positiveField != null)
|
||||
{
|
||||
positiveField.ErrorMessage = "무게는 0보다 커야 합니다.";
|
||||
positiveField.Validation = () => positiveField.Value > 0f;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("float-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var rangeValid = rangeField?.Validate() ?? true;
|
||||
var positiveValid = positiveField?.Validate() ?? true;
|
||||
var allValid = rangeValid && positiveValid;
|
||||
Debug.Log($"FloatField Validation: {(allValid ? "All Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
rangeField?.ClearError();
|
||||
positiveField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 Float 필드
|
||||
var floatField = new UTKFloatField(""속도"");
|
||||
floatField.Value = 9.8f;
|
||||
floatField.OnValueChanged += (value) => Debug.Log($""속도: {value}"");
|
||||
|
||||
// 범위 제한 (이벤트로 처리)
|
||||
floatField.OnValueChanged += (value) =>
|
||||
{
|
||||
if (value < 0f) floatField.Value = 0f;
|
||||
if (value > 100f) floatField.Value = 100f;
|
||||
};
|
||||
|
||||
// 비활성화
|
||||
floatField.IsEnabled = false;",
|
||||
floatField.IsEnabled = false;
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
// 1) ErrorMessage + Validation 함수 설정
|
||||
var speedField = new UTKFloatField(""속도"", 0f);
|
||||
speedField.ErrorMessage = ""속도는 0 ~ 100 사이여야 합니다."";
|
||||
speedField.Validation = () => speedField.Value >= 0f && speedField.Value <= 100f;
|
||||
// → FocusOut 또는 Enter 시 자동 검증
|
||||
|
||||
// 2) 강제 검증 호출
|
||||
bool isValid = speedField.Validate();
|
||||
|
||||
// 3) 에러 수동 해제
|
||||
speedField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -159,6 +371,45 @@ floatField.IsEnabled = false;",
|
||||
|
||||
private void InitializeDoubleFieldSample(VisualElement root)
|
||||
{
|
||||
// Validation - Range (0.0 ~ 100.0)
|
||||
var rangeField = root.Q<UTKDoubleField>("double-validation-range");
|
||||
if (rangeField != null)
|
||||
{
|
||||
rangeField.ErrorMessage = "값은 0.0 ~ 100.0 사이여야 합니다.";
|
||||
rangeField.Validation = () => rangeField.Value >= 0.0 && rangeField.Value <= 100.0;
|
||||
}
|
||||
|
||||
// Validation - Positive Only
|
||||
var positiveField = root.Q<UTKDoubleField>("double-validation-positive");
|
||||
if (positiveField != null)
|
||||
{
|
||||
positiveField.ErrorMessage = "거리는 0보다 커야 합니다.";
|
||||
positiveField.Validation = () => positiveField.Value > 0.0;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("double-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var rangeValid = rangeField?.Validate() ?? true;
|
||||
var positiveValid = positiveField?.Validate() ?? true;
|
||||
var allValid = rangeValid && positiveValid;
|
||||
Debug.Log($"DoubleField Validation: {(allValid ? "All Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
rangeField?.ClearError();
|
||||
positiveField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 Double 필드
|
||||
var doubleField = new UTKDoubleField(""정밀도"");
|
||||
@@ -166,7 +417,20 @@ doubleField.Value = 3.141592653589793;
|
||||
doubleField.OnValueChanged += (value) => Debug.Log($""값: {value}"");
|
||||
|
||||
// 비활성화
|
||||
doubleField.IsEnabled = false;",
|
||||
doubleField.IsEnabled = false;
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
// 1) ErrorMessage + Validation 함수 설정
|
||||
var percentField = new UTKDoubleField(""퍼센트"", 0);
|
||||
percentField.ErrorMessage = ""값은 0.0 ~ 100.0 사이여야 합니다."";
|
||||
percentField.Validation = () => percentField.Value >= 0.0 && percentField.Value <= 100.0;
|
||||
// → FocusOut 또는 Enter 시 자동 검증
|
||||
|
||||
// 2) 강제 검증 호출
|
||||
bool isValid = percentField.Validate();
|
||||
|
||||
// 3) 에러 수동 해제
|
||||
percentField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -193,6 +457,39 @@ doubleField.IsEnabled = false;",
|
||||
disabledRow.Add(stepper);
|
||||
}
|
||||
|
||||
// Validation - Even Number Only
|
||||
UTKIntStepper? validationStepper = null;
|
||||
var validationRow = root.Q<VisualElement>("stepper-validation-row");
|
||||
if (validationRow != null)
|
||||
{
|
||||
validationStepper = new UTKIntStepper(0, 100, 1, 1);
|
||||
validationStepper.style.width = 150;
|
||||
validationStepper.ErrorMessage = "짝수만 입력 가능합니다.";
|
||||
validationStepper.Validation = () => validationStepper.Value % 2 == 0;
|
||||
validationRow.Add(validationStepper);
|
||||
validationStepper.Validate();
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("stepper-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationStepper?.Validate() ?? true;
|
||||
Debug.Log($"IntStepper Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationStepper?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var stepper = new UTKIntStepper(minValue: 0, maxValue: 100, value: 50, step: 1);
|
||||
@@ -213,7 +510,15 @@ disabledStepper.SetEnabled(false);
|
||||
stepper.Value = 75;
|
||||
stepper.MinValue = 10;
|
||||
stepper.MaxValue = 90;
|
||||
stepper.Step = 2;",
|
||||
stepper.Step = 2;
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var evenStepper = new UTKIntStepper(0, 100, 0, 1);
|
||||
evenStepper.ErrorMessage = ""짝수만 입력 가능합니다."";
|
||||
evenStepper.Validation = () => evenStepper.Value % 2 == 0;
|
||||
|
||||
bool isValid = evenStepper.Validate();
|
||||
evenStepper.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -232,6 +537,105 @@ stepper.Step = 2;",
|
||||
<!-- 커스텀 스타일 -->
|
||||
<utk:UTKIntStepper class=""custom-stepper"" style=""width: 150px;"" />
|
||||
|
||||
</ui:UXML>");
|
||||
}
|
||||
|
||||
private void InitializeFloatStepperSample(VisualElement root)
|
||||
{
|
||||
var disabledRow = root.Q<VisualElement>("float-stepper-disabled-row");
|
||||
if (disabledRow != null)
|
||||
{
|
||||
var stepper = new UTKFloatStepper(0f, 10f, 3.5f, 0.1f);
|
||||
stepper.style.width = 150;
|
||||
stepper.SetEnabled(false);
|
||||
disabledRow.Add(stepper);
|
||||
}
|
||||
|
||||
// Validation - Non-Zero
|
||||
UTKFloatStepper? validationStepper = null;
|
||||
var validationRow = root.Q<VisualElement>("float-stepper-validation-row");
|
||||
if (validationRow != null)
|
||||
{
|
||||
validationStepper = new UTKFloatStepper(0f, 10f, 0f, 0.1f);
|
||||
validationStepper.style.width = 150;
|
||||
validationStepper.ErrorMessage = "값은 0이 될 수 없습니다.";
|
||||
validationStepper.Validation = () => validationStepper.Value != 0f;
|
||||
validationRow.Add(validationStepper);
|
||||
validationStepper.Validate();
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("float-stepper-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationStepper?.Validate() ?? true;
|
||||
Debug.Log($"FloatStepper Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationStepper?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var stepper = new UTKFloatStepper(minValue: 0f, maxValue: 10f, initialValue: 5.5f, step: 0.1f);
|
||||
stepper.OnValueChanged += (newValue) => Debug.Log($""Value: {newValue}"");
|
||||
|
||||
// Step 설정
|
||||
var stepper05 = new UTKFloatStepper(0f, 10f, 2.5f, 0.5f); // Step 0.5씩 증감
|
||||
|
||||
// Wrap Around (최소/최대값에서 순환)
|
||||
var wrapStepper = new UTKFloatStepper(0f, 1f, 0.5f, 0.1f);
|
||||
wrapStepper.WrapAround = true; // 0.0 -> -0.1 시 1.0으로 순환
|
||||
|
||||
// 비활성화
|
||||
var disabledStepper = new UTKFloatStepper(0f, 10f, 3.5f, 0.1f);
|
||||
disabledStepper.SetEnabled(false);
|
||||
|
||||
// 속성 변경
|
||||
stepper.Value = 7.5f;
|
||||
stepper.MinValue = 1f;
|
||||
stepper.MaxValue = 9f;
|
||||
stepper.Step = 0.25f;
|
||||
|
||||
// 프로그래밍 방식으로 값 변경
|
||||
stepper.Increment(); // Step만큼 증가
|
||||
stepper.Decrement(); // Step만큼 감소
|
||||
stepper.SetValue(4.2f); // 직접 설정
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var nonZeroStepper = new UTKFloatStepper(0f, 10f, 0f, 0.1f);
|
||||
nonZeroStepper.ErrorMessage = ""값은 0이 될 수 없습니다."";
|
||||
nonZeroStepper.Validation = () => nonZeroStepper.Value != 0f;
|
||||
|
||||
bool isValid = nonZeroStepper.Validate();
|
||||
nonZeroStepper.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
<!-- Step 0.1 -->
|
||||
<utk:UTKFloatStepper min-value=""0"" max-value=""10"" value=""5.5"" step=""0.1"" />
|
||||
|
||||
<!-- Step 0.5 -->
|
||||
<utk:UTKFloatStepper min-value=""0"" max-value=""10"" value=""2.5"" step=""0.5"" />
|
||||
|
||||
<!-- Wrap Around -->
|
||||
<utk:UTKFloatStepper min-value=""0"" max-value=""1"" value=""0.5"" step=""0.1"" wrap-around=""true"" />
|
||||
|
||||
<!-- 비활성화 -->
|
||||
<utk:UTKFloatStepper min-value=""0"" max-value=""10"" value=""3.5"" step=""0.1"" is-enabled=""false"" />
|
||||
|
||||
<!-- 커스텀 스타일 -->
|
||||
<utk:UTKFloatStepper class=""custom-stepper"" style=""width: 150px;"" />
|
||||
|
||||
</ui:UXML>");
|
||||
}
|
||||
|
||||
@@ -243,6 +647,34 @@ stepper.Step = 2;",
|
||||
field.Value = new Vector2(100, 200);
|
||||
}
|
||||
|
||||
// Validation - Non-Zero
|
||||
var validationField = root.Q<UTKVector2Field>("vec2-validation");
|
||||
if (validationField != null)
|
||||
{
|
||||
validationField.ErrorMessage = "방향 벡터는 (0,0)이 될 수 없습니다.";
|
||||
validationField.Validation = () => validationField.Value != Vector2.zero;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("vec2-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationField?.Validate() ?? true;
|
||||
Debug.Log($"Vector2Field Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var positionField = new UTKVector2Field(""Position"");
|
||||
@@ -255,7 +687,15 @@ field.label = """";
|
||||
|
||||
// 읽기 전용
|
||||
var readOnlyField = new UTKVector2Field(""ReadOnly"");
|
||||
readOnlyField.SetEnabled(false);",
|
||||
readOnlyField.SetEnabled(false);
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var dirField = new UTKVector2Field(""Direction"");
|
||||
dirField.ErrorMessage = ""방향 벡터는 (0,0)이 될 수 없습니다."";
|
||||
dirField.Validation = () => dirField.Value != Vector2.zero;
|
||||
|
||||
bool isValid = dirField.Validate();
|
||||
dirField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -279,6 +719,34 @@ readOnlyField.SetEnabled(false);",
|
||||
field.Value = new Vector3(10, 20, 30);
|
||||
}
|
||||
|
||||
// Validation - Non-Zero
|
||||
var validationField = root.Q<UTKVector3Field>("vec3-validation");
|
||||
if (validationField != null)
|
||||
{
|
||||
validationField.ErrorMessage = "스케일 벡터는 (0,0,0)이 될 수 없습니다.";
|
||||
validationField.Validation = () => validationField.Value != Vector3.zero;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("vec3-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationField?.Validate() ?? true;
|
||||
Debug.Log($"Vector3Field Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var positionField = new UTKVector3Field(""Position"");
|
||||
@@ -291,7 +759,15 @@ rotationField.Value = new Vector3(0, 90, 0);
|
||||
|
||||
// 비활성화
|
||||
var disabledField = new UTKVector3Field(""Disabled"");
|
||||
disabledField.SetEnabled(false);",
|
||||
disabledField.SetEnabled(false);
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var scaleField = new UTKVector3Field(""Scale"");
|
||||
scaleField.ErrorMessage = ""스케일 벡터는 (0,0,0)이 될 수 없습니다."";
|
||||
scaleField.Validation = () => scaleField.Value != Vector3.zero;
|
||||
|
||||
bool isValid = scaleField.Validate();
|
||||
scaleField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -315,6 +791,42 @@ disabledField.SetEnabled(false);",
|
||||
field.Value = new Vector4(1, 0.5f, 0.25f, 1);
|
||||
}
|
||||
|
||||
// Validation - 0~1 Range (RGBA)
|
||||
var validationField = root.Q<UTKVector4Field>("vec4-validation");
|
||||
if (validationField != null)
|
||||
{
|
||||
validationField.Value = new Vector4(1, 0.5f, 0.25f, 1);
|
||||
validationField.ErrorMessage = "RGBA 값은 모두 0~1 사이여야 합니다.";
|
||||
validationField.Validation = () =>
|
||||
{
|
||||
var v = validationField.Value;
|
||||
return v.x >= 0f && v.x <= 1f &&
|
||||
v.y >= 0f && v.y <= 1f &&
|
||||
v.z >= 0f && v.z <= 1f &&
|
||||
v.w >= 0f && v.w <= 1f;
|
||||
};
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("vec4-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationField?.Validate() ?? true;
|
||||
Debug.Log($"Vector4Field Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var colorField = new UTKVector4Field(""Color"");
|
||||
@@ -328,7 +840,20 @@ quaternionField.Value = new Vector4(quat.x, quat.y, quat.z, quat.w);
|
||||
|
||||
// 비활성화
|
||||
var disabledField = new UTKVector4Field(""Disabled"");
|
||||
disabledField.SetEnabled(false);",
|
||||
disabledField.SetEnabled(false);
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var rgbaField = new UTKVector4Field(""RGBA"");
|
||||
rgbaField.ErrorMessage = ""RGBA 값은 모두 0~1 사이여야 합니다."";
|
||||
rgbaField.Validation = () =>
|
||||
{
|
||||
var v = rgbaField.Value;
|
||||
return v.x >= 0f && v.x <= 1f && v.y >= 0f && v.y <= 1f
|
||||
&& v.z >= 0f && v.z <= 1f && v.w >= 0f && v.w <= 1f;
|
||||
};
|
||||
|
||||
bool isValid = rgbaField.Validate();
|
||||
rgbaField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -352,6 +877,35 @@ disabledField.SetEnabled(false);",
|
||||
field.Value = new Rect(10, 20, 100, 50);
|
||||
}
|
||||
|
||||
// Validation - Positive Size
|
||||
var validationField = root.Q<UTKRectField>("rect-validation");
|
||||
if (validationField != null)
|
||||
{
|
||||
validationField.ErrorMessage = "Width와 Height는 0보다 커야 합니다.";
|
||||
validationField.Validation = () =>
|
||||
validationField.Value.width > 0 && validationField.Value.height > 0;
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("rect-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationField?.Validate() ?? true;
|
||||
Debug.Log($"RectField Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var areaField = new UTKRectField(""Area"");
|
||||
@@ -364,7 +918,16 @@ screenArea.Value = new Rect(0, 0, Screen.width, Screen.height);
|
||||
|
||||
// 비활성화
|
||||
var disabledField = new UTKRectField(""Disabled"");
|
||||
disabledField.SetEnabled(false);",
|
||||
disabledField.SetEnabled(false);
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var viewportField = new UTKRectField(""Viewport"");
|
||||
viewportField.ErrorMessage = ""Width와 Height는 0보다 커야 합니다."";
|
||||
viewportField.Validation = () =>
|
||||
viewportField.Value.width > 0 && viewportField.Value.height > 0;
|
||||
|
||||
bool isValid = viewportField.Validate();
|
||||
viewportField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
@@ -388,6 +951,38 @@ disabledField.SetEnabled(false);",
|
||||
field.Value = new Bounds(new Vector3(0, 1, 0), new Vector3(2, 2, 2));
|
||||
}
|
||||
|
||||
// Validation - Positive Extents
|
||||
var validationField = root.Q<UTKBoundsField>("bounds-validation");
|
||||
if (validationField != null)
|
||||
{
|
||||
validationField.ErrorMessage = "Extents는 모두 0보다 커야 합니다.";
|
||||
validationField.Validation = () =>
|
||||
{
|
||||
var ext = validationField.Value.extents;
|
||||
return ext.x > 0f && ext.y > 0f && ext.z > 0f;
|
||||
};
|
||||
}
|
||||
|
||||
// Validate All / Clear Errors 버튼
|
||||
var buttonRow = root.Q<VisualElement>("bounds-validation-button-row");
|
||||
if (buttonRow != null)
|
||||
{
|
||||
var validateBtn = new UTKButton("Validate All", variant: UTKButton.ButtonVariant.Primary);
|
||||
validateBtn.OnClicked += () =>
|
||||
{
|
||||
var isValid = validationField?.Validate() ?? true;
|
||||
Debug.Log($"BoundsField Validation: {(isValid ? "Passed" : "Has Errors")}");
|
||||
};
|
||||
buttonRow.Add(validateBtn);
|
||||
|
||||
var clearBtn = new UTKButton("Clear Errors");
|
||||
clearBtn.OnClicked += () =>
|
||||
{
|
||||
validationField?.ClearError();
|
||||
};
|
||||
buttonRow.Add(clearBtn);
|
||||
}
|
||||
|
||||
SetCodeSamples(root,
|
||||
csharpCode: @"// 기본 사용법
|
||||
var boundsField = new UTKBoundsField(""Bounds"");
|
||||
@@ -402,7 +997,19 @@ collisionField.Value = new Bounds(Vector3.zero, Vector3.one * 5);
|
||||
|
||||
// 비활성화
|
||||
var disabledField = new UTKBoundsField(""Disabled"");
|
||||
disabledField.SetEnabled(false);",
|
||||
disabledField.SetEnabled(false);
|
||||
|
||||
// ── Validation (입력 검증) ──────────────────────
|
||||
var colliderField = new UTKBoundsField(""Collider"");
|
||||
colliderField.ErrorMessage = ""Extents는 모두 0보다 커야 합니다."";
|
||||
colliderField.Validation = () =>
|
||||
{
|
||||
var ext = colliderField.Value.extents;
|
||||
return ext.x > 0f && ext.y > 0f && ext.z > 0f;
|
||||
};
|
||||
|
||||
bool isValid = colliderField.Validate();
|
||||
colliderField.ClearError();",
|
||||
uxmlCode: @"<!-- 네임스페이스 선언 -->
|
||||
<ui:UXML xmlns:utk=""UVC.UIToolkit"">
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ public partial class UTKStyleGuideSample : MonoBehaviour
|
||||
["UTKRectField"] = "UIToolkit/Sample/Input/UTKRectFieldSample",
|
||||
["UTKBoundsField"] = "UIToolkit/Sample/Input/UTKBoundsFieldSample",
|
||||
["UTKIntStepper"] = "UIToolkit/Sample/Input/UTKIntStepperSample",
|
||||
["UTKFloatStepper"] = "UIToolkit/Sample/Input/UTKFloatStepperSample",
|
||||
// Slider
|
||||
["UTKSlider"] = "UIToolkit/Sample/Slider/UTKSliderSample",
|
||||
["UTKSliderInt"] = "UIToolkit/Sample/Slider/UTKSliderIntSample",
|
||||
@@ -111,7 +112,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", "UTKIntStepper" },
|
||||
["Input"] = new[] { "UTKInputField", "UTKIntegerField", "UTKLongField", "UTKFloatField", "UTKDoubleField", "UTKVector2Field", "UTKVector3Field", "UTKVector4Field", "UTKRectField", "UTKBoundsField", "UTKIntStepper", "UTKFloatStepper" },
|
||||
["Slider"] = new[] { "UTKSlider", "UTKSliderInt", "UTKMinMaxSlider", "UTKProgressBar" },
|
||||
["Dropdown"] = new[] { "UTKDropdown", "UTKEnumDropDown", "UTKMultiSelectDropdown" },
|
||||
["Label"] = new[] { "UTKLabel", "UTKHelpBox" },
|
||||
@@ -451,6 +452,9 @@ public partial class UTKStyleGuideSample : MonoBehaviour
|
||||
case "UTKIntStepper":
|
||||
InitializeNumberStepperSample(root);
|
||||
break;
|
||||
case "UTKFloatStepper":
|
||||
InitializeFloatStepperSample(root);
|
||||
break;
|
||||
case "UTKVector2Field":
|
||||
InitializeVector2FieldSample(root);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user