using UnityEngine;
using UnityEngine.UI;
using BaseGames.Input;
namespace BaseGames.UI.Settings
{
///
/// 按键重绑定面板(架构 04_InputModule §6)。
/// 统一管理所有 RebindActionRow;协调"同时只有一行处于重绑定状态"的排他锁;
/// 提供"重置全部"按钮;绑定完成后自动持久化。
/// 挂载路径:Canvas_Overlay → SettingsPanel → KeybindingTab → RebindPanel
///
public class RebindPanel : MonoBehaviour
{
[SerializeField] private InputReaderSO _inputReader;
[SerializeField] private RebindActionRow[] _rows; // Inspector 配置,顺序对应 UI 布局
[SerializeField] private Button _resetAllButton;
[SerializeField] private ConflictDetector _conflictDetector;
// ── 生命周期 ──────────────────────────────────────────────────────
private void Awake()
{
_resetAllButton?.onClick.AddListener(OnResetAll);
if (_rows == null) return;
foreach (var row in _rows)
row.Initialize(_inputReader, _conflictDetector, OnRebindRequested);
}
// ── 供 RebindActionRow 反查行列表 ─────────────────────────────────
/// 返回此面板管理的所有行(供 RebindActionRow 刷新冲突高亮时遍历)。
public RebindActionRow[] GetRows() => _rows;
// ── 内部逻辑 ──────────────────────────────────────────────────────
/// 由 RebindActionRow 点击时回调;实现排他锁(同时只允许一行重绑定)。
private void OnRebindRequested(RebindActionRow requestingRow)
{
// 禁用其他所有行,防止并发重绑定操作
if (_rows != null)
foreach (var row in _rows)
row.SetInteractable(row == requestingRow);
requestingRow.StartRebind(onFinished: () =>
{
// 重绑定完成(或取消)→ 恢复所有行可交互 → 持久化
if (_rows != null)
foreach (var row in _rows)
row.SetInteractable(true);
_inputReader?.SaveBindingOverrides();
});
}
/// "重置全部"按钮回调:恢复默认绑定并刷新所有行显示。
private void OnResetAll()
{
_inputReader?.ResetBindings();
if (_rows != null)
foreach (var row in _rows)
row.RefreshDisplay();
}
}
}