using System; 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 TabGroupUi _sectionTabs; [SerializeField] private TabGroupUi _menuCategoryTabs; [SerializeField] private TabGroupUi _cookwareCategoryTabs; [SerializeField] private Image _completeBatchFilledImage; [SerializeField] private float _holdCompleteTime = 1f; private float _elapsedTime; private bool _isHolding; protected override void Update() { base.Update(); if (_isHolding) { _completeBatchFilledImage.fillAmount = _elapsedTime; var multiply = _holdCompleteTime / 1f; 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); //HandleCancelPerformed(); return; } _elapsedTime += Time.deltaTime * multiply; } } protected override GameObject GetInitialSelected() { var inventoryViewInitialSelectedObject = _inventoryView.GetInitialSelected(); if (inventoryViewInitialSelectedObject) return inventoryViewInitialSelectedObject; if (_menuCategoryTabs.GetFirstInteractableButton.activeInHierarchy) { return _menuCategoryTabs.GetFirstInteractableButton; } return _cookwareCategoryTabs.GetFirstInteractableButton; } public async override void Open(OpenPopupUiEvent evt) { base.Open(evt); await _inventoryView.Initialize(); _sectionTabs.Initialize(OnSectionTabSelected); _menuCategoryTabs.Initialize(OnCategoryTabSelected); _cookwareCategoryTabs.Initialize(OnCategoryTabSelected); _sectionTabs.SelectFirstTab(); _menuCategoryTabs.SelectFirstTab(); EventBus.Register(this); } 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(RestaurantManagementSectionType section) { switch (section) { case RestaurantManagementSectionType.Menu: _menuCategoryTabs.SelectFirstTab(); break; case RestaurantManagementSectionType.Cookware: _cookwareCategoryTabs.SelectFirstTab(); break; default: throw new ArgumentOutOfRangeException(nameof(section), section, null); } // TODO : 추후 Menu, Cookware, Worker에 맞춰 다른 콘텐츠 노출 처리 } private void OnCategoryTabSelected(InventoryCategoryType category) { _inventoryView.UpdateCategoryView(category); _itemDetailView.UpdateCategory(category); } public void Invoke(TodayMenuRemovedEvent evt) { InventoryCategoryType newInventoryCategoryType = evt.RecipeType switch { RecipeType.FoodRecipe => InventoryCategoryType.Food, RecipeType.DrinkRecipe => InventoryCategoryType.Drink, _ => InventoryCategoryType.None }; if (newInventoryCategoryType == InventoryCategoryType.None) return; _menuCategoryTabs.SelectTab(newInventoryCategoryType); } } }