using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// ·Îº¿ ÇÁ·Î±×·¥(Job ÆÄÀÏ)ÀÇ »ý¼º, ¸ñ·Ï Á¶È¸, ¼±ÅÃ, ºÒ·¯¿À±â ±â´ÉÀ» ´ã´çÇÏ´Â UI ºä(View) Ŭ·¡½º /// °¡»ó ŰÆÐµå¸¦ ÅëÇÑ ÆÄÀϸí ÀÔ·Â, ½ºÅ©·Ñ ºä¿¡ ÆÄÀÏ ¸ñ·Ï Ç¥½Ã µîÀÇ UI ·ÎÁ÷À» ó¸®Çϸç, /// »ç¿ëÀÚÀÇ Áß¿ä ÀÔ·Â(»ý¼º, ·Îµå µî)À» À̺¥Æ®·Î Presenter¿¡°Ô Àü´Þ /// /// public class ProgramView : MonoBehaviour { // --- ÇÁ·Î±×·¥ ¸ñ·Ï ÆÐ³Î --- [Header("Panels")] [SerializeField] private GameObject programSelectPanel; // ÇÁ·Î±×·¥ °ü¸® Àüü ÃÖ»óÀ§ ÆÐ³Î [SerializeField] private GameObject programNewPanel; // '»õ ÇÁ·Î±×·¥ ¸¸µé±â' ÀÔ·Â È­¸é [SerializeField] private GameObject programListPanel; // 'ºÒ·¯¿À±â' ¸ñ·Ï È­¸é [Header("List View Components")] [SerializeField] private Transform programButtonContent; // ½ºÅ©·Ñ ºäÀÇ Content (¹öưµéÀÌ »ý¼ºµÉ À§Ä¡) [SerializeField] private GameObject programButtonPrefab; // ¸ñ·Ï¿¡ Ãß°¡µÉ °³º° ¹öư ÇÁ¸®ÆÕ [Header("Input UI")] [SerializeField] private TextMeshProUGUI programIdText; // ÀÔ·ÂµÈ ÇÁ·Î±×·¥ ID°¡ Ç¥½ÃµÉ ÅØ½ºÆ® [SerializeField] private Button[] numberPadButtons; // °¡»ó ŰÆÐµå ¼ýÀÚ ¹öư (0~9) [SerializeField] private Button backspaceButton; // Áö¿ì±â ¹öư [Header("Action Buttons")] [SerializeField] private Button createProgramButton; // »ý¼º È®ÀÎ ¹öư [SerializeField] private Button loadProgramButton; // ¸ñ·Ï ºÒ·¯¿À±â È­¸éÀ¸·Î Àüȯ ¹öư [SerializeField] private Button openProgramButton; // ¼±ÅÃÇÑ ÇÁ·Î±×·¥ ¿­±â ¹öư [SerializeField] private Button closeProgramListButton; // ¸ñ·Ï ´Ý±â(µÚ·Î °¡±â) ¹öư // --- Presenter¿¡°Ô º¸³¾ À̺¥Æ® (User Events) --- /// »õ ÇÁ·Î±×·¥ »ý¼º ¿äû (ÀÎÀÚ: ÀÔ·ÂµÈ ID) public event Action OnCreateProgramClicked; /// ÀúÀåµÈ ÇÁ·Î±×·¥ ¸ñ·Ï µ¥ÀÌÅÍ ¿äû public event Action OnLoadProgramListRequested; /// ¸ñ·Ï¿¡¼­ ƯÁ¤ ÇÁ·Î±×·¥À» ¼±ÅÃÇÔ (ÀÎÀÚ: ¼±ÅÃµÈ ID) public event Action OnProgramSelectedToLoad; /// ¼±ÅÃµÈ ÇÁ·Î±×·¥À» ½ÇÁ¦·Î ¿­±â ¿äû public event Action OnOpenProgramClicked; void Start() { loadProgramButton.onClick.AddListener(() => OnLoadProgramListRequested?.Invoke()); openProgramButton.onClick.AddListener(() => OnOpenProgramClicked?.Invoke()); for (int i = 0; i < numberPadButtons.Length; i++) { string number = numberPadButtons[i].GetComponentInChildren().text; numberPadButtons[i].onClick.AddListener(() => AppendToInput(number)); } backspaceButton.onClick.AddListener(HandleBackspace); createProgramButton.onClick.AddListener(HandleCreateClick); closeProgramListButton.onClick.AddListener(HideProgramList); programSelectPanel.SetActive(true); programNewPanel.SetActive(true); programListPanel.SetActive(false); SetprogramIdTextEmpty(); } /// /// ÀÔ·Â ÅØ½ºÆ® Çʵ带 ÃʱâÈ­ /// public void SetprogramIdTextEmpty() { programIdText.text = string.Empty; } /// /// °¡»ó ŰÆÐµå ÀԷ ó¸®: ¼ýÀÚ¸¦ ÅØ½ºÆ® µÚ¿¡ ºÙÀÓ /// (ÃÖ´ë 4ÀÚ¸®±îÁö¸¸ ÀÔ·Â °¡´ÉÇϵµ·Ï Á¦ÇÑ) /// private void AppendToInput(string number) { if (programIdText.text.Length < 4) { programIdText.text += number; } } /// /// °¡»ó ŰÆÐµå Áö¿ì±â ó¸®: ¸¶Áö¸· ±ÛÀÚ¸¦ Áö¿ò /// private void HandleBackspace() { if (programIdText.text.Length > 0) { programIdText.text = programIdText.text.Substring(0, programIdText.text.Length - 1); } } /// /// '»ý¼º' ¹öư Ŭ¸¯ ½Ã Presenter¿¡°Ô ÀÔ·ÂµÈ ID¿Í ÇÔ²² À̺¥Æ®¸¦ º¸³¿ /// private void HandleCreateClick() { string inputId = programIdText.text; OnCreateProgramClicked?.Invoke(inputId); } /// /// ¿À·ù ¸Þ½ÃÁö³ª ½Ã½ºÅÛ ¸Þ½ÃÁö¸¦ ·Î±×·Î Ç¥½Ã /// public void ShowMessage(string message) { Debug.LogWarning(message); } /// /// ÇÁ·Î±×·¥ ·Îµå ¼º°ø ½Ã ·Î±×¸¦ Ãâ·Â /// public void DisplayProgram(string programId) { if (programId == null) { Debug.Log("No Program Loaded"); return; } Debug.Log($"¿¬°áµÈ ÇÁ·Î±×·¥: {programId}"); } /// /// Presenter·ÎºÎÅÍ ¹ÞÀº ÇÁ·Î±×·¥ ID ¸ñ·ÏÀ» ½ºÅ©·Ñ ºä¿¡ ¹öư ÇüÅ·Πǥ½Ã /// /// Ç¥½ÃÇÒ ÇÁ·Î±×·¥ À̸§ ¸®½ºÆ® public void ShowProgramList(List programIds) { foreach (Transform child in programButtonContent) { Destroy(child.gameObject); } programIds.Sort(); foreach (string id in programIds) { GameObject buttonGO = Instantiate(programButtonPrefab, programButtonContent); TextMeshProUGUI buttonText = buttonGO.GetComponentInChildren(); if (buttonText != null) { buttonText.text = id; } Button button = buttonGO.GetComponent