using Newtonsoft.Json; using Studio.UVC.UI; using System; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; using XRLib; using XRLib.UI; namespace Studio { public class Panel_DataConnectModal : PanelBase { public Data api; public Data dataStorage; private List apiDatas = new List(); private List dataStorageDatas = new List(); private bool isAPI; public Toggle Toggle_Api; public Toggle Toggle_Storage; public UVCDropDown Dropdown_DataList; public Button Button_Cancel; public Button Button_Save; private RectTransform RectTransform_APIData; private RectTransform AddStorageDataButtonArea; private RectTransform APIDataListContent; private RectTransform APIContent; private Button Button_loadAPIData; private Button Button_AddStorageData; private DataClass loadAPIData; private List currentAPIDataItems = new List(); private RectTransform RectTransform_DataStorage; private RectTransform DataStorageContent; private RectTransform AddAPIDataButtonArea; private Button Button_AddAPIData; private Toggle Toggle_limitStorageSetting; private UI_LoadDataHierarchyItem prf_loadDataHierarchyItem; private UI_DataSettingItem prf_DataSettingItem; private UI_DataTypeSelectedItem prf_DataTypeSelectedItem; private UI_MatchingTypeDataItem prf_MatchingTypeDataItem; private UI_AddOtherDataItem prf_AddOtherDataItem; private UI_AddOtherDataTypeItem prf_AddOtherDataTypeItem; private RectTransform currentContent; private RectTransform currentButtonArea; public UI_DataSettingItem currentDataSettingItem; public List currentAddOtherDataItems = new List(); private string currentDataListOptionName; private DataClass currentClass; public Action onSaveConnectedData; private void TestDataConnected() { var apiJson = Resources.Load("Test").text; api = JsonConvert.DeserializeObject(apiJson); var dataStorageJson = Resources.Load("Test1").text; dataStorage = JsonConvert.DeserializeObject(dataStorageJson); } public override void AfterAwake() { TestDataConnected(); prf_loadDataHierarchyItem = Resources.Load("Prefabs/UI/PRF_LoadDataHierarchyItem"); prf_DataSettingItem = Resources.Load("Prefabs/UI/PRF_DataSettingItem"); prf_DataTypeSelectedItem = Resources.Load("Prefabs/UI/PRF_DataTypeSelectedItem"); prf_MatchingTypeDataItem = Resources.Load("Prefabs/UI/PRF_MatchingTypeDataItem"); prf_AddOtherDataItem = Resources.Load("Prefabs/UI/PRF_AddOtherDataItem"); prf_AddOtherDataTypeItem = Resources.Load("Prefabs/UI/PRF_AddOtherDataTypeItem"); Dropdown_DataList = GetComponentInChildren(); Toggle_Api.onValueChanged.AddListener(OnAPIToggleValueChanged); Toggle_Storage.onValueChanged.AddListener(OnDataStorageToggleValueChanged); Toggle_limitStorageSetting.onValueChanged.AddListener(OnLimitStorageSettingToggleValueChanged); Button_loadAPIData.onClick.AddListener(LoadAPIData); Button_AddStorageData.onClick.AddListener(() => AddOtherDataItem(null)); Button_AddAPIData.onClick.AddListener(() => AddOtherDataItem(null)); Button_Cancel.onClick.AddListener(CloseModal); Button_Save.onClick.AddListener(Save); RectTransform_APIData.gameObject.SetActive(false); RectTransform_DataStorage.gameObject.SetActive(false); } private void OnAPIToggleValueChanged(bool isOn) { if (isOn) { RectTransform_APIData.gameObject.SetActive(true); ChangePanel(APIContent, AddStorageDataButtonArea); isAPI = true; PopulateDataListDropdown(api.dataList); Toggle_Storage.isOn = false; Toggle_limitStorageSetting.isOn = true; } else { RectTransform_APIData.gameObject.SetActive(false); } } private void OnDataStorageToggleValueChanged(bool isOn) { if (isOn) { RectTransform_DataStorage.gameObject.SetActive(true); ChangePanel(DataStorageContent, AddAPIDataButtonArea); isAPI = false; PopulateDataListDropdown(dataStorage.dataList); Toggle_Api.isOn = false; Toggle_limitStorageSetting.isOn = false; } else { RectTransform_DataStorage.gameObject.SetActive(false); } } private void ChangePanel(RectTransform dataContent, RectTransform buttonArea) { currentContent = dataContent; currentButtonArea = buttonArea; currentDataSettingItem = currentContent.GetComponentInChildren(); currentAddOtherDataItems.Clear(); var currentAddOtherDataItem = currentContent.GetComponentsInChildren().ToList(); currentAddOtherDataItems.AddRange(currentAddOtherDataItem); } private void OnLimitStorageSettingToggleValueChanged(bool isOn) { var isActive = isOn; DataStorageContent.gameObject.SetActive(isActive); } private void PopulateDataListDropdown(List data) { Dropdown_DataList.Init(); List displayNames = new List(); if (isAPI) { apiDatas.Clear(); foreach (var api in data) { apiDatas.Add(api); displayNames.Add(api.name); } Dropdown_DataList.SetOptions(displayNames); Dropdown_DataList.DropDown.onValueChanged.RemoveAllListeners(); Dropdown_DataList.DropDown.onValueChanged.AddListener(OnValueChangedAPIDropDown); var notCheckIndex = currentDataListOptionName != null ? displayNames.IndexOf(currentDataListOptionName) : 0; var index = notCheckIndex >= 0 ? notCheckIndex : 0; Dropdown_DataList.DropDown.SetValueWithoutNotify(index); SetLoadApiData(index); } else { dataStorageDatas.Clear(); foreach (var storageData in data) { dataStorageDatas.Add(storageData); displayNames.Add(storageData.name); } Dropdown_DataList.SetOptions(displayNames); Dropdown_DataList.DropDown.onValueChanged.RemoveAllListeners(); Dropdown_DataList.DropDown.onValueChanged.AddListener(OnValueChangedDataStorageDropDown); var notCheckIndex = currentDataListOptionName != null ? displayNames.IndexOf(currentDataListOptionName) : 0; var index = notCheckIndex >= 0 ? notCheckIndex : 0; Dropdown_DataList.DropDown.SetValueWithoutNotify(index); OnValueChangedDataStorageDropDown(index); } } private void OnValueChangedAPIDropDown(int index) { SetLoadApiData(index); } private void SetLoadApiData(int index) { var apiData = apiDatas[index]; loadAPIData = apiData; } void LoadAPIData() { foreach (var dataItem in currentAPIDataItems) Destroy(dataItem.gameObject); currentAPIDataItems.Clear(); var item = Instantiate(prf_loadDataHierarchyItem, APIDataListContent); item.SetData(loadAPIData); item.onClickItem += OnClickAPIDataItem; currentAPIDataItems.Add(item); } private void OnClickAPIDataItem(DataClass data) { AddDataSettingItem(data); } private void OnValueChangedDataStorageDropDown(int index) { AddDataSettingItem(dataStorageDatas[index]); } private void UpdateLayout() { LayoutRebuilder.ForceRebuildLayoutImmediate(currentContent); } private void AddDataSettingItem(DataClass data) { if (currentDataSettingItem != null) { Destroy(currentDataSettingItem.gameObject); currentDataSettingItem = null; } var item = Instantiate(prf_DataSettingItem, currentContent); var index = currentButtonArea.transform.GetSiblingIndex(); item.transform.SetSiblingIndex(index); item.SetData(data, prf_DataTypeSelectedItem, prf_MatchingTypeDataItem); item.onUpdateLayout += UpdateLayout; currentDataSettingItem = item; } private void AddOtherDataItem(DataClass data) { var item = Instantiate(prf_AddOtherDataItem, currentContent); item.onUpdateLayout += UpdateLayout; item.onDestory += RemoveOtherDataItem; item.SetItem(dataStorage.dataList, data, prf_AddOtherDataTypeItem); item.transform.SetAsLastSibling(); currentAddOtherDataItems.Add(item); } private void RemoveOtherDataItem(UI_AddOtherDataItem item) { currentAddOtherDataItems.Remove(item); Destroy(item.gameObject); } public SaveConnectedData saveData; void Save() { saveData = GetData(); onSaveConnectedData?.Invoke(saveData.dataSource, saveData); Initialize(); gameObject.SetActive(false); } public void OpenModal() { gameObject.SetActive(true); } void CloseModal() { gameObject.SetActive(false); } private void Initialize() { Toggle_Api.SetIsOnWithoutNotify(false); Toggle_Storage.SetIsOnWithoutNotify(false); Toggle_limitStorageSetting.SetIsOnWithoutNotify(false); currentContent = null; currentButtonArea = null; loadAPIData = null; foreach (var item in currentAPIDataItems) { Destroy(item.gameObject); } currentAPIDataItems.Clear(); if (currentDataSettingItem != null) { Destroy(currentDataSettingItem.gameObject); currentDataSettingItem = null; } foreach (var item in currentAddOtherDataItems) { Destroy(item.gameObject); } currentAddOtherDataItems.Clear(); RectTransform_APIData.gameObject.SetActive(false); RectTransform_DataStorage.gameObject.SetActive(false); } private SaveConnectedData GetData() { SaveConnectedData saveData = new SaveConnectedData(); saveData.connectDataClass.Clear(); saveData.otherDataClasses.Clear(); saveData.isAPI = isAPI; saveData.dataListOptionName = Dropdown_DataList.GetSelectOptionName(); saveData.isLimitStorageSetting = Toggle_limitStorageSetting.isOn; var dataclass = currentDataSettingItem.GetData(); saveData.dataSource = dataclass.name; saveData.connectDataClass.Add(dataclass); foreach (var item in currentAddOtherDataItems) { var otehrDataClass = item.GetData(); saveData.otherDataClasses.Add(otehrDataClass); } return saveData; } public void SetLoadSaveData(SaveConnectedData saveData) { OpenModal(); currentClass = saveData.connectDataClass[0]; currentDataListOptionName = saveData.dataListOptionName; if (saveData.isAPI) { Toggle_Api.isOn = true; LoadAPIData(); } else { Toggle_Storage.isOn = true; Toggle_limitStorageSetting.isOn = !saveData.isLimitStorageSetting; Toggle_limitStorageSetting.isOn = saveData.isLimitStorageSetting; } AddDataSettingItem(currentClass); foreach (var item in currentAddOtherDataItems) { Destroy(item.gameObject); } currentAddOtherDataItems.Clear(); foreach (var otherClass in saveData.otherDataClasses) { AddOtherDataItem(otherClass); } } } }