#nullable enable using Cysharp.Threading.Tasks; using System.Collections.Generic; using UnityEngine; using UVC.Data; using UVC.Data.Core; using UVC.UI.List.Draggable; using UVC.UI.Tab; namespace UVC.Factory.Modal.Settings { /// /// 객체 속성 순서 및 표시 설정 탭 콘텐츠 /// public class DisplayDataOrderTabContent : MonoBehaviour, ITabContent { [SerializeField] private DraggableList? draggableList; private string key = string.Empty; private DataObject? totalData = null; private UserSetting? viewData = null; public void Start() { if (draggableList == null) { Debug.LogError("DraggableList 컴포넌트가 설정되지 않았습니다."); return; } draggableList.OnOrderChanged += OnOrderChanged; draggableList.OnChangedItemData += OnChangedItemData; } public void SetContentData(object? data) { Debug.Log($"DisplayDataOrderTabContent.SetContentData: {data}"); if (data is string key) { this.key = key; IDataObject? dataObject = DataRepository.Instance.GetData(key); if (dataObject != null) { if (dataObject is DataArray dataArray) { if (dataArray.Count > 0) totalData = dataArray[0]; } else if (dataObject is DataObject dataObject1) { totalData = dataObject1; } } if (totalData != null) { viewData = UserSetting.Get(key); //저장 되 있는 데이터가 없으면 전체 아이템을 체크된 상태로 추가 if (viewData == null) { viewData = UserSetting.FromDataObject(totalData); UserSetting.AddSetting(key, viewData!); } List dataList = new List(); //저장된 데이터가 있으면 체크된 상태로 추가 foreach (var item in totalData) { bool isChecked = viewData!.ContainsKey(item.Key); dataList.Add(new ConfigDataOrderListItemData(item.Key, (isChecked ? viewData[item.Key].ToString() : item.Key), isChecked)); } //드래그 가능한 리스트에 데이터 설정 draggableList?.SetData(dataList); } } } private void OnOrderChanged(ListItemData data, int oldIndex, int newIndex) { Debug.Log($"OnOrderChanged: {data.Id} from {oldIndex} to {newIndex}"); UpdateData(); } private void OnChangedItemData(ListItemData data) { Debug.Log($"OnChangedItemData: {data.Id} - {data.DisplayName}"); UpdateData(); } /// /// 탭 콘텐츠에 데이터를 전달합니다. /// /// 전달할 데이터 객체 private void UpdateData() { Debug.Log($"UpdateData: draggableList != null:{draggableList != null}, viewData != null:{viewData != null}, configKey:{key}"); if (draggableList != null && viewData != null && key.Length > 0) { viewData.Clear(); foreach (var item in draggableList.DataList) { if (item is ConfigDataOrderListItemData listItemData) { if (listItemData.isChecked) { viewData[listItemData.Id] = listItemData.DisplayName; } } } Debug.Log($"UpdateData: {key} - {viewData.ToJsonString()} items"); UserSetting.AddSetting(key, viewData); } } /// /// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨 /// /// 전달할 데이터 객체 public void UpdateContentData(object? data) { Debug.Log($"DisplayDataOrderTabContent.UpdateContentData: {data}"); } /// /// 닫힐 때 실행되는 로직을 처리합니다. /// /// 비동기 닫기 작업을 나타내는 입니다. public UniTask OnCloseAsync() { return UniTask.CompletedTask; } void OnDestroy() { if (draggableList != null) { draggableList.OnOrderChanged -= OnOrderChanged; draggableList.OnChangedItemData -= OnChangedItemData; } } } public class ConfigDataOrderListItemData : ListItemData { public bool isChecked = true; public ConfigDataOrderListItemData(string id, string displayName, bool isChecked) : base(id, displayName) { this.isChecked = isChecked; } } }