using System; using System.ComponentModel; using UnityEngine; public partial class MateListRow : EScrCell, IOnRecieveIntent { static MateListRow _hasSelectedSlotRow; [SerializeField] SlotUI[] slotUIs; MonoBehaviour intent; SlotUI selected; public MateData SelectedMateData => selected?.mateData; public override void InitCell() { for(int i = 0; i < slotUIs.Length; ++i) { slotUIs[i].SetActiveSelectedIndicator(false); } } public override void RefreshCellView() { intent = null; DeselectCurrent(); } public override void SetData(int rowIndex) { const int columnCount = 4; var row = MateDataGroup.Instance.GetMateDataMatrix(columnCount)[rowIndex]; int i; for (i = 0; i < row.Count; ++i) { var mateData = row[i]; if (mateData is null || slotUIs.Length <= i) continue; slotUIs[i].SetMateData(mateData); if (_hasSelectedSlotRow is null) { _hasSelectedSlotRow = this; selected = slotUIs[i]; SelectCurrent(); var _parms = new object[] { this, false }; intent?.SendMessage(nameof(MateSettingView.OnClickedListSlot), _parms); } } for (; i < slotUIs.Length; ++i) slotUIs[i].SetMateData(null); SelectCurrent(); } public void OnClickSlot(int index) { selected = slotUIs[index]; SelectCurrent(); var _parms = new object[] { this, true }; intent?.SendMessage(nameof(MateSettingView.OnClickedListSlot), _parms); } public void SelectCurrent() { if (selected is null) return; _hasSelectedSlotRow = this; selected.SetActiveSelectedIndicator(true); } public void DeselectCurrent() { selected?.SetActiveSelectedIndicator(false); selected = null; _hasSelectedSlotRow = null; } public void OnRecieveIntent(object intent) => this.intent = intent as MonoBehaviour; } public partial class MateListRow : EScrCell { [Serializable] public class SlotUI { public ObjectIndicator indicator; public GameObject unlockIndicator; public GameObject settedIndicator; public GameObject selectedIndicator; public MateData mateData { get; private set; } public void SetMateData(MateData mateData) { if(this.mateData != null) this.mateData.PropertyChanged -= HandlePropertyChanged; this.mateData = mateData; if(mateData != null) { mateData.SetIndicator(indicator); unlockIndicator?.gameObject.SetActive(!mateData.IsUnlocked); settedIndicator?.gameObject.SetActive(mateData.IsSetted); mateData.PropertyChanged += HandlePropertyChanged; } else { indicator?.gameObject.SetActive(false); } } public void SetActiveSelectedIndicator(bool active) { selectedIndicator?.gameObject.SetActive(active); } private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e) { if(e.PropertyName == nameof(MateData.IsUnlocked)) unlockIndicator?.SetActive(!mateData.IsUnlocked); else if(e.PropertyName == nameof(MateData.IsSetted)) settedIndicator?.SetActive(mateData.IsSetted); } } }