using Cysharp.Threading.Tasks;
using UVC.Locale;
namespace UVC.UI.Modal
{
///
/// ๐ ๋ชจ๋ฌ ์ฐฝ์ ์ด๋ค ๋ด์ฉ์ ๋ณด์ฌ์ค์ง, ์ด๋ป๊ฒ ํ๋ํ ์ง ์ ํ๋ '๋ ์ํผ' ๋๋ '์ฃผ๋ฌธ์' ๊ฐ์ ์น๊ตฌ์์.
/// ์ด ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ Modal.Open()์ ์ ๋ฌํ๋ฉด, ์ฌ๊ธฐ์ ์ ํ ๋๋ก ๋ชจ๋ฌ ์ฐฝ์ด ๋ง๋ค์ด์ ธ์.
/// ์ปค์คํ
๋ชจ๋ฌ ์ฐฝ์ ๋ง๋ค ๋๋ ModalView๋ฅผ ์์๋ฐ์์ Prefab์ผ๋ก ๋ง๋ค๊ณ ModalContent ์์ฑ์์ Prefab ๊ฒฝ๋ก๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
///
///
///
/// // "MyAwesomeModalPrefab"์ด๋ผ๋ ๋์์ธ์ ์ฌ์ฉํ๋ ๋ชจ๋ฌ์ ์ํ ๋ ์ํผ๋ฅผ ๋ง๋ค์ด์.
/// var myRecipe = new ModalContent("Prefabs/UI/MyAwesomeModalPrefab")
/// {
/// Title = "์๋ก์ด ๋ชจํ!", // ๋ชจ๋ฌ ์ฐฝ ์ ๋ชฉ
/// Message = "๋ชจํ์ ์์ํ ์ค๋น๊ฐ ๋์๋์?", // ๋ชจ๋ฌ ์ฐฝ ๋ฉ์์ง
/// ConfirmButtonText = "๋ค, ๊ฐ์๋ค!", // ํ์ธ ๋ฒํผ ๊ธ์
/// ShowCancelButton = false // ์ทจ์ ๋ฒํผ์ ์ ๋ณด์ฌ์ค๋์.
/// };
///
/// // ์ด๋ ๊ฒ ๋ง๋ ๋ ์ํผ(myRecipe)๋ฅผ Modal.Open()์ ์ ๋ฌํ๋ฉด ๋ชจ๋ฌ์ด ๋ฟ
๋ํ๋์!
/// // bool userChoseConfirm = await Modal.Open(myRecipe);
///
///
public class ModalContent
{
///
/// ๐ท๏ธ ๋ชจ๋ฌ ์ฐฝ์ ์ ๋ชฉ์ด์์. ์ฌ๊ธฐ์ ๊ธ์๋ฅผ ์ ์ผ๋ฉด ๋ชจ๋ฌ ์ฐฝ ๋งจ ์์ ํฌ๊ฒ ๋ณด์ฌ์.
/// ์: "์๋ฆผ", "๊ฒ์ ์ ์ฅ", "์น๊ตฌ ์์ฒญ"
///
public string Title { get; set; } = "";
///
/// ๐ฌ ๋ชจ๋ฌ ์ฐฝ์ ๋ณด์ฌ์ค ์ฃผ์ ๋ฉ์์ง ๋ด์ฉ์ด์์. ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ๊ณ ์ถ์ ๋ง์ ์ฌ๊ธฐ์ ์ ์ด์.
/// ์: "๊ฒ์ ์ค์ ์ ์ ์ฅํ์ต๋๋ค.", "์ ๋ง๋ก ์์ดํ
์ ๊ตฌ๋งคํ์๊ฒ ์ด์?"
///
public string Message { get; set; } = "";
private string _confirmButtonText = "ํ์ธ";
///
/// โ
'ํ์ธ' ๋ฒํผ์ ๋ณด์ฌ์ค ๊ธ์์์.
/// ํน๋ณํ ์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก "ํ์ธ" (๋๋ ์ค์ ๋ ์ธ์ด์ ๋ง๊ฒ)์ด๋ผ๊ณ ๋์์.
/// ์ง์ "๋ค", "์ ์ฅํ๊ธฐ", "์ถ๋ฐ!" ์ฒ๋ผ ์ํ๋ ๊ธ์๋ก ๋ฐ๊ฟ ์ ์์ด์.
/// ๋ค๊ตญ์ด ํค๋ฅผ ์ฌ์ฉํด์ ์ค์ ํ ์๋ ์์ด์. (์: "ui_button_confirm", "action_ok")
///
public string ConfirmButtonText
{
get
{
// _confirmButtonText๊ฐ ๋ช
์์ ์ผ๋ก ์ค์ ๋์ง ์์๊ณ , LocalizationManager ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ฒ์ญ๋ ๋ฌธ์์ด์ ๋ฐํ
if (string.IsNullOrEmpty(_confirmButtonText) && LocalizationManager.Instance != null)
{
return LocalizationManager.Instance.GetString(_confirmButtonText);
}
// ๋ช
์์ ์ผ๋ก ์ค์ ๋ ๊ฐ์ด ์๊ฑฐ๋ LocalizationManager๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ํด๋น ๊ฐ ๋๋ ๊ธฐ๋ณธ ํค ๋ฐํ
return _confirmButtonText;
}
set => _confirmButtonText = value;
}
private string _cancelButtonText = "์ทจ์";
///
/// โ '์ทจ์' ๋ฒํผ์ ๋ณด์ฌ์ค ๊ธ์์์.
/// ํน๋ณํ ์ ํด์ฃผ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก "์ทจ์" (๋๋ ์ค์ ๋ ์ธ์ด์ ๋ง๊ฒ)์ด๋ผ๊ณ ๋์์.
/// ์ง์ "์๋์", "๋ซ๊ธฐ", "๋์ค์" ์ฒ๋ผ ์ํ๋ ๊ธ์๋ก ๋ฐ๊ฟ ์ ์์ด์.
/// ๋ค๊ตญ์ด ํค๋ฅผ ์ฌ์ฉํด์ ์ค์ ํ ์๋ ์์ด์. (์: "ui_button_cancel", "action_no")
///
public string CancelButtonText
{
get
{
// _cancelButtonText๊ฐ ๋ช
์์ ์ผ๋ก ์ค์ ๋์ง ์์๊ณ , LocalizationManager ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋ฒ์ญ๋ ๋ฌธ์์ด์ ๋ฐํ
if (string.IsNullOrEmpty(_cancelButtonText) && LocalizationManager.Instance != null)
{
return LocalizationManager.Instance.GetString(_cancelButtonText);
}
// ๋ช
์์ ์ผ๋ก ์ค์ ๋ ๊ฐ์ด ์๊ฑฐ๋ LocalizationManager๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ฉด ํด๋น ๊ฐ ๋๋ ๊ธฐ๋ณธ ํค ๋ฐํ
return _cancelButtonText;
}
set => _cancelButtonText = value;
}
///
/// ๐ 'ํ์ธ' ๋ฒํผ์ ํ๋ฉด์ ๋ณด์ฌ์ค์ง ๋ง์ง ๊ฒฐ์ ํด์. (๊ธฐ๋ณธ๊ฐ: true, ๋ณด์ฌ์ค)
/// false๋ก ๋ฐ๊พธ๋ฉด 'ํ์ธ' ๋ฒํผ์ด ์ฌ๋ผ์ ธ์.
///
public bool ShowConfirmButton { get; set; } = true;
///
/// ๐ '์ทจ์' ๋ฒํผ์ ํ๋ฉด์ ๋ณด์ฌ์ค์ง ๋ง์ง ๊ฒฐ์ ํด์. (๊ธฐ๋ณธ๊ฐ: true, ๋ณด์ฌ์ค)
/// false๋ก ๋ฐ๊พธ๋ฉด '์ทจ์' ๋ฒํผ์ด ์ฌ๋ผ์ ธ์.
///
public bool ShowCancelButton { get; set; } = true;
///
/// ๐ '๋ซ๊ธฐ' ๋ฒํผ์ ํ๋ฉด์ ๋ณด์ฌ์ค์ง ๋ง์ง ๊ฒฐ์ ํด์. (๊ธฐ๋ณธ๊ฐ: true, ๋ณด์ฌ์ค)
/// false๋ก ๋ฐ๊พธ๋ฉด '๋ซ๊ธฐ' ๋ฒํผ์ด ์ฌ๋ผ์ ธ์.
///
public bool ShowCloseButton { get; set; } = true;
///
/// ๐จ ๋ชจ๋ฌ ์ฐฝ์ '๋์์ธ ๋๋ฉด' ํ์ผ์ด ์ด๋ ์๋์ง ์๋ ค์ฃผ๋ ๊ฒฝ๋ก์์.
/// Unity ์๋ํฐ์์ ๋ง๋ค์ด๋ ํ๋ฆฌํน(Prefab) ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ ์ด์ค์ผ ํด์.
/// ์: "Prefabs/UI/MyCustomModal"
///
public string PrefabPath { get; private set; }
///
/// ๐งโ๐ณ ModalContent ๋ ์ํผ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด์์. (์์ฑ์)
/// ๋ชจ๋ฌ ์ฐฝ์ ์ด๋ค ๋์์ธ์ผ๋ก ๋ง๋ค์ง ์๋ ค์ค์ผ ํด์.
///
/// ์ฌ์ฉํ ๋ชจ๋ฌ ์ฐฝ ๋์์ธ(ํ๋ฆฌํน) ํ์ผ์ ๊ฒฝ๋ก์์.
///
///
/// // "CommonModalPrefab" ๋์์ธ์ ์ฌ์ฉํ๋ ๋ ์ํผ ๋ง๋ค๊ธฐ
/// var content = new ModalContent("Prefabs/UI/CommonModalPrefab");
/// content.Title = "์๋ด";
/// content.Message = "์ด๊ฒ์ ์ผ๋ฐ์ ์ธ ์๋ด ๋ชจ๋ฌ์
๋๋ค.";
///
///
public ModalContent(string prefabPath)
{
PrefabPath = prefabPath;
// Title, Message ๋ฑ ๋ค๋ฅธ ํ
์คํธ ์์ฑ๋ ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๊ธฐ๋ณธ ๋ค๊ตญ์ด ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
// ์: Title = LocalizationManager.Instance.GetString("default_modal_title");
}
///
/// ๐ ๋ชจ๋ฌ ์ฐฝ์ด ํ๋ฉด์ ๋ํ๋๊ธฐ *์ง์ *์ ์ด ๋ ์ํผ๊ฐ ํ ์ผ์ ์ ํด์. (๋น๋๊ธฐ ์์
๊ฐ๋ฅ)
/// ์๋ฅผ ๋ค์ด, ๋ชจ๋ฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ค๊ฑฐ๋ ํน๋ณํ ์ค๋น๋ฅผ ํ ์ ์์ด์.
/// `ModalView.OnOpen()` ๋ณด๋ค ๋จผ์ ํธ์ถ๋ผ์.
///
///
/// ์ด ๋ฉ์๋๋ฅผ ์์๋ฐ์์ ํน๋ณํ ์ค๋น ์์
์ ์ถ๊ฐํ ์ ์์ด์:
///
/// public class MySpecialModalContent : ModalContent
/// {
/// public MySpecialModalContent(string prefabPath) : base(prefabPath) { }
///
/// public override async UniTask OnOpen()
/// {
/// await base.OnOpen(); // ๋ถ๋ชจ ํด๋์ค์ OnOpen๋ ํธ์ถํด์ฃผ๋ ๊ฒ ์ข์์.
/// ULog.Debug("๋๋ง์ ํน๋ณํ ๋ชจ๋ฌ ๋ด์ฉ ์ค๋น ์์!");
/// // ์: await LoadSomeDataForTheModal();
/// ULog.Debug("๋๋ง์ ํน๋ณํ ๋ชจ๋ฌ ๋ด์ฉ ์ค๋น ์๋ฃ!");
/// }
/// }
///
///
public virtual async UniTask OnOpen()
{
// ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์๋ฌด๊ฒ๋ ํ์ง ์์์. ํ์ํ๋ฉด ์์๋ฐ์์ ๋ด์ฉ์ ์ฑ์์ฃผ์ธ์!
//ULog.Debug($"[ModalContent] '{Title}' OnOpen called.");
await UniTask.CompletedTask;
}
///
/// ๐ฌ ๋ชจ๋ฌ ์ฐฝ์ด ํ๋ฉด์์ ์ฌ๋ผ์ง๊ธฐ *์ง์ *์ ์ด ๋ ์ํผ๊ฐ ํ ์ผ์ ์ ํด์. (๋น๋๊ธฐ ์์
๊ฐ๋ฅ)
/// ์๋ฅผ ๋ค์ด, ๋ชจ๋ฌ์์ ์ฌ์ฉํ๋ ์์์ ์ ๋ฆฌํ๊ฑฐ๋ ํน๋ณํ ๋ง๋ฌด๋ฆฌ๋ฅผ ํ ์ ์์ด์.
/// `ModalView.OnClose()` ๋ณด๋ค ๋จผ์ ํธ์ถ๋ผ์.
///
///
/// ์ด ๋ฉ์๋๋ฅผ ์์๋ฐ์์ ํน๋ณํ ๋ง๋ฌด๋ฆฌ ์์
์ ์ถ๊ฐํ ์ ์์ด์:
///
/// public class MySpecialModalContent : ModalContent
/// {
/// public MySpecialModalContent(string prefabPath) : base(prefabPath) { }
///
/// // ... OnOpen ์ฌ์ ์ ...
///
/// public override async UniTask OnClose()
/// {
/// ULog.Debug("๋๋ง์ ํน๋ณํ ๋ชจ๋ฌ ๋ด์ฉ ๋ง๋ฌด๋ฆฌ ์์!");
/// // ์: await ReleaseSomeDataUsedInModal();
/// ULog.Debug("๋๋ง์ ํน๋ณํ ๋ชจ๋ฌ ๋ด์ฉ ๋ง๋ฌด๋ฆฌ ์๋ฃ!");
/// await base.OnClose(); // ๋ถ๋ชจ ํด๋์ค์ OnClose๋ ํธ์ถํด์ฃผ๋ ๊ฒ ์ข์์.
/// }
/// }
///
///
public virtual async UniTask OnClose()
{
// ๊ธฐ๋ณธ์ ์ผ๋ก๋ ์๋ฌด๊ฒ๋ ํ์ง ์์์. ํ์ํ๋ฉด ์์๋ฐ์์ ๋ด์ฉ์ ์ฑ์์ฃผ์ธ์!
//ULog.Debug($"[ModalContent] '{Title}' OnClose called.");
await UniTask.CompletedTask;
}
}
}