#nullable enable using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using UnityEngine; using UnityEngine.UIElements; using UVC.UIToolkit; /// /// UTKStyleGuideSample의 Modal, Tab, Picker 카테고리 Initialize 메서드들 /// public partial class UTKStyleGuideSample { #region Tab Initializer private void InitializeTabViewSample(VisualElement root) { // Top Alignment (기본) var tabContainerTop = root.Q("tabview-top-container"); if (tabContainerTop != null) { var tabView = new UTKTabView(); tabView.Align = TabAlign.Top; tabView.style.width = 500; tabView.style.height = 200; tabView.AddUTKTab("일반", new Label("일반 설정 내용입니다.\n탭이 위쪽에 배치됩니다.")); tabView.AddUTKTab("고급", new Label("고급 설정 내용입니다.")); tabView.AddUTKTab("정보", new Label("정보 탭 내용입니다.")); tabContainerTop.Add(tabView); } // Bottom Alignment var tabContainerBottom = root.Q("tabview-bottom-container"); if (tabContainerBottom != null) { var tabView = new UTKTabView(); tabView.Align = TabAlign.Bottom; tabView.style.width = 500; tabView.style.height = 200; tabView.AddUTKTab("일반", new Label("일반 설정 내용입니다.\n탭이 아래쪽에 배치됩니다.")); tabView.AddUTKTab("고급", new Label("고급 설정 내용입니다.")); tabView.AddUTKTab("정보", new Label("정보 탭 내용입니다.")); tabContainerBottom.Add(tabView); } // Left Alignment var tabContainerLeft = root.Q("tabview-left-container"); if (tabContainerLeft != null) { var tabView = new UTKTabView(); tabView.Align = TabAlign.Left; tabView.style.width = 500; tabView.style.height = 200; tabView.AddUTKTab("일반", new Label("일반 설정 내용입니다.\n탭이 왼쪽에 세로로 배치됩니다.")); tabView.AddUTKTab("고급", new Label("고급 설정 내용입니다.")); tabView.AddUTKTab("정보", new Label("정보 탭 내용입니다.")); tabContainerLeft.Add(tabView); } // Right Alignment var tabContainerRight = root.Q("tabview-right-container"); if (tabContainerRight != null) { var tabView = new UTKTabView(); tabView.Align = TabAlign.Right; tabView.style.width = 500; tabView.style.height = 200; tabView.AddUTKTab("일반", new Label("일반 설정 내용입니다.\n탭이 오른쪽에 세로로 배치됩니다.")); tabView.AddUTKTab("고급", new Label("고급 설정 내용입니다.")); tabView.AddUTKTab("정보", new Label("정보 탭 내용입니다.")); tabContainerRight.Add(tabView); } SetCodeSamples(root, csharpCode: @"// 기본 사용법 (Top Alignment) var tabView = new UTKTabView(); tabView.Align = TabAlign.Top; // 기본값 tabView.style.width = 500; tabView.style.height = 200; // 탭 추가 tabView.AddUTKTab(""일반"", new Label(""일반 설정 내용"")); tabView.AddUTKTab(""고급"", new Label(""고급 설정 내용"")); tabView.AddUTKTab(""정보"", new Label(""정보 탭 내용"")); // Bottom Alignment - 탭이 아래쪽에 배치 var tabViewBottom = new UTKTabView(); tabViewBottom.Align = TabAlign.Bottom; tabViewBottom.AddUTKTab(""Tab 1"", new Label(""Content 1"")); // Left Alignment - 탭이 왼쪽에 세로로 배치 var tabViewLeft = new UTKTabView(); tabViewLeft.Align = TabAlign.Left; tabViewLeft.AddUTKTab(""Tab 1"", new Label(""Content 1"")); // Right Alignment - 탭이 오른쪽에 세로로 배치 var tabViewRight = new UTKTabView(); tabViewRight.Align = TabAlign.Right; tabViewRight.AddUTKTab(""Tab 1"", new Label(""Content 1"")); // 복잡한 콘텐츠 추가 var contentContainer = new VisualElement(); contentContainer.Add(new Label(""복잡한 콘텐츠"")); contentContainer.Add(new UTKButton(""버튼"")); tabView.AddUTKTab(""Tab 4"", contentContainer); // 탭 변경 이벤트 tabView.OnTabChanged += (index, tab) => { Debug.Log($""선택된 탭 인덱스: {index}""); }; // 프로그램으로 탭 선택 tabView.SelectedIndex = 1; // 두 번째 탭 선택 // 현재 선택된 탭 인덱스 var currentTab = tabView.SelectedIndex;", uxmlCode: @" "); } #endregion #region Modal Initializers private void InitializeAlertSample(VisualElement root) { if (_root == null) return; UTKAlert.SetRoot(_root); var btnInfo = root.Q("btn-info"); btnInfo?.RegisterCallback(_ => ShowInfoAlertAsync().Forget()); var btnSuccess = root.Q("btn-success"); btnSuccess?.RegisterCallback(_ => ShowSuccessAlertAsync().Forget()); var btnWarning = root.Q("btn-warning"); btnWarning?.RegisterCallback(_ => ShowWarningAlertAsync().Forget()); var btnError = root.Q("btn-error"); btnError?.RegisterCallback(_ => ShowErrorAlertAsync().Forget()); var btnConfirm = root.Q("btn-confirm"); btnConfirm?.RegisterCallback(_ => ShowConfirmAlertAsync().Forget()); var btnConfirmCustom = root.Q("btn-confirm-custom"); btnConfirmCustom?.RegisterCallback(_ => ShowConfirmCustomLabelsAsync().Forget()); var btnCallback = root.Q("btn-callback"); btnCallback?.RegisterCallback(_ => { UTKAlert.ShowInfo(_root, "Callback Style", "This uses callback instead of async.", onClose: () => Debug.Log("Alert closed via callback")); }); var btnConfirmCallback = root.Q("btn-confirm-callback"); btnConfirmCallback?.RegisterCallback(_ => { UTKAlert.ShowConfirm(_root, "Confirm", "Do you want to proceed?", onConfirm: () => Debug.Log("Confirmed via callback!"), onCancel: () => Debug.Log("Cancelled via callback!")); }); SetCodeSamples(root, csharpCode: @"// Root 설정 (한 번만) UTKAlert.SetRoot(rootVisualElement); // ======================================== // 1. Async/Await 방식 (권장) // ======================================== // Info Alert await UTKAlert.ShowInfoAsync(""정보"", ""이것은 정보 메시지입니다.""); // Success Alert await UTKAlert.ShowSuccessAsync(""성공"", ""작업이 성공적으로 완료되었습니다!""); // Warning Alert await UTKAlert.ShowWarningAsync(""경고"", ""주의가 필요합니다.""); // Error Alert await UTKAlert.ShowErrorAsync(""오류"", ""오류가 발생했습니다!""); // Confirm Dialog bool result = await UTKAlert.ShowConfirmAsync(""확인"", ""정말 진행하시겠습니까?""); if (result) { Debug.Log(""사용자가 확인을 눌렀습니다.""); } else { Debug.Log(""사용자가 취소를 눌렀습니다.""); } // Confirm with Custom Labels bool deleteResult = await UTKAlert.ShowConfirmAsync( ""항목 삭제"", ""이 항목을 정말 삭제하시겠습니까?"", confirmLabel: ""삭제"", cancelLabel: ""유지"" ); // closeOnBlockerClick 옵션 (배경 클릭 시 닫기) await UTKAlert.ShowInfoAsync(""정보"", ""배경을 클릭해도 닫힙니다."", closeOnBlockerClick: true); // ======================================== // 2. Callback 방식 // ======================================== // Info with Callback UTKAlert.ShowInfo(rootVisualElement, ""정보"", ""콜백 방식입니다."", onClose: () => Debug.Log(""Alert가 닫혔습니다."")); // Confirm with Callback UTKAlert.ShowConfirm(rootVisualElement, ""확인"", ""진행하시겠습니까?"", onConfirm: () => Debug.Log(""확인 클릭!""), onCancel: () => Debug.Log(""취소 클릭!""));"); } private async UniTaskVoid ShowInfoAlertAsync() { await UTKAlert.ShowInfoAsync("Information", "This is an info message."); Debug.Log("Info alert closed"); } private async UniTaskVoid ShowSuccessAlertAsync() { await UTKAlert.ShowSuccessAsync("Success", "Operation completed successfully!", closeOnBlockerClick: true); Debug.Log("Success alert closed"); } private async UniTaskVoid ShowWarningAlertAsync() { await UTKAlert.ShowWarningAsync("Warning", "This is a warning message."); Debug.Log("Warning alert closed"); } private async UniTaskVoid ShowErrorAlertAsync() { await UTKAlert.ShowErrorAsync("Error", "An error has occurred!"); Debug.Log("Error alert closed"); } private async UniTaskVoid ShowConfirmAlertAsync() { bool result = await UTKAlert.ShowConfirmAsync("Confirm", "Are you sure?"); Debug.Log(result ? "Confirmed!" : "Cancelled!"); } private async UniTaskVoid ShowConfirmCustomLabelsAsync() { bool result = await UTKAlert.ShowConfirmAsync("Delete Item", "Are you sure you want to delete this item?", confirmLabel: "Delete", cancelLabel: "Keep"); Debug.Log(result ? "Item deleted!" : "Item kept!"); } private void InitializeToastSample(VisualElement root) { var btnInfo = root.Q("btn-toast-info"); btnInfo?.RegisterCallback(_ => UTKToast.Show("This is an info toast!")); var btnSuccess = root.Q("btn-toast-success"); btnSuccess?.RegisterCallback(_ => UTKToast.ShowSuccess("Operation successful!")); var btnWarning = root.Q("btn-toast-warning"); btnWarning?.RegisterCallback(_ => UTKToast.ShowWarning("Warning: Check your input!")); var btnError = root.Q("btn-toast-error"); btnError?.RegisterCallback(_ => UTKToast.ShowError("An error occurred!")); SetCodeSamples(root, csharpCode: @"// Root 설정 (한 번만) UTKToast.SetRoot(rootVisualElement); // Info Toast (기본) UTKToast.Show(""이것은 정보 토스트입니다!""); // Success Toast UTKToast.ShowSuccess(""작업이 성공적으로 완료되었습니다!""); // Warning Toast UTKToast.ShowWarning(""경고: 입력값을 확인하세요!""); // Error Toast UTKToast.ShowError(""오류가 발생했습니다!""); // 지속 시간 설정 (밀리초) UTKToast.Show(""5초 동안 표시"", 5000); // 사용 예시 public async UniTask SaveDataAsync() { try { await SaveToServerAsync(); UTKToast.ShowSuccess(""데이터가 저장되었습니다.""); } catch (Exception ex) { UTKToast.ShowError($""저장 실패: {ex.Message}""); } }"); } private void InitializeTooltipSample(VisualElement root) { var btnShort = root.Q("btn-short-tooltip"); if (btnShort != null) { UTKTooltipManager.Instance.AttachTooltip(btnShort, "This is a short tooltip."); } var btnLong = root.Q("btn-long-tooltip"); if (btnLong != null) { UTKTooltipManager.Instance.AttachTooltip(btnLong, "This is a longer tooltip message that demonstrates how the tooltip handles multiple lines of text content."); } SetCodeSamples(root, csharpCode: @"// 1. 초기화 (앱 시작 시 한 번) UTKTooltipManager.Instance.Initialize(rootVisualElement); // 2. 버튼에 툴팁 연결 var saveButton = new UTKButton("""", UTKMaterialIcons.Save); UTKTooltipManager.Instance.AttachTooltip(saveButton, ""저장 (Ctrl+S)""); // 3. 다국어 키로 툴팁 연결 UTKTooltipManager.Instance.AttachTooltip(settingsButton, ""tooltip_settings""); // 4. 아이콘 버튼에 툴팁 var deleteBtn = new UTKButton("""", UTKMaterialIcons.Delete) { IconOnly = true }; UTKTooltipManager.Instance.AttachTooltip(deleteBtn, ""삭제""); // 5. 툴팁 업데이트 UTKTooltipManager.Instance.UpdateTooltip(button, ""새로운 설명""); // 6. 툴팁 제거 UTKTooltipManager.Instance.DetachTooltip(button); // 7. 즉시 표시 (특정 위치에) UTKTooltipManager.Instance.Show(""임시 정보"", new Vector2(100, 200)); // 8. 숨기기 UTKTooltipManager.Instance.Hide(); // 9. 여러 요소에 툴팁 연결 var buttons = new[] { btn1, btn2, btn3 }; var tooltips = new[] { ""버튼 1"", ""버튼 2"", ""버튼 3"" }; for (int i = 0; i < buttons.Length; i++) { UTKTooltipManager.Instance.AttachTooltip(buttons[i], tooltips[i]); }"); } #endregion #region Picker Initializers private void InitializeColorPickerSample(VisualElement root) { if (_root == null) return; _colorPreviewBox = root.Q("color-preview-box"); _colorHexLabel = root.Q