ProjectDDD/Assets/_DDD/_Scripts/GameUi/RestaurantManagementUi/RestaurantManagementUi.cs
2025-08-05 14:14:39 +09:00

187 lines
6.4 KiB
C#

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.UI;
namespace DDD
{
public class RestaurantManagementUi : PopupUi<RestaurantUiActions>, IEventHandler<TodayMenuRemovedEvent>
{
[SerializeField] private InventoryView _inventoryView;
[SerializeField] private ItemDetailView _itemDetailView;
[SerializeField] private TabGroupUi<RestaurantManagementSectionType> _sectionTabs;
[SerializeField] private TabGroupUi<InventoryCategoryType> _menuCategoryTabs;
[SerializeField] private TabGroupUi<InventoryCategoryType> _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<TodayMenuRemovedEvent>(this);
}
public override void Close()
{
base.Close();
EventBus.Unregister<TodayMenuRemovedEvent>(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<IInteractableUi>();
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);
}
}
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);
}
}
}