using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.Localization; using UnityEngine.Localization.Components; using UnityEngine.UI; namespace DDD.Restaurant { public sealed class ItemDetailSnapshot { public Sprite BackgroundSprite { get; } public bool ShowTastePanel { get; } public bool ShowCookwarePanel { get; } public Sprite CookwareSprite { get; } public LocalizedString Name { get; } public LocalizedString Description { get; } public IReadOnlyList Tastes { get; } public Material TasteMaterial { get; } public ItemDetailSnapshot( Sprite backgroundSprite, bool showTastePanel, bool showCookwarePanel, Sprite cookwareSprite, LocalizedString name, LocalizedString description, IReadOnlyList tastes, Material tasteMaterial) { BackgroundSprite = backgroundSprite; ShowTastePanel = showTastePanel; ShowCookwarePanel = showCookwarePanel; CookwareSprite = cookwareSprite; Name = name; Description = description; Tastes = tastes; TasteMaterial = tasteMaterial; } public static readonly ItemDetailSnapshot Empty = new( backgroundSprite: null, showTastePanel: false, showCookwarePanel: false, cookwareSprite: null, name: null, description: null, tastes: System.Array.Empty(), tasteMaterial: null); } public class ItemDetailView : MonoBehaviour, IUiView, IEventHandler { [SerializeField] private Image _viewImage; [SerializeField] private LocalizeStringEvent _nameLocalizeStringEvent; [SerializeField] private LocalizeStringEvent _descriptionLocalizeStringEvent; [SerializeField] private Transform _cookWarePanel; [SerializeField] private Image _cookwareImage; [SerializeField] private Transform _tasteHashTagPanel; [SerializeField] private RectTransform _tasteHashTagContent1; [SerializeField] private HorizontalLayoutGroup _tasteHashTagContentLayoutGroup; [SerializeField] private RectTransform _tasteHashTagContent2; private RestaurantManagementViewModel _viewModel; private void OnDestroy() { EventBus.Unregister(this); } public void Initialize(RestaurantManagementViewModel viewModel) { _viewModel = viewModel; _cookwareImage.sprite = null; _nameLocalizeStringEvent.OnUpdateString.Invoke(string.Empty); _descriptionLocalizeStringEvent.OnUpdateString.Invoke(string.Empty); EventBus.Register(this); } public void SetupBindings(BindingContext bindingContext) { BindingHelper.BindImage(bindingContext, _viewImage, viewModel => viewModel.ItemDetail.BackgroundSprite); BindingHelper.BindImage(bindingContext, _cookwareImage, viewModel => viewModel.ItemDetail.CookwareSprite); BindingHelper.BindActive(bindingContext, _tasteHashTagPanel.gameObject, viewModel => viewModel.ItemDetail.ShowTastePanel); BindingHelper.BindActive(bindingContext, _cookWarePanel.gameObject, viewModel => viewModel.ItemDetail.ShowCookwarePanel); BindingHelper.BindLocalizedStringEvent(bindingContext, _nameLocalizeStringEvent, viewModel => viewModel.ItemDetail.Name); BindingHelper.BindLocalizedStringEvent(bindingContext, _descriptionLocalizeStringEvent, viewModel => viewModel.ItemDetail.Description); } public void OnOpenedEvents() { UpdateView(); _viewModel.OnCategoryChanged += HandleCategoryChanged; } public void OnClosedEvents() { if (_viewModel) { _viewModel.OnCategoryChanged -= HandleCategoryChanged; } } public void UpdateView() { if (_viewModel.SelectedItem == null) { ClearHashTags(); return; } UpdateTasteHashTags(); } private void UpdateTasteHashTags() { ClearHashTags(); var tastes = _viewModel.GetTastes(); if (tastes == null || tastes.Count == 0) return; var material = _viewModel.GetTasteMaterial(); float maxWidth = _tasteHashTagContent1.rect.width; float currentLineWidth = 0f; foreach (var taste in tastes) { var instance = _viewModel.CreateHashTag(_tasteHashTagContent1); instance.Initialize(material, taste); LayoutRebuilder.ForceRebuildLayoutImmediate(instance.RectTransform); float w = instance.RectTransform.rect.width; if (currentLineWidth + w > maxWidth) { instance.transform.SetParent(_tasteHashTagContent2, false); currentLineWidth = w + _tasteHashTagContentLayoutGroup.spacing; } else { currentLineWidth += w + _tasteHashTagContentLayoutGroup.spacing; } } LayoutRebuilder.ForceRebuildLayoutImmediate(_tasteHashTagContent1); LayoutRebuilder.ForceRebuildLayoutImmediate(_tasteHashTagContent2); } public void HandleCategoryChanged(InventoryCategoryType category) { Canvas.ForceUpdateCanvases(); } private void ClearHashTags() { Utils.DestroyAllChildren(_tasteHashTagContent1); Utils.DestroyAllChildren(_tasteHashTagContent2); } public void HandleEvent(ItemSlotSelectedEvent evt) { _viewModel.SetSelectedItem(evt.Model); UpdateView(); } } }