#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.");
}
}
}
}