using System;
using System.Collections.Generic;
using Cielonos.MainGame.Inventory;
using Sirenix.OdinInspector;
using SLSUtilities.UI;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Cielonos.MainGame.UI
{
///
/// 机械台 UI 页面。
/// 左侧为可选装备列表(Selector),右侧为物品详情面板(ItemDetailPanel)。
/// 玩家点击列表条目选中物品,点击 Confirm 确认获取。
///
public class MechanicalTableUIPage : UIPageBase
{
[Title("Selectors")]
public GameObject selectorPrefab;
public RectTransform selectorContainer;
public List selectors = new List();
[Title("Detail Panel")]
public ItemDetailPanel itemDetailPanel;
[Title("Buttons")]
public Button confirmButton;
public Button closeButton;
private MechanicalTableSelector currentSelected;
private Action onConfirmCallback;
/// 当前选中的 Selector 索引,-1 表示未选中。
public int SelectedIndex => currentSelected != null ? selectors.IndexOf(currentSelected) : -1;
protected override void Start()
{
base.Start();
if (confirmButton != null)
{
confirmButton.onClick.AddListener(OnConfirmClicked);
}
if (closeButton != null)
{
closeButton.onClick.AddListener(OnCloseClicked);
}
}
///
/// 用物品预制体列表填充选择器,并注册确认回调。
/// 每次调用会清除旧选择器并重新生成。
///
/// 物品预制体列表,每个预制体必须包含 ItemBase 组件。
/// 玩家点击 Confirm 后的回调,参数为选中的物品索引。
public void SetOffers(List itemPrefabs, Action onConfirm)
{
onConfirmCallback = onConfirm;
ClearSelectors();
if (itemPrefabs == null) return;
for (int i = 0; i < itemPrefabs.Count; i++)
{
GameObject prefab = itemPrefabs[i];
if (prefab == null) continue;
ItemBase itemComponent = prefab.GetComponent();
if (itemComponent == null)
{
Debug.LogWarning($"[MechanicalTableUIPage] 预制体 '{prefab.name}' 缺少 ItemBase 组件,已跳过。");
continue;
}
MechanicalTableSelector selector = CreateSelector();
selector.Setup(itemComponent);
}
// 重置选中状态
currentSelected = null;
RefreshConfirmButton();
// 详情面板默认隐藏
if (itemDetailPanel != null)
{
itemDetailPanel.ClearPanel();
}
}
///
/// 由 MechanicalTableSelector 调用,选中指定的选择器。
///
public void SelectItem(MechanicalTableSelector selector)
{
if (selector == null || !selectors.Contains(selector)) return;
// 取消上一个选中
if (currentSelected != null)
{
currentSelected.SetSelected(false);
}
// 设置新选中
currentSelected = selector;
currentSelected.SetSelected(true);
// 更新详情面板
if (itemDetailPanel != null)
{
itemDetailPanel.SetItem(currentSelected.item);
}
// 启用确认按钮
RefreshConfirmButton();
}
protected override void OnPageOpened()
{
RefreshConfirmButton();
}
protected override void OnPageClosed()
{
currentSelected = null;
onConfirmCallback = null;
}
private void OnConfirmClicked()
{
if (currentSelected == null) return;
int index = SelectedIndex;
if (index < 0) return;
// 先缓存回调,因为 Close() 会清除引用
Action callback = onConfirmCallback;
Close();
callback?.Invoke(index);
}
private void OnCloseClicked()
{
Close();
}
private MechanicalTableSelector CreateSelector()
{
if (selectorPrefab == null || selectorContainer == null)
{
Debug.LogError("[MechanicalTableUIPage] selectorPrefab 或 selectorContainer 未配置。");
return null;
}
GameObject obj = Instantiate(selectorPrefab, selectorContainer);
MechanicalTableSelector selector = obj.GetComponent();
if (selector == null)
{
Debug.LogError("[MechanicalTableUIPage] selectorPrefab 缺少 MechanicalTableSelector 组件。");
Destroy(obj);
return null;
}
selectors.Add(selector);
return selector;
}
private void ClearSelectors()
{
foreach (MechanicalTableSelector selector in selectors)
{
if (selector != null)
{
Destroy(selector.gameObject);
}
}
selectors.Clear();
currentSelected = null;
}
private void RefreshConfirmButton()
{
if (confirmButton != null)
{
confirmButton.interactable = currentSelected != null;
}
}
}
}