#nullable enable using Cysharp.Threading.Tasks; using System; using System.Threading.Tasks; using TMPro; using UnityEngine; using UVC.Core; using UVC.Studio.Config; using UVC.UI.Tab; namespace UVC.Studio.Modal.Settings { public class SettingDatabaseTabContent : MonoBehaviour, ITabContent { [SerializeField] private TMP_InputField? ipTxt; [SerializeField] private TMP_InputField? portTxt; [SerializeField] private TMP_InputField? idTxt; [SerializeField] private TMP_InputField? pwTxt; private Setting? setting; private bool changedValue = false; // Tab 키 포커스 이동을 위한 InputField 배열 private TMP_InputField?[] inputFields = null!; /// /// 탭 콘텐츠에 데이터를 전달합니다. /// /// 전달할 데이터 객체 public async void SetContentData(object? data) { if (setting == null) { // 동적으로 로드되는 Prefab이므로 [Inject]가 자동으로 동작하지 않음 await InjectorAppContext.Instance.WaitForInitializationAsync(); setting = InjectorAppContext.Instance.Get(); } if (setting != null) { changedValue = false; DatabaseSetting database = setting.Data.database; if (ipTxt != null) { ipTxt.text = database.ip; ipTxt.onEndEdit.AddListener((value) => { setting.Data.database.ip = value; changedValue = true; }); } if (portTxt != null) { portTxt.text = database.port.ToString(); portTxt.onEndEdit.AddListener((value) => { if (int.TryParse(value, out int intValue)) { setting.Data.database.port = intValue; changedValue = true; } }); } if (idTxt != null) { idTxt.text = database.id; idTxt.onEndEdit.AddListener((value) => { setting.Data.database.id = value; changedValue = true; }); } if (pwTxt != null) { pwTxt.text = database.password; pwTxt.onEndEdit.AddListener((value) => { setting.Data.database.password = value; changedValue = true; }); } // Tab 키 포커스 이동을 위한 배열 초기화 inputFields = new TMP_InputField?[] { ipTxt, portTxt, idTxt, pwTxt }; } } private void Update() { // Tab 키 입력 처리 if (Input.GetKeyDown(KeyCode.Tab) && inputFields != null) { int currentIndex = GetCurrentFocusedIndex(); if (currentIndex >= 0) { int nextIndex = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift) ? (currentIndex - 1 + inputFields.Length) % inputFields.Length // Shift+Tab: 이전 : (currentIndex + 1) % inputFields.Length; // Tab: 다음 if (inputFields[nextIndex] != null) { inputFields[nextIndex]!.Select(); } } } } private int GetCurrentFocusedIndex() { if (inputFields == null) return -1; for (int i = 0; i < inputFields.Length; i++) { if (inputFields[i] != null && inputFields[i]!.isFocused) { return i; } } return -1; } /// /// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨 /// /// 전달할 데이터 객체 public void UpdateContentData(object? data) { if (data != null && data is string content) { Debug.Log($"UpdateContentData: {content}"); } } /// /// 닫힐 때 실행되는 로직을 처리합니다. /// /// 비동기 닫기 작업을 나타내는 입니다. public async UniTask OnCloseAsync() { if (ipTxt != null) ipTxt.onEndEdit.RemoveAllListeners(); if (portTxt != null) portTxt.onEndEdit.RemoveAllListeners(); if (idTxt != null) idTxt.onEndEdit.RemoveAllListeners(); if (pwTxt != null) pwTxt.onEndEdit.RemoveAllListeners(); Debug.Log($"SettingDatabaseTabContent OnCloseAsync: changedValue={changedValue} setting == null:{setting == null}"); if (changedValue && setting != null) { await setting.SaveAsync(); Debug.Log("Database settings saved."); } } } }