디자인 적용
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UVC.UI.Tab;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class AlarmSettingTabContent : MonoBehaviour, ITabContent
|
||||
{
|
||||
|
||||
public void SetContentData(object? data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public UniTask OnCloseAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c12e6348aba465a49947b665316b4bd2
|
||||
@@ -0,0 +1,20 @@
|
||||
#nullable enable
|
||||
using UVC.UI.Commands;
|
||||
using UVC.UI.Modal;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class DisplayDataOrderCommand : ICommand
|
||||
{
|
||||
public async void Execute(object? parameter = null)
|
||||
{
|
||||
FactoryCameraController.Instance.Enable = false; // 카메라 컨트롤러 비활성화
|
||||
var modalContent = new ModalContent("Prefabs/UI/Modal/UIConfigInfoModal")
|
||||
{
|
||||
Title = "사용자 표시 정보"
|
||||
};
|
||||
await UVC.UI.Modal.Modal.Open<object>(modalContent);
|
||||
FactoryCameraController.Instance.Enable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b26aea301133d1a44a8dee6f130ceb47
|
||||
@@ -0,0 +1,72 @@
|
||||
#nullable enable
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UVC.UI.List.Draggable;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class DisplayDataOrderListItemView : ListItemView
|
||||
{
|
||||
[Header("UI 추가 요소 연결")]
|
||||
[SerializeField]
|
||||
[Tooltip("사용 유무를 선택 할 Toggle")]
|
||||
protected Toggle? toggle;
|
||||
|
||||
[SerializeField]
|
||||
[Tooltip("아이템의 제목을 표시할 TMP_InputField 컴포넌트")]
|
||||
protected TMP_InputField? inputText;
|
||||
|
||||
public void Start()
|
||||
{
|
||||
if (toggle != null)
|
||||
{
|
||||
toggle.onValueChanged.AddListener(OnToggleValueChanged);
|
||||
}
|
||||
|
||||
if (inputText != null)
|
||||
{
|
||||
inputText.onValueChanged.AddListener(OnInputTextChanged);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnInputTextChanged(string text)
|
||||
{
|
||||
if (boundData != null)
|
||||
{
|
||||
boundData.DisplayName = text;
|
||||
OnChangeData?.Invoke(boundData);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnToggleValueChanged(bool isChecked)
|
||||
{
|
||||
if (boundData is ConfigDataOrderListItemData itemData)
|
||||
{
|
||||
itemData.isChecked = isChecked;
|
||||
OnChangeData?.Invoke(itemData);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void UpdateUI()
|
||||
{
|
||||
base.UpdateUI();
|
||||
// IListItemData 인터페이스를 구현한 경우
|
||||
if (boundData != null)
|
||||
{
|
||||
if(inputText != null) inputText.text = boundData.DisplayName;
|
||||
if(toggle != null) toggle.isOn = boundData is ConfigDataOrderListItemData itemData && itemData.isChecked;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDestroy()
|
||||
{
|
||||
base.OnDestroy();
|
||||
if (toggle != null) toggle.onValueChanged.RemoveListener(OnToggleValueChanged);
|
||||
if (inputText != null)
|
||||
{
|
||||
inputText.onValueChanged.RemoveListener(OnInputTextChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 667639696f2a8f8469935c70e98d8e29
|
||||
@@ -0,0 +1,64 @@
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UVC.Data;
|
||||
using UVC.Data.Core;
|
||||
using UVC.UI.Modal;
|
||||
using UVC.UI.Tab;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class DisplayDataOrderModal : ModalView
|
||||
{
|
||||
[SerializeField]
|
||||
public TabController tabController; // 탭 컨트롤러
|
||||
|
||||
/// <summary>
|
||||
/// 모달이 열릴 때 호출됩니다. (비동기)
|
||||
/// </summary>
|
||||
/// <param name="content">모달에 표시할 내용/설정</param>
|
||||
public override async UniTask OnOpen(ModalContent content)
|
||||
{
|
||||
await base.OnOpen(content); // 부모의 OnOpen을 먼저 호출해서 기본 UI를 설정해요.
|
||||
if (tabController != null)
|
||||
{
|
||||
var dic = DataMask.DataMasks;
|
||||
foreach (var item in dic)
|
||||
{
|
||||
Debug.Log($"Key: {item.Key}, Value: {item.Value}");
|
||||
// 1. TabConfig 설정
|
||||
tabController.AddTabConfig(item.Key, item.Key, "Prefabs/UI/Tab/DisplayDataOrderTabContent", "", item.Key, true);
|
||||
}
|
||||
|
||||
// 2. 컨트롤러 초기화
|
||||
tabController.Initialize();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 모달이 닫힐 때 결과로 반환할 데이터를 돌려줍니다.
|
||||
/// </summary>
|
||||
/// <returns>선택된 UIPlaybackListItemData 또는 null</returns>
|
||||
public override UniTask<object?> GetResult()
|
||||
{
|
||||
return UniTask.FromResult<object?>(null);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모달이 닫힐 때 호출됩니다.
|
||||
/// </summary>
|
||||
public override async UniTask OnClose(ModalContent content)
|
||||
{
|
||||
await UserSetting.SaveToAppData(); // 데이터 마스크를 앱 데이터에 저장합니다.
|
||||
await base.OnClose(content);
|
||||
}
|
||||
|
||||
protected void OnDestroy()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: df5c9d0db54f3ea44aabbd3d2fb0ab79
|
||||
@@ -0,0 +1,133 @@
|
||||
#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)
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
if (draggableList != null)
|
||||
{
|
||||
draggableList.OnOrderChanged -= OnOrderChanged;
|
||||
draggableList.OnChangedItemData -= OnChangedItemData;
|
||||
}
|
||||
}
|
||||
|
||||
public UniTask OnCloseAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class ConfigDataOrderListItemData : ListItemData
|
||||
{
|
||||
public bool isChecked = true;
|
||||
public ConfigDataOrderListItemData(string id, string displayName, bool isChecked) : base(id, displayName)
|
||||
{
|
||||
this.isChecked = isChecked;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: becc16f6515e3754096794d3dda2c81c
|
||||
@@ -0,0 +1,42 @@
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UVC.Data;
|
||||
using UVC.Data.Core;
|
||||
using UVC.UI.Tab;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class DisplaySettingTabContent: MonoBehaviour, ITabContent
|
||||
{
|
||||
[SerializeField]
|
||||
public TabController tabController; // 탭 컨트롤러
|
||||
|
||||
|
||||
public void SetContentData(object? data)
|
||||
{
|
||||
if (tabController != null)
|
||||
{
|
||||
var dic = DataMask.DataMasks;
|
||||
foreach (var item in dic)
|
||||
{
|
||||
Debug.Log($"Key: {item.Key}, Value: {item.Value}");
|
||||
// 1. TabConfig 설정
|
||||
tabController.AddTabConfig(item.Key, item.Key, "Prefabs/UI/Modal/Setting/DisplayDataOrderTabContent", "", item.Key, true);
|
||||
}
|
||||
|
||||
// 2. 컨트롤러 초기화
|
||||
tabController.Initialize();
|
||||
}
|
||||
}
|
||||
|
||||
public async UniTask OnCloseAsync()
|
||||
{
|
||||
await UserSetting.SaveToAppData(); // 데이터 마스크를 앱 데이터에 저장합니다.
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 29601c9ca05a68547be502ea74d3e2d4
|
||||
@@ -0,0 +1,29 @@
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UVC.UI.Tab;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
/// <summary>
|
||||
/// 설정 모달의 일반 정보 탭 콘텐츠를 표시하는 컴포넌트입니다.
|
||||
/// </summary>
|
||||
public class GeneralInfoTabContent : MonoBehaviour, ITabContent
|
||||
{
|
||||
[SerializeField]
|
||||
private TextMeshProUGUI text;
|
||||
|
||||
public void SetContentData(object? data)
|
||||
{
|
||||
Debug.Log("GeneralInfoTabContent: SetContentData called");
|
||||
text.text = $"Version: {Application.version}";
|
||||
}
|
||||
|
||||
public UniTask OnCloseAsync()
|
||||
{
|
||||
Debug.Log("GeneralInfoTabContent: OnClose called");
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 80fbf6f993a6f7e4a8d10c845fb4627b
|
||||
@@ -0,0 +1,21 @@
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UVC.UI.Tab;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class InputSettingTabContent : MonoBehaviour, ITabContent
|
||||
{
|
||||
|
||||
public void SetContentData(object? data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public UniTask OnCloseAsync()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: faa1e60d74e7bd342a44792cac36e576
|
||||
47
Assets/Scripts/UVC/Factory/Modal/Settings/SettingModal.cs
Normal file
47
Assets/Scripts/UVC/Factory/Modal/Settings/SettingModal.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
#nullable enable
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UVC.Data.Core;
|
||||
using UVC.UI.Modal;
|
||||
using UVC.UI.Tab;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class SettingModal : ModalView
|
||||
{
|
||||
[SerializeField]
|
||||
protected TabController? tabController;
|
||||
|
||||
/// <summary>
|
||||
/// 모달이 열릴 때 호출됩니다. (비동기)
|
||||
/// </summary>
|
||||
/// <param name="content">모달에 표시할 내용/설정</param>
|
||||
public override async UniTask OnOpen(ModalContent content)
|
||||
{
|
||||
await base.OnOpen(content); // 부모의 OnOpen을 먼저 호출해서 기본 UI를 설정해요.
|
||||
if (tabController != null)
|
||||
{
|
||||
// 코드로 탭 설정하기
|
||||
SetupTabs();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void SetupTabs()
|
||||
{
|
||||
// 1. TabConfig 설정
|
||||
tabController?.AddTabConfig("GeneralInfo", "일반 정보", "Prefabs/UI/Modal/Setting/GeneralInfoTabContent", "Prefabs/UI/images/icon_info", null, true);
|
||||
tabController?.AddTabConfig("DisplaySetting", "표시 설정", "Prefabs/UI/Modal/Setting/DisplaySettingTabContent", "Prefabs/UI/images/icon_eye", null, true);
|
||||
tabController?.AddTabConfig("AlarmSetting", "알람 설정", "Prefabs/UI/Modal/Setting/AlarmSettingTabContent", "Prefabs/UI/images/icon_alarm", null, true);
|
||||
tabController?.AddTabConfig("InputSetting", "입력 설정", "Prefabs/UI/Modal/Setting/InputSettingTabContent", "Prefabs/UI/images/icon_mouse", null, true);
|
||||
|
||||
// 2. 컨트롤러 초기화
|
||||
tabController?.Initialize();
|
||||
|
||||
tabController.OnTabChanged += (index) =>
|
||||
{
|
||||
Debug.Log($"탭이 변경되었습니다: {index}");
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d704b4006b448124e856f25c87127459
|
||||
@@ -0,0 +1,21 @@
|
||||
#nullable enable
|
||||
using UVC.UI.Commands;
|
||||
using UVC.UI.Commands.Mono;
|
||||
using UVC.UI.Modal;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class SettingOpenCommand : ICommand
|
||||
{
|
||||
public async void Execute(object? parameter = null)
|
||||
{
|
||||
FactoryCameraController.Instance.Enable = false; // 카메라 컨트롤러 비활성화
|
||||
var modalContent = new ModalContent("Prefabs/UI/Modal/SettingModal")
|
||||
{
|
||||
Title = "설정 카테고리"
|
||||
};
|
||||
await UVC.UI.Modal.Modal.Open<object>(modalContent);
|
||||
FactoryCameraController.Instance.Enable = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c07a218cc2d93974eb835e945162791d
|
||||
@@ -0,0 +1,13 @@
|
||||
using UVC.UI.Commands.Mono;
|
||||
|
||||
namespace UVC.Factory.Modal.Settings
|
||||
{
|
||||
public class SettingOpenCommandMono : MonoBehaviourCommand
|
||||
{
|
||||
public override void Execute()
|
||||
{
|
||||
var command = new SettingOpenCommand();
|
||||
command.Execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5d423a9dfc5026744932396f61861380
|
||||
Reference in New Issue
Block a user