156 lines
5.4 KiB
C#
156 lines
5.4 KiB
C#
#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
|
|
{
|
|
/// <summary>
|
|
/// 객체 속성 순서 및 표시 설정 탭 콘텐츠
|
|
/// </summary>
|
|
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<ConfigDataOrderListItemData> dataList = new List<ConfigDataOrderListItemData>();
|
|
|
|
//저장된 데이터가 있으면 체크된 상태로 추가
|
|
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<ConfigDataOrderListItemData>(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();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 탭 콘텐츠에 데이터를 전달합니다.
|
|
/// </summary>
|
|
/// <param name="data">전달할 데이터 객체</param>
|
|
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);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 탭 전환 시 데이터가 있는 경우 전달 되는 데이터. SetContentData 이후 호출 됨
|
|
/// </summary>
|
|
/// <param name="data">전달할 데이터 객체</param>
|
|
public void UpdateContentData(object? data)
|
|
{
|
|
Debug.Log($"DisplayDataOrderTabContent.UpdateContentData: {data}");
|
|
}
|
|
|
|
/// <summary>
|
|
/// 닫힐 때 실행되는 로직을 처리합니다.
|
|
/// </summary>
|
|
/// <returns>비동기 닫기 작업을 나타내는 <see cref="UniTask"/>입니다.</returns>
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|