using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; using CommanderAILab.Models; namespace CommanderAILab.UI { /// /// A single token row in TokenPanelController's list. /// Supports qty +/-, tap all, counter editing, and removal. /// public class TokenRowView : MonoBehaviour { [Header("Labels")] [SerializeField] private TMP_Text nameLabel; [SerializeField] private TMP_Text ptLabel; [SerializeField] private TMP_Text qtyLabel; [SerializeField] private TMP_Text tappedLabel; [Header("Buttons")] [SerializeField] private Button qtyPlusBtn; [SerializeField] private Button qtyMinusBtn; [SerializeField] private Button tapAllBtn; [SerializeField] private Button deleteBtn; [Header("Counter Editor")] [SerializeField] private GameObject counterEditorPanel; [SerializeField] private TMP_Dropdown counterTypeDropdown; [SerializeField] private Button counterAddBtn; [SerializeField] private Button counterRemoveBtn; [SerializeField] private TMP_Text counterSummaryLabel; [SerializeField] private Button toggleCounterEditorBtn; private static readonly List CounterTypes = new() { "+1/+1", "-1/-1", "loyalty", "charge", "quest", "time" }; private TokenModel _token; private Action _onDelete; // ── Binding ─────────────────────────────────────────── public void Bind(TokenModel token, Action onDelete) { _token = token; _onDelete = onDelete; // Wire buttons qtyPlusBtn ?.onClick.AddListener(() => AdjustQty(+1)); qtyMinusBtn?.onClick.AddListener(() => AdjustQty(-1)); tapAllBtn ?.onClick.AddListener(TapAll); deleteBtn ?.onClick.AddListener(() => _onDelete?.Invoke(_token)); toggleCounterEditorBtn?.onClick.AddListener(ToggleCounterEditor); counterAddBtn ?.onClick.AddListener(() => AdjustCounter(+1)); counterRemoveBtn?.onClick.AddListener(() => AdjustCounter(-1)); // Populate counter type dropdown if (counterTypeDropdown != null) { counterTypeDropdown.ClearOptions(); counterTypeDropdown.AddOptions(CounterTypes); } if (counterEditorPanel) counterEditorPanel.SetActive(false); RefreshDisplay(); } // ── Actions ──────────────────────────────────────────── private void AdjustQty(int delta) { _token.qty = Mathf.Max(0, _token.qty + delta); if (_token.qty == 0) { _onDelete?.Invoke(_token); return; } RefreshDisplay(); } private void TapAll() { _token.isTapped = !_token.isTapped; RefreshDisplay(); } private void ToggleCounterEditor() { if (counterEditorPanel) counterEditorPanel.SetActive(!counterEditorPanel.activeSelf); } private void AdjustCounter(int delta) { if (counterTypeDropdown == null) return; string counterType = CounterTypes[Mathf.Clamp(counterTypeDropdown.value, 0, CounterTypes.Count - 1)]; _token.counters.TryGetValue(counterType, out int current); int next = Mathf.Max(0, current + delta); if (next == 0) _token.counters.Remove(counterType); else _token.counters[counterType] = next; RefreshDisplay(); } // ── Display ──────────────────────────────────────────── private void RefreshDisplay() { if (nameLabel) nameLabel.text = _token.name; if (ptLabel) ptLabel.text = _token.PTString; if (qtyLabel) qtyLabel.text = $"×{_token.qty}"; if (tappedLabel) tappedLabel.text = _token.isTapped ? "[Tapped]" : ""; // Counter summary if (counterSummaryLabel) { var parts = new System.Text.StringBuilder(); foreach (var kv in _token.counters) parts.Append($"{kv.Key}:{kv.Value} "); counterSummaryLabel.text = parts.Length > 0 ? parts.ToString().Trim() : "No counters"; } } } }