using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.InputSystem; using UnityEngine.UI; namespace DDD { public class RestaurantManagementUi : PopupUi, IEventHandler { [SerializeField] private InventoryView _inventoryView; [SerializeField] private ItemDetailView _itemDetailView; [SerializeField] private CommonTabGroupUi _sectionTabs; [SerializeField] private CommonTabGroupUi _menuCategoryTabs; [SerializeField] private CommonTabGroupUi _cookwareCategoryTabs; [SerializeField] private Image _completeBatchFilledImage; [SerializeField] private float _holdCompleteTime = 1f; private float _elapsedTime; private bool _isHolding; protected override void Update() { base.Update(); if (_isHolding) { if (_holdCompleteTime <= 0f) { _elapsedTime = 0f; HandleInteract2Canceled(); var evt = GameEvents.OpenPopupUiEvent; evt.UiType = typeof(ConfirmUi); evt.IsCancelButtonVisible = true; evt.NewMessageKey = "Global_Message_001"; evt.OnConfirm = ClosePanel; EventBus.Broadcast(evt); return; } _completeBatchFilledImage.fillAmount = _elapsedTime; var multiply = 1f / _holdCompleteTime; if (_elapsedTime >= 1f) { // TODO : 추후에 체크리스트와 비교해서 팝업 띄울지 말지 결정 HandleInteract2Canceled(); var evt = GameEvents.OpenPopupUiEvent; evt.UiType = typeof(ConfirmUi); evt.IsCancelButtonVisible = true; evt.NewMessageKey = "Global_Message_001"; evt.OnConfirm = ClosePanel; EventBus.Broadcast(evt); return; } _elapsedTime += Time.deltaTime * multiply; } } protected override GameObject GetInitialSelected() { var inventoryViewInitialSelectedObject = _inventoryView.GetInitialSelected(); if (inventoryViewInitialSelectedObject) return inventoryViewInitialSelectedObject; var menuCategoryFirstButton = _menuCategoryTabs.GetFirstInteractableButton(); if (menuCategoryFirstButton != null && menuCategoryFirstButton.activeInHierarchy) { return menuCategoryFirstButton; } var cookwareCategoryFirstButton = _cookwareCategoryTabs.GetFirstInteractableButton(); if (cookwareCategoryFirstButton != null && cookwareCategoryFirstButton.activeInHierarchy) { return cookwareCategoryFirstButton; } return null; } public async override void Open(OpenPopupUiEvent evt) { base.Open(evt); await _inventoryView.Initialize(); // 각 그룹별로 허용된 카테고리 설정 SetupCategoryTabs(); _sectionTabs.Initialize(OnSectionTabSelected); _menuCategoryTabs.Initialize(OnCategoryTabSelected); _cookwareCategoryTabs.Initialize(OnCategoryTabSelected); _sectionTabs.SelectFirstTab(); _menuCategoryTabs.SelectFirstTab(); EventBus.Register(this); } /// /// 각 그룹별로 허용된 카테고리를 설정합니다. /// private void SetupCategoryTabs() { // 각 그룹별로 기본 허용 값 사용 (자동으로 적절한 카테고리 필터링) _menuCategoryTabs.UseDefaultAllowedValues(); _cookwareCategoryTabs.UseDefaultAllowedValues(); } public override void Close() { base.Close(); EventBus.Unregister(this); } protected override bool OnInputPerformed(RestaurantUiActions actionEnum, InputAction.CallbackContext context) { if (base.OnInputPerformed(actionEnum, context) == false) return false; switch (actionEnum) { case RestaurantUiActions.Cancel: HandleCancelPerformed(); break; case RestaurantUiActions.PreviousTab: HandleMoveTabPerformed(-1); break; case RestaurantUiActions.NextTab: HandleMoveTabPerformed(1); break; case RestaurantUiActions.Interact1: HandleInteract1Performed(); break; case RestaurantUiActions.Interact2: HandleInteract2Performed(); break; } return true; } protected override bool OnInputCanceled(RestaurantUiActions actionEnum, InputAction.CallbackContext context) { if (base.OnInputPerformed(actionEnum, context) == false) return false; switch (actionEnum) { case RestaurantUiActions.Interact2: HandleInteract2Canceled(); break; } return true; } private void HandleCancelPerformed() { Close(); } private void HandleMoveTabPerformed(int direction) { _sectionTabs.Move(direction); } private void HandleInteract1Performed() { var selected = EventSystem.current.currentSelectedGameObject; var interactable = selected?.GetComponent(); interactable?.OnInteract(); } private void HandleInteract2Performed() { _isHolding = true; } private void HandleInteract2Canceled() { _isHolding = false; _elapsedTime = 0f; _completeBatchFilledImage.fillAmount = 0f; } private void OnSectionTabSelected(int sectionValue) { var section = (SectionButtonType)sectionValue; switch (section) { case SectionButtonType.Menu: _menuCategoryTabs.SelectFirstTab(); break; case SectionButtonType.Cookware: _cookwareCategoryTabs.SelectFirstTab(); break; default: throw new ArgumentOutOfRangeException(nameof(section), section, null); } } private void OnCategoryTabSelected(int categoryValue) { var category = (InventoryCategoryType)categoryValue; _inventoryView.UpdateCategoryView(category); _itemDetailView.UpdateCategory(category); } public void Invoke(TodayMenuRemovedEvent evt) { _menuCategoryTabs.SelectTab((int)evt.InventoryCategoryType); } } }